리눅스 네임스페이스
-
네임스페이스: 하나의 시스템에서 수행되지만, 각각 별개의 독립된 공간인 것처럼 격리된 환경을 제공하는
경량 프로세스(쓰레드)
가상화 기술- Definition
The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. 각 네임스페이스의 목적은 특정 전반적인(global) 시스템 자원을 추상화하여 네임스페이스 안에 있는 프로세스들이 그들 자신만의 격리된 자원(global resource)의 인스턴스를 갖는 것처럼 보이게 하는 것이다.
- 네임스페이스의 목적 중 하나는 컨테이너의 구현을 돕는 것이다. 컨테이너는 경량 가상화를 위한 툴이고 프로세스 그룹에게 그들(프로세스 그룹)이 시스템에서 유일한 프로세스들이라는 환상을 제공한다.
-
리눅스 네임스페이스 구현 시
unshare()
,setns()
시스템 콜 사용 -
6개의 상수 플래그를
clone()
,unshare()
,setns()
시스템 콜에 전달해 수행-
unshare()
: 현재 프로세스를 새로 지정된 네임스페이스에 연결 -
setns()
: 이미 존재하는 네임스페이스에 프로세스 연결 -
LXC
에서 사용하는 6개의 네임스페이스- 마운트 네임스페이스:
CLONE_NEWNS
- UTS 네임스페이스:
CLONE_NEWUTS
- IPC 네임스페이스:
CLONE_NEWIPC
- PID 네임스페이스:
CLONE_NEWPID
- 사용자 네임스페이스:
CLONE_NEWUSER
- 네트워크 네임스페이스:
CLONE_NEWNET
- 마운트 네임스페이스:
-
마운트 네임스페이스(= NS Namespace)
- 프로세스와 그 자식 프로세스가 각기 다른 파일시스템 마운트 지점을 제공
- 기본적으로 모든 프로세스는 동일한 기본 네임스페이스를 공유
-
예를 들어,
clone()
시스템 콜을 통해 프로세스를 생성할 때CLONE_NEWNS
플래그가 전달되면, 새로 생성되는 프로세스는호출한 프로세스가 갖고 있는 마운트 트리의 사본
을 가져옴.- 이 시점부터 기본 네임스페이스의 모든 파일시스템 마운트 및 마운트 해제는 새로운 네임스페이스에서 볼 수 있지만, 각각의 프로세스별 마운트 네임스페이스 내부에서의 변경은 해당 프로세스의 네임스페이스 밖에서는 알 수 없다.
-
실습
-
터미널 열고 다음과 같이 /tmp 아래 mount_ns 디렉토리 생성
jiyong@com:~# mkdir /tmp/mount_ns
-
mount 플래그를
unshared
시스템 콜에게 전달해 현재 bash 프로세스를 자체 마운트 네임스페이스로 이동jiyong@com:~# unshare -m /bin/bash
-
지금부터 bash 프로세스가 별도의 네임스페이스에 존재조금 복잡한데 결국 부모 프로세스는 자식 프로세스의 마운트 포인트 리스트를 볼 수 없다. 대신 자식은 부모의 마운트 포인트 리스트를 볼 수 있다..
readlink
명령을 이요해 네임스페이스의 관련 inode 번호를 확인.jiyong@com:~# readlink /proc/$$/ns/mnt mnt:[4026532211] # inode 번호
-
임시 마운트 지점을 만들어 /tmp/mount_ns에 마운트시킨다.
jiyong@com:~# mount -n -t tmpfs tmpfs /tmp/mount_ns
-
새로 만든 네임스페이스에서 마운트 지점을 볼 수 있는지 확인
jiyong@com:~# df -h | grep mount_ns tmpfs 7.8G 0 7.8G 0% /tmp/mount_ns jiyong@com:~# cat /proc/mounts | grep mount_ns tmpfs /tmp/mount_ns tmpfs rw,relatime 0 0
- 마운트 지점은 우리가 생성한 네임스페이스의 일부이고, 현재의 bash 프로세스는 우리가 생성한 네임스페이스로부터 실행됐기 때문에 해당 마운트 지점을 볼 수 있다.
-
새로운 터미널을 열고, 해당 터미널 세션에서 네임스페이스의 inode ID를 확인해보자.
jiyong@com:~# readlink /proc/$$/ns/mnt mnt:[4026531840]
- 다른 터미널의 마운트 네임스페이스와 inode ID가 다르다는 것을 확인할 수 있다.
-
4단계에서 마운트한 마운트 지점이 새 터미널에 표시되는지 확인.
jiyong@com:~# cat /proc/mounts | grep mount_ns jiyong@com:~# df -h | grep mount_ns jiyong@com:~#
-
터미널 열고 다음과 같이 /tmp 아래 mount_ns 디렉토리 생성