root dir을 특정 디렉터리로 변경하는 명령어이다. UNIX 명령과 system call로 존재한다. 예를들어 '/user/code' 디렉터리로 이동한다면, 기본 시스템에서는 '/user/code'로 이동하지만, chroot를 통해 root 디렉터리를 '/temp'로 변경 한 상태에서 똑같이 '/user/code'로 이동한다면 chroot가 변경된 스세템에서는 '/temp/user/code'로 이동한다.
위와 같은 특성을 이용해 시스템 보안을 구성하거나 동일한 프로그램을 설치하는 경우에 응용딜 수 있다.
시스템의 한정된 자원을 효과적으로 분배하여 가용성을 높일 수 있다. 현대의 운영체제는 프로세스에게 독립적인 공간을 할당한다. 이는 프로세스의 동작에 필요한 독립적인 공간을 할당받기 때문에 공격이나 다른 시스템의 동작으로 인한 예상치 못한 오류를 방지할 수 있다. 하지만 외부와 통신을 통해 데이터를 주고 받아야 하기 때문에 통신 비용이 증가하는 단점을 가지고 있다.
특히 여러 프로세스와 협업해야하는 DBMS나 server system같은 경우에 한 시스템의 디렉터리나 포트를 독점해서 사용하기 때문에 충돌의 가능성이 있다.
mount: 디렉터리 관련된 부분
UST: 유닉스 시분할 시스템
IPC:
network
PID
user
cgroup: group 별로 가상화된 공간을 만들고 자원을 제약할 수 있는 기능을 제공
고유의 공간을 만들고 그 안에서 프로그램을 실행시킨다.
unshare -pf --mount-proc /bin/bash
-p --pid: 프로세스 아이디를 호스트 OS와 격리시키는 옵션이다.
-f --fork: 자식 프로세스를 만들어서 관리하는 옵션이다.
-n
--mount-proc: PCB을 고유한 공간에 만들어서 관리한다.
sin@Ubuntu1804:~$ sudo unshare -pf --mount-proc /bin/bash
root@Ubuntu1804:~# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
57 pts/0 00:00:00 ps
root@Ubuntu1804:~#
sin@Ubuntu1804:~$ nc -l 5000 > nc_host_output.txt &
[1] 5780
sin@Ubuntu1804:~$ ss -nlpt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 0.0.0.0:5000 0.0.0.0:* users:(("nc",pid=5780,fd=3))
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::1]:631 [::]:*
sin@Ubuntu1804:~$
sin@Ubuntu1804:~$ sudo unshare -n /bin/bash
root@Ubuntu1804:~# ss -nlpt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
root@Ubuntu1804:~#
host에서 리스닝 중인 5000번 포트에 대한 내용이 unshare로 격리된 공간에서 나타나지 않는다.
Namespace의 목록을 출력한다.
root@Ubuntu1804:~# ps
PID TTY TIME CMD
6369 pts/0 00:00:00 sudo
6370 pts/0 00:00:00 bash
6718 pts/0 00:00:00 ps
sin@Ubuntu1804:~$ sudo lsns
[sudo] sin의 암호:
NS TYPE NPROCS PID USER COMMAND
4026531835 cgroup 261 1 root /sbin/init
4026531836 pid 261 1 root /sbin/init
4026531837 user 261 1 root /sbin/init
4026531838 uts 261 1 root /sbin/init
4026531839 ipc 261 1 root /sbin/init
4026531840 mnt 250 1 root /sbin/init
4026531861 mnt 1 43 root kdevtmpfs
4026531898 net 259 1 root /sbin/init
4026532098 mnt 1 525 root /lib/systemd/systemd-udevd
4026532134 mnt 1 774 systemd-timesync /lib/systemd/systemd-timesyncd
4026532156 mnt 1 832 systemd-network /lib/systemd/systemd-networkd
4026532157 mnt 1 897 systemd-resolve /lib/systemd/systemd-resolved
4026532158 mnt 1 1015 root /usr/sbin/ModemManager --filter
4026532160 mnt 1 1175 root /usr/sbin/NetworkManager --no-d
4026532161 mnt 1 3678 root /usr/lib/fwupd/fwupd
4026532163 net 1 6370 root /bin/bash
4026532221 net 1 2305 rtkit /usr/lib/rtkit/rtkit-daemon
4026532275 mnt 1 2305 rtkit /usr/lib/rtkit/rtkit-daemon
4026532332 mnt 1 2392 root /usr/lib/aarch64-linux-gnu/bolt
4026532333 mnt 1 2516 colord /usr/lib/colord/colord
sin@Ubuntu1804:~$
위에 격리된 bash의 프로세스 아이디 6370이 lsns 명령을 통해 확인할 수 있다.
소프트웨어로 가상화된 하드웨어를 통해 완전히 격리된 공간을 제공한다. 때문에 보안이나 호환성에 관련된 문제를 대부분 해결된다. 하지만 독점적인 자원 점유로 인해 낮은 성능은 물론 Host OS와 Guest OS간의 자원 공유가 어렵고 효율성이 떨어진다(오버헤드 문제).
단지 격리가 목적이라면 굳이 VM을 쓸 필요가 없다. Nativa application의 내부를 추상화 했으므로, 사실상 겉으로는 Navive application과 동일하기 때문에 오버헤드가 적다. Host OS 입장에서는 단지 격리 개념만 추가된 프로세스 임로 공유 자원을 사용할 수도 있고 사용하지 않을 수도 있다.