linux_namespaces

Linux Namespaces

리눅스 네임스페이스는 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능입니다. 한 시스템의 프로세스들은 기본적으로 시스템의 리소스들을 공유해서 실행됩니다. 이를 단일 네임스페이스라고 생각해볼 수 있습니다. 실제로 리눅스에서는 1번 프로세스(init)에 할당되어있는 네임스페이스들을 자식 프로세스들이 모두 공유해서 사용하는 구조로 이루어져있습니다.

/prod/<PID>/ns 디렉터리에서 현재 프로세스에서 사용하고 있는 네임스페이스의 고유 ID를 확인하는 것이 가능합니다.

$ ls -al /proc/1/ns
total 0
dr-x--x--x 2 root root 0 Jan 31 03:47 .
dr-xr-xr-x 9 root root 0 Jan 24 14:46 ..
lrwxrwxrwx 1 root root 0 Jan 31 03:47 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 net -> 'net:[4026531993]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 31 03:47 uts -> 'uts:[4026531838]'

여러가지 파일이 보입니다만 각각의 파일은 리소스 별 네임스페이스를 의미합니다. 현재 리눅스에서 지원하는 네임스페이스는 크게 보면 다음과 같습니다.

  • Cgroup 네임스페이스(cgorup)
  • IPC 네임스페이스(ipc)
  • 네트워크 네임스페이스(network)
  • 마운트 네임스페이스(mnt)
  • PID 네임스페이스(pid)
  • UTS 네임스페이스(user)
  • 사용자 네임스페이스(uts)
  • 시간 네임스페이스(time)

리눅스에서는 프로세스를 실행할 때 각 네임스페이스 별로 분리해서 실행하는 것이 가능합니다만, 앞에서 설명한대로 기본적으로는 1번 프로세스의 네임스페이스를 공유해서 실행됩니다. 위의 출력 결과 오른편의 4026…으로 시작한 값이 각 네임스페이스 별 고유 아이디입니다. 아무거나 다른 프로세스의 네임스페이스를 확인해보겠습니다.

$ ls -l /proc/1074/ns
total 0
lrwxrwxrwx 1 root root 0 Jan 31 04:08 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 net -> 'net:[4026531993]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 31 04:08 uts -> 'uts:[4026531838]'

눈으로 비교해봐도 알 수 있지만, 네임스페이스 고유값들이 1번 프로세스와 같은 것을 알 수 있습니다. diff를 사용해서 확인해보겠습니다.

$ diff <(ls -Al /proc/1/ns | awk '{ print $11 }')  \
       <(ls -Al /proc/1074/ns | awk '{ print $11 }')

출력결과가 같기 때문에 아무 내용도 출력되지 않습니다.

일반적인 경우 리눅스 네임스페이스를 직접 활용하는 경우는 많지 않습니다만, 네트워크 테스트나 컨테이너 구현에서 활용됩니다. 리눅스 컨테이너는 리눅스 네임스페이스와 루트 파일 시스템 격리 등 리눅스의 다양한 기능을 사용해 격리시킨 프로세스를 의미합니다.

namespace에 대한 man 페이지입니다. man 페이지 아래의 SEE ALSO 절에서 각 네임스페이스 별 매뉴얼을 찾아볼 수 있습니다.

namespaces(7) - Linux manual page

로그인하면 댓글을 남길 수 있습니다.
  • linux_namespaces.txt
  • 마지막으로 수정됨: 2024/08/01 04:12
  • 저자 koov