![LXC 컨테이너 시스템을 감지하는 방법이 준비되었나요?](https://rvso.com/image/1451564/LXC%20%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%84%20%EA%B0%90%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%A4%80%EB%B9%84%EB%90%98%EC%97%88%EB%82%98%EC%9A%94%3F.png)
LXC 컨테이너를 시작한 다음 그 안에서 명령을 실행하려고 합니다. 문제는 컨테이너가 RUNNING 상태임에도 부팅이 모두 완료되지 않았다는 점이다. 이로 인해 /tmp에 문제가 발생합니다(그리고 다른 초기화에도 문제가 있을 것 같습니다).
이는 컨테이너를 생성하고, 시작하고, RUNNING 상태를 기다리고, 일부 명령을 실행하는 호출 시퀀스로 설명할 수 있습니다. 이 명령은 /tmp/hello 파일을 생성하고, 디렉터리를 표시하고, 잠시 기다린 후 디렉터리를 다시 표시합니다.
lxc-clone -B overlayfs -s -o vm -n c1 ; lxc-start -n c1 ; lxc-wait -n c1 -s RUNNING ; lxc-attach -n c1 -- su -c "touch /tmp/hello; ls -la /tmp; sleep 5; ls -la /tmp" slave ; lxc-stop -n c1 ; lxc-destroy -n c1
누구의 출력은
Created container c1 as snapshot of vm total 16 drwxrwxrwt 1 root root 4096 May 24 09:37 . drwxr-xr-x 1 root nogroup 4096 May 24 09:37 .. drwxrwxrwt 2 root root 4096 May 22 21:19 .ICE-unix drwxrwxrwt 2 root root 4096 May 22 21:19 .X11-unix -rw-rw-r-- 1 slave slave 0 May 24 09:37 hello total 16 drwxrwxrwt 1 root root 4096 May 24 09:37 . drwxr-xr-x 1 root nogroup 4096 May 24 09:37 .. drwxrwxrwt 2 root root 4096 May 24 09:37 .ICE-unix drwxrwxrwt 2 root root 4096 May 24 09:37 .X11-unix
그리고 일부 초기화 스크립트에 의해 /tmp/hello 파일이 삭제되었음을 보여줍니다.
시스템이 완전히 부팅될 때까지 컨테이너 내부에서 어떻게 기다리나요? 또한 컨테이너 외부에서는 어떻게 수행합니까?
답변1
systemd에서 실행되는 컨테이너의 경우 다음이 잘 작동하는 것 같습니다.
lxc-attach -n [CONTAINER NAME] -- systemctl isolate multi-user.target
sysvinit
또는 기반 컨테이너 에 대해 동일한 논리를 적용할 수 있지만 upstart
(런레벨에 도달할 때까지 차단하는 명령 실행), 어떤 명령이 이 작업을 수행할 수 있는지 머리로는 알 수 없습니다.
답변2
내 경우에는 네트워크 연결이 있을 때 LXC 컨테이너가 "준비"된 것으로 간주합니다(예: LXC 컨테이너 설정 스크립트 내에서 같은 명령이 apt update
작동하도록).
Debian 11 Bullseye에서 lxc 호스트로 Debian 11 Bullseye lxc 컨테이너를 사용하여 다음 패턴을 활용하는 데 성공했습니다.
lxc-unpriv-start -n "$LXC_CONTAINER"
lxc-wait -n "$LXC_CONTAINER" -s RUNNING
# the lxc-wait RUNNING state is not that useful;
# a container is already considered RUNNING even though the network is not yet up
# the following command blocks until the container's network is up
lxc-unpriv-attach -n "$LXC_CONTAINER" -- systemctl start systemd-networkd-wait-online.service
# when the script reaches this part, the lxc container's network probably is completely up and running
lxc-unpriv-attach -n "$LXC_CONTAINER" -- apt update
# ...
관련 부분 은 다음 systemctl start systemd-networkd-wait-online.service
과 같습니다.
systemd-networkd-wait-online.service
바로 사용 가능한 시스템 서비스입니다.network-online.target
(또는 적어도 나는 이해합니다).
따라서 systemctl start systemd-networkd-wait-online.service
네트워크가 가동될 때까지 실행이 차단됩니다.