ㅍㅍㅋㄷ

Linux namespace 본문

IT/Linux

Linux namespace

클쏭 2015. 7. 2. 18:58

Linux namespace 





 namespace 는 하나의 system에서 수행되지만, 각각 별개의 독립된 공간인것 처럼 격리된 환경을 제공하는 lightweight 가상화 기술이다. 최근 Container 기반의 가상화 기술인 Docker나 LXC가 각광을 받고 있는데 모두 namespace를 기반으로 만들어 졌다. 


이러한 namespace 는 기존에 잘 알려진 가상화 기술인 Hypervisor 와는 구조적으로 다르다.


  Hypervisor는 Hardware resource 를 가상화 한다. Hypervisor 위에 올라가는 Guest OS 에는 가상화 된 형태의 H/W 를 제공하게 되며, 따라서 각각의 Guest OS는 완전한 다른 환경으로 분리된다. 하지만 namespace의 경우에는 Hardware resource 레벨의 가상화가 아니다. 동일한 OS와 동일한 kernel 에서 작동하게 되며, 단지 각각의 고립된 사용 환경만 제공되는 것이다.


Linux namespace는 크게 6가지로 분류되어 나뉠수 있다.

( 각 항목을 클릭하면 해당 post 를 볼 수 있음 )


1. UTS namespace : hostname 을 변경하고 분할

2. IPC namespace : Inter-process communication. 프로세스간 통신 격리

3. PID namespace : PID (Process ID)를 분할 관리

4. NS namepsace : file system 의 mount 지점을 분할하여 격리

5. NET namespace : Network interface, iptables 등 network 리소스와 관련된 정보를 분할

6. USER namespace : user와 group ID를 분할 격리



Linux namespace를 구현할 때는, clone() 나 unshare() 또는 setns() 라는 systemcall을 이용하여 만든다. systemcall을 사용할 때는 위 6가지에 해당되는 flag 를 옵션으로 추가하여 생성한다.


/*

 * cloning flags

 */


CLONE_NEWNS       /* New namespace group? */

CLONE_NEWUTS     /* New utsname group? */

CLONE_NEWIPC      /* New ipcs */

CLONE_NEWUSER   /* New user namespace */

CLONE_NEWPID      /* New pid namespace */

CLONE_NEWNET     /* New network namespace */


해당 flag는 /usr/include/linux/sched.h 에 정의되어 있다.


Linux namespace를 생성하는 clone(), unshare(), setns() 에 대한 사용법은 man 페이지에서 자세히 확인 가능하다.


  - clone() : http://linux.die.net/man/2/clone 

#include <sched.h>


int clone(int (*fn) (void *), void *child_stack

                int flags, void *arg, ...

               /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );


- unshare() : http://linux.die.net/man/2/unshare 

#include <sched.h>


int unshare (int flags);


- setns() : http://man7.org/linux/man-pages/man2/setns.2.html

#include <sched.h>


int setns(int fd, int nstype);



namespace가 생성되면 /proc/<pid>/ns 디렉토리에 6개의 inode entry 가 생성된다.


# ls -al /proc/10141/ns/

total 0

dr-x--x--x 2 root root 0 Jul  3 07:12 .

dr-xr-xr-x 9 root root 0 Jul  3 07:12 ..

lrwxrwxrwx 1 root root 0 Jul  3 07:12 ipc -> ipc:[4026531839]

lrwxrwxrwx 1 root root 0 Jul  3 07:12 mnt -> mnt:[4026531840]

lrwxrwxrwx 1 root root 0 Jul  3 07:12 net -> net:[4026531992]

lrwxrwxrwx 1 root root 0 Jul  3 07:12 pid -> pid:[4026531836]

lrwxrwxrwx 1 root root 0 Jul  3 07:12 user -> user:[4026531837]

lrwxrwxrwx 1 root root 0 Jul  3 07:12 uts -> uts:[4026532163]



'IT > Linux' 카테고리의 다른 글

Linux namespace - NET  (4) 2016.05.10
Linux namespace - NS (File System)  (0) 2016.05.04
Linux namespace - PID  (1) 2015.07.14
Linux namespace - IPC  (0) 2015.07.13
Linux namespace - UTS  (2) 2015.07.03
Comments