본문 바로가기

Programming/Linux_Platform

linux namespace

< FS namespace >


각각의 process 가 가지고 있는 mount set

다른 FS namespace 를 가지고 있는 process 는 서로 다른 mount information 을 가지고 있다.

각 process 의 proc 의 ns 에서 FS namespace 를 확인 할 수 있다.


root@klte:/proc/7532 # ls -al  /proc/7939/ns                                   

lrwxrwxrwx bluetooth bluetooth          2015-01-02 11:09 mnt -> mnt:[4026534520]

lrwxrwxrwx bluetooth bluetooth          2015-01-02 11:09 net -> net:[4026533490]

root@klte:/proc/7532 # ls -al /proc/7532/ns

lrwxrwxrwx root     root              2015-01-02 09:35 mnt -> mnt:[4026531840]

lrwxrwxrwx root     root              2015-01-02 09:35 net -> net:[4026533490]


이처럼 FS namespace 가 다르면

proc/[PID]/mounts

에서 조회되는 각 process 마다의 mount 정보도 다르다.


# cat /proc/7532/mounts                                            

rootfs / rootfs ro,seclabel,relatime 0 0

tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0

devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0

proc /proc proc rw,relatime 0 0

sysfs /sys sysfs rw,seclabel,relatime 0 0

selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0

debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0

none /acct cgroup rw,relatime,cpuacct 0 0

none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0

tmpfs /mnt tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0

none /dev/cpuctl cgroup rw,relatime,cpu 0 0

...


 # cat /proc/7939/mounts

rootfs / rootfs ro,seclabel,relatime 0 0

tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0

devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0

none /dev/cpuctl cgroup rw,relatime,cpu 0 0

proc /proc proc rw,relatime 0 0

sysfs /sys sysfs rw,seclabel,relatime 0 0

selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0

debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0

none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0

none /acct cgroup rw,relatime,cpuacct 0 0

tmpfs /mnt tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0

/data/media /mnt/runtime/write/emulated sdcardfs rw,seclabel,nosuid,nodev,noexec,relatime,low_uid=1023,low_gid=1023,gid=9997,multi_user,mask=0007 0 0

....


자세한 이론 설명등은 아래 페이지를 참고


http://bluese05.tistory.com/category/IT/Linux

http://blog.yadutaf.fr/2014/01/12/introduction-to-linux-namespaces-part-4-ns-fs/

http://man7.org/linux/man-pages/man7/namespaces.7.html


clone 이나 fork 할때 CLONE_NEWNS 를 호출 하지 않으면 부모와 같은 mount namespace 를 보게 됨

CLONE_NEWNS 를 clone() 할때 호출되면 child process 는 자신의 mount namespace 를 가지게 되는데 이것은 parect 의 namespace 복사본으로 초기화 되어 있다.


setns(2) : process 의 namespace 를 동적으로 변경할 수 있다.




< UTS namespace >


hostname 역시 각 process 마다 isolate 시킬 수 있다.


여기서 host name 이란 "onegun@onegun-Samsung-Desktop-System" 에서의 뒷 부분을 뜻한다.

아래 두 명령어로 확인이 가능하다.


onegun@change-onegun:~$ hostname

onegun-Samsung-Desktop-System

onegun@change-onegun:~$ uname -n

onegun-Samsung-Desktop-System



sethostname(2); 함수를 사용하면 process 내에서 변경이 가능하고,

shell 에서 간단하게 unshare 라는 command 를 사용해서도 변경이 가능하다.


# unshare


Usage:

 unshare [options] <program> [args...]


Options:

 -h, --help        usage information (this)

 -m, --mount       unshare mounts namespace

 -u, --uts         unshare UTS namespace (hostname etc)

 -i, --ipc         unshare System V IPC namespace

 -n, --net         unshare network namespace


For more information see unshare(1).



unshare 옵션으로 프로그램을 실행시키면, namespace 가 parent 와 share 되지 않은 상태로 process 가 생성된다.

여기서 -m option 이 위에 설명했던 FS namespace 를 isolate 시키는옵션이고

-u 가 hostname 을 isolate 시키는 옵션이다.


unshare -u /bin/bash

를 하면 hostname 이 분리된 새로운 shell 이 실행되게 된다.


hostname [new name] 은 host name 을 변경시키는 명령어 이다.

만약 내가 아래와 같이 입력하고,

root@onegun-Samsung-Desktop-System:~#hostname new-shell-name

새로운 shell 을 open 하면

root@new-shell-name:~#

으로 접속이 된다.



하지만, unshare -u /bin/bash 을 입력 한 후에

root@onegun-Samsung-Desktop-System:~#hostname new-shell-name

을 하면 새롭게 open 된 /bin/bash 의 namespace 만 변경되고, global hostname 에는 영향을 미치지 않게 된다.


이 상태에서 각 bash shell 의 uts 를 보면 서로 다른 uts namespace 를 사용하고 있음을 알 수 있다.


root@change-onegun:~# ps | grep bash

30982 pts/23   00:00:00 bash

30994 pts/23   00:00:00 bash

root@change-onegun:~# ls -al /proc/30994/ns

total 0

dr-x--x--x 2 root root 0 10월 14 15:59 .

dr-xr-xr-x 9 root root 0 10월 14 15:58 ..

lrwxrwxrwx 1 root root 0 10월 14 15:59 ipc -> ipc:[4026531839]

lrwxrwxrwx 1 root root 0 10월 14 15:59 mnt -> mnt:[4026531840]

lrwxrwxrwx 1 root root 0 10월 14 15:59 net -> net:[4026531956]

lrwxrwxrwx 1 root root 0 10월 14 15:59 pid -> pid:[4026531836]

lrwxrwxrwx 1 root root 0 10월 14 15:59 user -> user:[4026531837]

lrwxrwxrwx 1 root root 0 10월 14 15:59 uts -> uts:[4026532284]

root@change-onegun:~# ls -al /proc/30982/ns

total 0

dr-x--x--x 2 root root 0 10월 14 15:59 .

dr-xr-xr-x 9 root root 0 10월 14 15:56 ..

lrwxrwxrwx 1 root root 0 10월 14 15:59 ipc -> ipc:[4026531839]

lrwxrwxrwx 1 root root 0 10월 14 15:59 mnt -> mnt:[4026531840]

lrwxrwxrwx 1 root root 0 10월 14 15:59 net -> net:[4026531956]

lrwxrwxrwx 1 root root 0 10월 14 15:59 pid -> pid:[4026531836]

lrwxrwxrwx 1 root root 0 10월 14 15:59 user -> user:[4026531837]

lrwxrwxrwx 1 root root 0 10월 14 15:59 uts -> uts:[4026531838]









'Programming > Linux_Platform' 카테고리의 다른 글

linux signals  (0) 2015.10.19
linux stand out 을 file 에 logging 하기  (0) 2015.10.19
Android log command, logwrapper  (0) 2015.09.30
logcat 사용법 정리  (0) 2015.09.30
wrtie 비교 O_DIRECT and no-delay-alloc mount option  (0) 2014.08.04