Inhaltsverzeichnis

Installation von LXC auf Ubuntu 12.04

Debian-Installation im LXC-Container

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 auf einem Ubuntu-Host

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-Verbindung aufbauen

innerhalb des Containers

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
ausserhalb des Containers (vom Host-System aus)

volle Farbpalette auch bei zu geringer Bandbreite erzwingen:

# vncviewer -AutoSelect=0 -FullColour 10.0.3.204:1

Probleme bei der Installation

...
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
...

Problem-Lösung

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/

ein paar Ergänzugen