![Wie erkennt man, dass ein LXC-Containersystem bereit ist?](https://rvso.com/image/1451564/Wie%20erkennt%20man%2C%20dass%20ein%20LXC-Containersystem%20bereit%20ist%3F.png)
Ich versuche, einen LXC-Container zu starten und dann einen Befehl darin auszuführen. Das Problem besteht darin, dass der Container, selbst wenn er sich im Status RUNNING befindet, seinen gesamten Bootvorgang noch nicht abgeschlossen hat. Dies führt zu Problemen mit /tmp (und, wie ich vermute, mit anderen Initialisierungen).
Dies kann mit dieser Aufrufsequenz veranschaulicht werden, die einen Container erstellt, ihn startet, auf seinen RUNNING-Status wartet und einige Befehle ausführt. Die Befehle erstellen eine Datei /tmp/hello, zeigen ein Verzeichnis an, warten einen Moment und zeigen das Verzeichnis erneut an:
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
dessen Ausgabe ist
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
und zeigt, dass die Datei /tmp/hello durch ein Initialisierungsskript gelöscht wird.
Wie wartet man im Container, bis das System vollständig hochgefahren ist? Und wie macht man das von außerhalb des Containers?
Antwort1
Für einen Container, der auf systemd läuft, scheint dies gut zu funktionieren:
lxc-attach -n [CONTAINER NAME] -- systemctl isolate multi-user.target
Sie könnten wahrscheinlich dieselbe Logik für einen sysvinit
- oder upstart
-basierten Container anwenden (einen Befehl ausführen, der blockiert, bis ein Runlevel erreicht ist), aber ich könnte Ihnen nicht spontan sagen, mit welchen Befehlen dies möglich ist.
Antwort2
In meinem Fall betrachte ich einen LXC-Container als „bereit“, wenn er über eine Netzwerkverbindung verfügt (z. B. damit Befehle wie apt update
in einem LXC-Container-Setup-Skript funktionieren).
Auf Debian 11 Bullseye als LXC-Host, mit einem Debian 11 Bullseye LXC-Container, konnte ich das folgende Muster erfolgreich nutzen:
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
# ...
Der systemctl start systemd-networkd-wait-online.service
relevante Teil:
systemd-networkd-wait-online.service
ist ein systemd-Dienst, der sofort einsatzbereit ist und nur dienetwork-online.target
(zumindest verstehe ich das so).
Daher werden systemctl start systemd-networkd-wait-online.service
Blöcke ausgeführt, bis das Netzwerk aktiv ist.