일반적인 경우 리눅스 네임스페이스를 직접 활용하는 경우는 많지 않습니다만, 네트워크 테스트나 컨테이너 구현에서 활용됩니다.
리눅스 컨테이너는 리눅스 네임스페이스와 루트 파일 시스템 격리 등 리눅스의 다양한 기능을 사용해 격리시킨 프로세스를 의미합니다.
네임스페이스는 전역 시스템 리소스를 추상화로 감싸고, 이 추상화는 전역 리소스의 고유한 분리된 인스턴스가 있는 네임스페이스 내의 프로세스에 표시합니다.
글로벌 리소스에 대한 변경 내용은 네임스페이스의 구성원인 다른 프로세스에는 표시되지 않지만 다른 프로세스에는 표시되지 않습니다.
네임스페이스의 한 가지 용도는 컨테이너를 구현하는 것입니다.
리눅스의 namespace 는 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능을 합니다.
한 시스템의 프로세스들은 기본적으로 시스템의 리소스를 공유해서 실행됩니다.
리눅스에서 1번 프로세스로 할당되어 있는 namespace들을 자식 프로세스들이 모두 공유해서 사용하는 구조로 이루어져 있습니다.
/prod//ns 디렉터리에서 현재 프로세스에서 사용하고 있는 네임스페이스의 고유 ID를 확인하는 것이 가능합니다.
# 각 리소스 별 namespace
ubuntu@DESKTOP-xxxx:~$ sudo ls -al /proc/1/ns
total 0
dr-x--x--x 2 root root 0 Jun 2 09:48 .
dr-xr-xr-x 9 root root 0 Jun 2 09:48 ..
lrwxrwxrwx 1 root root 0 Jun 2 09:48 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 ipc -> 'ipc:[4026532187]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 mnt -> 'mnt:[4026532185]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 pid -> 'pid:[4026532188]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 pid_for_children -> 'pid:[4026532188]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jun 2 09:48 uts -> 'uts:[4026532186]'
API | Description |
---|---|
unshare(2) | unshare(2) 시스템 호출은 호출 프로세스를 새 네임스페이스로 이동합니다. 호출의 플래그 인수가 아래에 나열된 CLONE_NEW* 플래그 중 하나 이상을 지정하면 각 플래그에 대해 새 네임스페이스가 생성되고 호출 프로세스가 해당 네임스페이스의 멤버로 설정됩니다. (이 시스템 호출은 네임스페이스와 관련이 없는 여러 기능을 구현하기도 합니다.) |
setns(2) | setns(2) 시스템 호출을 통해 호출 프로세스가 기존 네임스페이스에 가입할 수 있습니다. 조인할 네임스페이스는 아래에 설명된 /proc/[pid]/ns 파일 중 하나를 참조하는 파일 설명자를 통해 지정됩니다. |
ioctl(2) | 네임스페이스에 대한 정보를 검색하는 데 다양한 ioctl(2) 작업을 사용할 수 있습니다. |
clone(2) | clone(2) 시스템 호출이 새 프로세스를 생성합니다. 호출의 플래그 인수가 아래에 나열된 CLONE_NEW* 플래그 중 하나 이상을 지정하면 각 플래그에 대해 새 네임스페이스가 생성되고 하위 프로세스가 해당 네임스페이스의 멤버로 설정됩니다. (이 시스템 호출은 네임스페이스와 관련이 없는 여러 기능을 구현하기도 합니다.) |
대부분의 경우 clone(2) 및 unshare(2)를 사용하여 새 네임스페이스를 생성하려면 CAP_이 필요합니다.
SYS_ADMIN 기능은 새 namespace에서 생성자가 이후에 생성된 다른 프로세스에 표시되는 글로벌 리소스를 변경하거나 네임스페이스에 가입할 수 있는 권한을 가지기 때문입니다.
user namespace는 예외입니다.
Linux 3.8부터는 user namespace를만드는 데 권한이 필요하지 않습니다.
Namespace | Flag | Page | Isolates | |
---|---|---|---|---|
1 | Cgroup | CLONE_NEWCGROUP | cgroup_namespaces | Cgroup root directory |
2 | IPC | CLONE_NEWIPC | ipc_namespaces | System V IPC POSIX message queues |
3 | Network | CLONE_NEWNET | network_namespaces | Network devices stacks ports etc... |
4 | Mount | CLONE_NEWNS | mount_namespaces | Mount points |
5 | PID | CLONE_NEWPID | pid_namespaces | Process IDs |
6 | Time | CLONE_NEWTIME | time_namespaces | Boot and monotonic clocks |
7 | User | CLONE_NEWUSER | user_namespaces | User and group IDs |
8 | UTS | CLONE_NEWUTS | uts_namespaces | Hostname and NIS domain name |
PID 네임스페이스는 프로세스의 ID를 격리할 수 있는 네임스페이스입니다.
리눅스에서 PID는 init 프로세스 1을 시작하며 그 외에 모든 프로세스는 항상 1보다 큰 PID를 부여받습니다.
PID 네임스페이스를 분리하면 PID가 다시 1부터 시작합니다.
단, 이 프로세스는 디폴트 네임스페이스와 분리된 PID 네임스페이스에 동시에 속하게 되며, 분리된 새로운 네임스페이스에서는 PID가 1부터 시작합니다.
하지만 디폴트 네임스페이스 관점에서는 1보다 큰 어떤 값을 PID로 가지게 됩니다.
네트워크 네임스페이스는 프로세스의 네트워크 환경을 분리할 수 있는 네임스페이스입니다.
네트워크 환경을 분리하면 네임스페이스에 속한 프로세스들에 새로운 IP를 부여하거나 네트워크 인터페이스를 추가하는 것이 가능합니다.
네트워크 네임스페이스는 ip 명령어로 조작할 수 있습니다.
UTS 네임스페이스는 호스트 네임과 NIS 도메인 이름을 격리하는 네임스페이스입니다.
네트워크 네임스페이스와 함께 네트워크를 격리하는 용도로 사용됩니다.