리눅스

리눅스 namespace

@xftg77g 2022. 9. 30. 17:50

기본 개념

namespace는 하나의 system에서 수행되지만, 각각 별개의 독립된 공간인 것 처럼 격리된 환경을 제공하는 lightweight 가상화 기술입니다. 최근 유명한 Container 가상화 기술인 Docker나 LXC의 기반이 되는 기술입니다.

 

namespace는 Hardware resource 레벨의 가상화가 아니고, 단지 각각의 고립된 환경만 제공하는 기술입니다.

 

Linux에서 namespace는 6가지로 분류됩니다.

 

  1. UTS namespace
  2. IPC namespace
  3. PID namespace
  4. NS namespace
  5. NET namespace
  6. 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

 

clone(2) - Linux manual page

clone(2) — Linux manual page CLONE(2) Linux Programmer's Manual CLONE(2) NAME         top clone, __clone2, clone3 - create a child process SYNOPSIS         top /* Prototype for the glibc wrapper function */ #define _GNU_SOURCE #include int clone(

man7.org

https://man7.org/linux/man-pages/man2/unshare.2.html

 

unshare(2) - Linux manual page

unshare(2) — Linux manual page UNSHARE(2) Linux Programmer's Manual UNSHARE(2) NAME         top unshare - disassociate parts of the process execution context SYNOPSIS         top #define _GNU_SOURCE #include int unshare(int flags); DESCRIPTION  

man7.org

https://man7.org/linux/man-pages/man2/setns.2.html

 

setns(2) - Linux manual page

setns(2) — Linux manual page SETNS(2) Linux Programmer's Manual SETNS(2) NAME         top setns - reassociate thread with a namespace SYNOPSIS         top #define _GNU_SOURCE /* See feature_test_macros(7) */ #include int setns(int fd, int nstype)

man7.org

 

 

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

 

Linux namespace

Linux namespace [Contents] 1. Linux namespace 2. Linux namespace - UTS 3. Linux namespace - IPC 4. Linux namespace - PID 5. Linux namespace - NS(File System) 6. Linux namespace - NET  namespace 는..

bluese05.tistory.com