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 절에서 각 네임스페이스 별 매뉴얼을 찾아볼 수 있습니다.