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
apt update
私の場合、LXC コンテナはネットワーク接続が可能になったときに「準備完了」であるとみなします (たとえば、次のようなコマンドがLXC コンテナのセットアップ スクリプト内で機能するため)。
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
すぐに使用できるsystemdサービスであり、network-online.target
(少なくとも私はそう理解しています)。
したがって、systemctl start systemd-networkd-wait-online.service
ネットワークが起動するまで実行はブロックされます。