Container 기반 기술: Namespace

김태호·2022년 5월 4일
0

Docker

목록 보기
4/4

Namespace Overview

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

man page 설명

네임스페이스는 전역 시스템 리소스를 추상화로 감싸고, 이 추상화는 전역 리소스의 고유한 분리된 인스턴스가 있는 네임스페이스 내의 프로세스에 표시합니다.
글로벌 리소스에 대한 변경 내용은 네임스페이스의 구성원인 다른 프로세스에는 표시되지 않지만 다른 프로세스에는 표시되지 않습니다.
네임스페이스의 한 가지 용도는 컨테이너를 구현하는 것입니다.

리눅스의 namespace 는 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능을 합니다.
한 시스템의 프로세스들은 기본적으로 시스템의 리소스를 공유해서 실행됩니다.
리눅스에서 1번 프로세스로 할당되어 있는 namespace들을 자식 프로세스들이 모두 공유해서 사용하는 구조로 이루어져 있습니다.

WSL (Ubuntu 20.04)

/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]'

The namespace API

APIDescription
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를만드는 데 권한이 필요하지 않습니다.

The namespace Flag

NamespaceFlagPageIsolates
1CgroupCLONE_NEWCGROUPcgroup_namespacesCgroup root directory
2IPCCLONE_NEWIPCipc_namespacesSystem V IPC
POSIX message queues
3NetworkCLONE_NEWNETnetwork_namespacesNetwork devices
stacks
ports
etc...
4MountCLONE_NEWNSmount_namespacesMount points
5PIDCLONE_NEWPIDpid_namespacesProcess IDs
6TimeCLONE_NEWTIMEtime_namespacesBoot and monotonic clocks
7UserCLONE_NEWUSERuser_namespacesUser and group IDs
8UTSCLONE_NEWUTSuts_namespacesHostname and NIS domain name

Namespace 종류

PID namespace

PID 네임스페이스는 프로세스의 ID를 격리할 수 있는 네임스페이스입니다.

리눅스에서 PID는 init 프로세스 1을 시작하며 그 외에 모든 프로세스는 항상 1보다 큰 PID를 부여받습니다.

PID 네임스페이스를 분리하면 PID가 다시 1부터 시작합니다.

단, 이 프로세스는 디폴트 네임스페이스와 분리된 PID 네임스페이스에 동시에 속하게 되며, 분리된 새로운 네임스페이스에서는 PID가 1부터 시작합니다.

하지만 디폴트 네임스페이스 관점에서는 1보다 큰 어떤 값을 PID로 가지게 됩니다.

Network namespace

네트워크 네임스페이스는 프로세스의 네트워크 환경을 분리할 수 있는 네임스페이스입니다.

네트워크 환경을 분리하면 네임스페이스에 속한 프로세스들에 새로운 IP를 부여하거나 네트워크 인터페이스를 추가하는 것이 가능합니다.

네트워크 네임스페이스는 ip 명령어로 조작할 수 있습니다.

UTS namespace

UTS 네임스페이스는 호스트 네임과 NIS 도메인 이름을 격리하는 네임스페이스입니다.

네트워크 네임스페이스와 함께 네트워크를 격리하는 용도로 사용됩니다.

참고

  1. Linux Namespace - https://man7.org/linux/man-pages/man7/namespaces.7.html
  2. Linux Container - https://www.redhat.com/ko/topics/containers/whats-a-linux-container
profile
신입 모바일 개발자 입니다!

0개의 댓글