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 dashost:/homemit 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 isthomeals 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 …