기본 개념
namespace는 하나의 system에서 수행되지만, 각각 별개의 독립된 공간인 것 처럼 격리된 환경을 제공하는 lightweight 가상화 기술입니다. 최근 유명한 Container 가상화 기술인 Docker나 LXC의 기반이 되는 기술입니다.
namespace는 Hardware resource 레벨의 가상화가 아니고, 단지 각각의 고립된 환경만 제공하는 기술입니다.
Linux에서 namespace는 6가지로 분류됩니다.
- UTS namespace
- IPC namespace
- PID namespace
- NS namespace
- NET namespace
- USER namespace
namespace 구현하기
Linux에서 namespace를 구현할 때는, clone()이나 unshare() 또는 setns()라는 systemcall을 이용합니다. systemcall을 사용할 때는 6가지 namespace 중 해당되는 flag를 옵션으로 추가합니다.
(flag와 clone(), unshare(), setns()는 sched.h에 정의되어 있고 sched.h는 find / -name sched.h로 찾을 수 있습니다)
// 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
https://man7.org/linux/man-pages/man2/clone.2.html
https://man7.org/linux/man-pages/man2/unshare.2.html
https://man7.org/linux/man-pages/man2/setns.2.html
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]
Ref
https://bluese05.tistory.com/11
'리눅스' 카테고리의 다른 글
리눅스 IPC namespace (0) | 2022.10.02 |
---|---|
리눅스 UTS namespace (0) | 2022.10.01 |
리눅스 Cgroup (0) | 2022.09.30 |
리눅스 chroot (0) | 2022.09.29 |
리눅스 하드웨어 용량 확인 및 swap 메모리 확보 (0) | 2022.08.19 |