ein Debian-Basis-System installieren:
# aptitude install lxc lxctl vlan bridge-utils python-software-properties screen mkdir /lxc # cd /lxc # debootstrap --variant=minbase --arch i386 lucid ContainerName
Wenn lucid installiert werden soll, wird als erstes nach dieser Datei gesucht:
http://archive.ubuntu.com/ubuntu/dists/lucid/Release
Installation der benötigten Pakete:
# aptitude install lxc lxctl vlan bridge-utils python-software-properties screen
Konfigurationsdateien, die zum Start nötig sind und die man im Normalfall nicht zu bearbeiten braucht:
# vi /etc/init/lxc-net.conf # vi /etc/init/lxc.conf
weitere Beispiele:
# ls -lha /usr/share/doc/lxc/examples/ insgesamt 40K drwxr-xr-x 2 root root 4,0K Jul 2 20:05 . drwxr-xr-x 3 root root 80 Jul 2 20:05 .. -rw-r--r-- 1 root root 699 Jun 14 18:40 lxc-complex.conf -rw-r--r-- 1 root root 122 Jun 14 18:40 lxc-empty-netns.conf -rw-r--r-- 1 root root 284 Jun 14 18:40 lxc-macvlan.conf -rw-r--r-- 1 root root 61 Jun 14 18:40 lxc-no-netns.conf -rw-r--r-- 1 root root 300 Jun 14 18:40 lxc-phys.conf -rw-r--r-- 1 root root 327 Jun 14 18:40 lxc-veth.conf -rw-r--r-- 1 root root 305 Jun 14 18:40 lxc-vlan.conf
Dieses Programm startet einen Container, muss man aber nicht weiter beachten:
# /usr/lib/lxc/lxc-init
hier liegen Beispielkonfigurationen, mit denen man sich Container erstellen kann:
# ls -lha /usr/lib/lxc/templates/ insgesamt 100K drwxr-xr-x 2 root root 4,0K Jul 2 20:05 . drwxr-xr-x 4 root root 96 Jul 2 20:05 .. -rwxr-xr-x 1 root root 8,1K Jun 14 18:40 lxc-busybox -rwxr-xr-x 1 root root 9,4K Jun 14 18:40 lxc-debian -rwxr-xr-x 1 root root 11K Jun 14 18:40 lxc-fedora -rwxr-xr-x 1 root root 8,9K Jun 14 18:40 lxc-opensuse -rwxr-xr-x 1 root root 5,0K Jun 14 18:40 lxc-sshd -rwxr-xr-x 1 root root 19K Jun 14 18:40 lxc-ubuntu -rwxr-xr-x 1 root root 10K Jun 14 18:40 lxc-ubuntu-cloud
erstellt man so einen Container,
dann liegt er im Verzeichnis /var/lib/lxc:
# lxc-create -t ubuntu -n ContainerName
hier einen 32Bit-Container auf einem 64Bit-Host erstellen:
# lxc-create -n ContainerName -t ubuntu -- -a i386
und hier wird gleich noch der Benutzer fritz im Container so mit angelegt,
dass das HOME-Verzeichnis des Host-Systems von "fritz" in das HOME-Verzeichnis des Containers gemapt wird:
# lxc-create -n ContainerName -t ubuntu -- -a i386 -b fritz
oder etwas spezieller:
# lxc-create -n ContainerName -t ubuntu -- -a i386 -r oneiric -b fritz
oder noch spezieller:
# aptitude install curl yum # lxc-create -n ContainerName -t fedora -- -A i386
und in dieses Verzeichnis /var/cache/lxc werden dann die Distributionsdaten
zwischengespeichert, um das erstellen mehrerer Container zu beschleunigen.
wenn nötig, die Apt-Proxy-Konfigurationsdatei in das entsprechende Verzeichnis der zwischen gespeicherten Conteiner-Installation kopiert und die Installation erneut starten:
# cp /etc/apt/apt.conf /var/cache/lxc/precise/partial-i386/etc/apt/ # lxc-create -n ContainerName -t ubuntu -- -a i386
Jede Vorlage hat ihre eigenen Parameter (das sind die, die man hinter den – angeben kann),
die kann man so abfragen:
# lxc-create -t ubuntu -h # lxc-create -t fedora -h
Es können alle Releases installiert werden, zu denen man hier eine Datei findet:
# ls -lh /usr/share/debootstrap/scripts/ ... -rw-r--r-- 1 root root 6,3K Jul 29 2011 gutsy ... lrwxrwxrwx 1 root root 5 Mai 2 10:46 oneiric -> gutsy -rw-r--r-- 1 root root 3,3K Jul 29 2011 potato lrwxrwxrwx 1 root root 5 Mai 2 10:46 precise -> gutsy ...
Die Vorlagen-Skripte lassen sich auch direkt aufrufen:
# /usr/lib/lxc/templates/lxc-Vorlagenname -n ContainerName -p /Pfad/zum/Root-Dateisystem
Die Minimalversion einer Konfigurationsdatei (/var/lib/lxc/ContainerName/config) sieht so aus:
lxc.network.type=veth lxc.network.link=lxcbr0 lxc.network.flags=up
Will man einen neuen Container erzeugen, dann darf auf garkeinen Fall ein Verzeichnis mit dem Namen des neuen Containers bereits vorhanden sein!
⇒ lxc-create -n Containername -f Konfigurationsdatei -t Vorlagenname – Vorlagenoptionen:
# lxc-create -n ContainerName -f /var/lib/lxc/default.cfg -t ubuntu -- -a i386
Status eines Containers anzeigen lassen:
# lxc-info -n ContainerName state: STOPPED lxc-info: 'ContainerName' is not running pid: -1
nach erfolgreicher Container-Installation, muss als erstes das root-Passwort
geändert werden (Es ist besser wenn der Container noch gestoppt ist!),
und wenn wir schonmal dabei sind entfernen wir gleich noch den Benutzer "ubuntu"
und legen uns dafür den Benutzer "fritz" an und geben auch ihm gleich ein Passwort:
# echo "echo -e 'PASSWORT\nPASSWORT\n' | passwd root" | chroot /var/lib/lxc/ContainerName/rootfs/ /bin/bash # echo "userdel -r ubuntu" | chroot /var/lib/lxc/ContainerName/rootfs/ /bin/bash # echo "useradd -s /bin/bash -m fritz" | chroot /var/lib/lxc/ContainerName/rootfs/ /bin/bash # echo "echo -e 'PASSWORT\nPASSWORT\n' | passwd fritz" | chroot /var/lib/lxc/ContainerName/rootfs/ /bin/bash
man kann auch die Zeitzone im Container anpassen:
# echo "rm /etc/localtime;ln -s /usr/share/zoneinfo/MET /etc/localtime" | chroot /var/lib/lxc/ContainerName/rootfs/ /bin/bash
gestartet wird der Container so (mit Login-Prompt):
# lxc-start -n ContainerName
oder so (im Hintergrund):
# lxc-start -n ContainerName -d
Wenn der Container gestartet ist, dann kann man so einfach auf die Container-Konsole wechseln (beenden kann man das mit [Strg]+[A] [Q]):
# lxc-console -n ContainerName
nach dem Wechsel auf die Container-Konsole werden wir als erstes nach seiner IP sehen, damit wir uns nicht nur per SSH einloggen können, sondern nachher auch die VNC-Verbindung aufbauen können:
# ip addr
10: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:f0:67:ce brd ff:ff:ff:ff:ff:ff
inet 10.0.3.204/24 brd 10.0.3.255 scope global eth0
inet6 fe80::216:3eff:fef0:67ce/64 scope link
valid_lft forever preferred_lft forever
In diesem Fall ist es die IP 10.0.3.204.
Containerinhalt aktuallisieren:
# apt-get install aptitude # aptitude update && aptitude -y safe-upgrade && aptitude autoclean
jetzt installieren wir X, wine und einen VNC-Server:
# aptitude install xorg xserver-xorg icewm vnc4server mc ntp wine
gestoppt wird der Container mit einen von diesen Befehlen im Container:
# shutdown -h now # halt -p # poweroff
oder vom Host-System aus:
# lxc-stop -n ContainerName
Container entfernen:
lxc-destroy -n ContainerName
Bevor das Hauptsystem heruntergefahren wird, sollten zuerst alle Container beendet werden. LXC macht das nicht selbständig. Für die Gastsysteme wäre das genauso, als wenn man einfach den Netzstecker ziehen würde.
alle Container anzeigen:
# lxc-ls # lxc-ls -1 # lxc-ls -l
die Prozesse eines Containers anzeigen:
# lxc-ps --name ContainerName
die Prozesse aller Container anzeigen:
# lxc-ps --lxc
VNC-Passwort setzen (im Container als entsprechender Benutzer!):
# vncpasswd Password: Verify:
den gewünschten (und installierten) Window-Manager eintragen:
# echo "/usr/bin/icewm-session"> ~/.xinitrc # chmod 0755 ~/.xinitrc
persönliches VNC-Start-Script konfigurieren:
# touch ~/.vnc/xstartup # chmod 0755 ~/.vnc/xstartup # vi ~/.vnc/xstartup #!/bin/sh [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources xsetroot -solid grey x-window-manager &
VNC-Server starten:
# vncserver -geometry 1152x864 :1
VNC-Server stoppen:
# vncserver -kill :1 Killing Xvnc4 process ID 541
volle Farbpalette auch bei zu geringer Bandbreite erzwingen:
# vncviewer -AutoSelect=0 -FullColour 10.0.3.204:1
... I: Configuring initramfs-tools... I: Base system installed successfully. Installing updates Ign http://security.ubuntu.com precise-security InRelease Err http://security.ubuntu.com precise-security Release.gpg Cannot initiate the connection to 3128:80 (0.0.12.56). - connect (22: Invalid argument) Ign http://security.ubuntu.com precise-security Release Ign http://archive.ubuntu.com precise InRelease Ign http://archive.ubuntu.com precise-updates InRelease Ign http://security.ubuntu.com precise-security/main TranslationIndex Ign http://security.ubuntu.com precise-security/multiverse TranslationIndex Ign http://security.ubuntu.com precise-security/restricted TranslationIndex Ign http://security.ubuntu.com precise-security/universe TranslationIndex Err http://archive.ubuntu.com precise Release.gpg Cannot initiate the connection to 3128:80 (0.0.12.56). - connect (22: Invalid argument) Err http://archive.ubuntu.com precise-updates Release.gpg ...
Die Vorlage "ubuntu" (u.a.) erstellen ein Root-Dateisystem unter /var/lib/lxc/ContainerName. Beim ersten Aufruf wird das mittels debootstrap von den Ubuntu- oder Debian-Servern heruntergeladen und unter /var/cache/lxc/ zwischengespeichert. Werden weitere Container mit derselben Vorlage erstellt, wird durch das Wiederverwenden dieses Caches die Erstellung enorm beschleunigt.
Dieses Problem tritt auf, weil das System hinter einem Proxy steht und die Container-Installation noch keine Proxy-Konfiguration besitzt.
Abhilfe schaft man, indem man (nach dem Abbruch des fehl geschlagenen Installationsversuches) seine Apt-Proxy-Konfigurationsdatei in das entsprechende Verzeichnis der zwischen gespeicherten Conteiner-Installation kopiert:
# cp /etc/apt/apt.conf /var/cache/lxc/precise/partial-i386/etc/apt/