Old but not busted … – Dieser Inhalt wurde vor mehr als 10 Jahren publiziert. Die Korrektheit und Verfügbarkeit von Links können leider nicht gewährleistet werden.
Gestern wollte/musste ich mal wissen, was in einem LXC-Container (auf unserem Kommune-Server) gemountet ist. – Da das im ersten Anlauf nicht ganz so trivial heraus zu bekommen war, hier mal meine kleine Gedankenstütze.
long story short
root@host:~/# ls -lha /proc/$(lxc-info -n container -p | awk '{print $2}')/root/home
Erklärbär
Szenario
- LXC-Version: 0.7.5 (ja ich weiß, is alt … ;))
- Host =
hn
- Container =
container
- Mount = in der fstab (
host:/var/lib/lxc/container/fstab
) ist das host:/home
mit der Zeile "/home home none bind 0 0"
eingebunden (d.h. also, dass beim Starten des LXC-Containers des /home vom Host beim Start des Containers in den Container gemountet wird; dabei ist home
als relativer Pfad zum /
angegeben)
Das Problem
Wenn man nun auf dem Host wissen will, wie das /home
im Container aussieht (ls -lha /var/lib/lxc/container/rootfs/home
) wird man feststellen, dass es ganz anders aussieht, als erwartet. – Hintergrund ist, dass der obige Mount in einem temporären Filesystem (also nicht wie ein normaler/echter Mount) eingehängt wird.
Hier mal die Ausgabe, die mit einem Standard-LXC-Template (Ubuntu) erzeugt wird:
root@host:~/# ls -lha /var/lib/lxc/container/rootfs/home
total 4.0K
drwxr-xr-x 3 root root 19 Aug 18 2012 .
drwxr-xr-x 22 root root 4.0K Feb 7 14:15 ..
drwxr-xr-x 2 ubuntu ubuntu 54 Aug 20 2012 ubuntu
Die Lösung
Nach etwas Recherche stieß ich auf den Blog-Post „LXC 1.0: Advanced container usage“ des LXC-Entwicklers Stéphane Graber, in dem der Trick (und einige Hintergründe) erklärt werden.
Jeder Container hat eine eigene Prozessnummer (pid
). Diese bekommt man mit lxc-info -n container -p
heraus.
Der im temporären Dateisystem eingehängte Mount befindet sich unter host:/proc
und dort wieder unter der jeweiligen PID.
Also angenommen unser Container hat die PID 1234
, dann findet man dessen root-Filesystem (inkl. aller Mounts) unter host:/proc/1234/root/
.
Wir benötigen also zuerst die PID des Containers (lxc-info -n container -p
) und danach können wir uns das Filesystem anzeigen lassen (ls -lha /proc/PID/root/
). – Beide Befehle kann man nun kombinieren.
mit LXC 1.x
In oben genannten Blog-Post wird für das Eruieren der PID lxc-info -n container -p -H
(angepasst!) angegeben. Dabei stehen die Schalter -n container
für den Containernamen, -p
für die Ausgabe der PID und -H
(wahrscheinlich; siehe unten) für die numerische Ausgabe der PID.
Die Kombination der beiden Befehle zum Anzeigen des Root-Dateisystems für den Container sieht dann so aus: ls -lha /proc/$(lxc-info -n container -p -H)/root/
(angepasst!).
mit LXC 1.x (in meinem Fall 0.7.5)
Da ich ATM allerdings noch nicht die Version 1.x verwende, funktioniert der Tipp (aus dem Blog-Post für die Version 1.x leider nicht (so ganz).
Denn in 0.7.5 gibt es den Schalter -H
bei der Ausgabe der PID mit lxc-info -n container -p
nicht, so dass man nicht nur die PID, sondern den Text pid: 1234
zurück bekommt. :-/
Allerdings ist das nicht so dramatisch, denn man kann sich ja mit awk
behelfen (und somit den Schalter ersetzen/emulieren). 🙂
lxc-info -n container -p | awk '{print $2}'
liefert nur die zweite ‚Spalte‘ der lxc-info-Ausgabe, also die nummerische PID.
Ergo hier nun meine Lösung zum Anzeigen des Root-Dateisystems des Containers:
root@host:~/# ls -lha /proc/$(lxc-info -n container -p | awk '{print $2}')/root/home
total 4.0K
drwxr-xr-x 3 root root 19 Aug 18 2012 .
drwxr-xr-x 22 root root 4.0K Feb 7 14:15 ..
drwxr-xr-x 2 user1 user1 […] user1
drwxr-xr-x 2 user2 user2 […] user2
drwxr-xr-x 2 user3 user3 […] user3
… wieder was gelernt … 😉 – Allerdings wohl nicht für lange, denn das Update auf die Version 1.x steht ja vor der Tür …