====== Installation von LXC auf Ubuntu 12.04 ====== ==== Debian-Installation im LXC-Container ==== * [[http://blog.bodhizazen.net/linux/lxc-configure-ubuntu-lucid-containers/]] 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 ==== * [[https://help.ubuntu.com/12.04/serverguide/lxc.html]] __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: 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 === * [[VNC]] == 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 ==== * [[LXC-Container öffnet automatisch den VNC-Port]] * [[LXC-Container zu 90% mit einem Skript erstellen und einrichten]] * [[LXC-Container - Steuer-Skript]]