우분투에서 네임스페이스를 마운트하려고 합니다. 지금까지는 다음을 사용하여 빈 설치 네임스페이스를 만들 수 있습니다.
# mkdir test
# unshare --mount
# mount none test -t tmpfs
# cd test
# pivot_root . .
# cd / <--- test becomes /
LXC
Ubuntu 컨테이너를 확인하면 mount
명령에 다음이 표시됩니다.
마운트 네임스페이스는 처음에 마운트 지점의 복사본을 가져오므로 /dev/sda1
컨테이너 내부는 전역적이라고 가정하지만( /dev/sda1
컨테이너가 시작된 후에는 내부가 없기 때문에) 컨테이너 내부에 있는 내용은 루트 파일 시스템에 해당합니다. LXC에 익숙한 사람이 컨테이너에 들어가기 전에 LXC가 수행하는 설치 작업을 설명할 수 있습니까?/dev/sda1
/
pivot_root
답변1
LXC가 실제로 무엇을 하는지 보기 위해, 새로운 컨테이너를 생성하고 다음을 통해 시작 프로세스를 추적해 보겠습니다 strace(1)
.
[root@localhost /]# lxc-create -n testcontainer -t debian
[root@localhost /]# strace -e trace=clone,chdir,mount,pivot_root,execve \
-f -o lxclog \
lxc-start -n testcontainer
결과 추적이 기록됩니다.룩크로그파일에서 가장 관련성이 높은 부분은 다음과 같습니다(중요하지 않은 일부 호출을 생략하고 타원을 추가했습니다).
14671 clone(child_stack=0x7fff9379eb80, flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWNET|SIGCHLD) = 14677
<...>
14677 mount("/var/lib/lxc/testcontainer/rootfs", "/usr/lib64/lxc/rootfs", 0x7fe4c2d10eac, MS_BIND|MS_REC, NULL) = 0
<...>
14677 chdir("/usr/lib64/lxc/rootfs") = 0
14677 pivot_root(".", "/usr/lib64/lxc/rootfs/lxc_putold") = 0
14677 chdir("/")
<...>
14677 execve("/sbin/init", ["/sbin/init"], [/* 1 var */]) = 0
lxc-start
먼저 (PID 14671) ( PID 14677) 을 사용하여 새 프로세스를 생성 clone(2)
하고 이를 새 설치 네임스페이스( CLONE_NEWNS
플래그)에 배치합니다. 그런 다음 이 새로운 마운트 네임스페이스에서 컨테이너의 루트 파일 시스템(/var/lib/lxc/testcontainer/rootfs)는 설치( MS_BIND
플래그)에 바인딩되어 있습니다./usr/lib64/lxc/rootfs, 새 루트가 됩니다. 마지막으로 컨테이너 초기화가 완료되면 프로세스 14677이 컨테이너의 init
.
여기서 중요한 것은 컨테이너의 마운트 네임스페이스의 루트 디렉터리가 해당 디렉터리의 바인드 마운트라는 것입니다.호스트에 속한 루트 FS. 그렇기 때문에 컨테이너의 루트 마운트가 여전히/dev/sda1출력의 소스로 mount(8)
. 그러나 표시되지 않은 차이점이 있습니다 mount(8)
. 이를 보려면 findmnt(8)
컨테이너 내부에서 다음을 시도해 보세요.
root@testcontainer:~# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1[/var/lib/lxc/testcontainer/rootfs]
findmnt(8)
이를 호스트 시스템의 출력과 비교하십시오.
[root@localhost /]# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1
참고하시기 바랍니다,원천동일하지만 컨테이너 내부에는 바인드 마운트된 소스 디렉터리도 볼 수 있습니다.