LXC는 루트 마운트 지점을 어떻게 설정합니까?

LXC는 루트 마운트 지점을 어떻게 설정합니까?

우분투에서 네임스페이스를 마운트하려고 합니다. 지금까지는 다음을 사용하여 빈 설치 네임스페이스를 만들 수 있습니다.

# mkdir test
# unshare --mount
# mount none test -t tmpfs
# cd test
# pivot_root . . 
# cd / <--- test becomes /

LXCUbuntu 컨테이너를 확인하면 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

참고하시기 바랍니다,원천동일하지만 컨테이너 내부에는 바인드 마운트된 소스 디렉터리도 볼 수 있습니다.

관련 정보