Nach vier Jahren ist es mal wieder Zeit für ein kleines Tutorial zur Installation von Ubuntu-domUs via debootstrap. Dank Aufnahme der pvops-DomU in den Vanilla-Kernel bringt Ubuntu einen Kernel mit, der lediglich kleine Anpassungen am Initramfs benötigt, um sauber auf einem aktuellen Xen 4.0 zu starten.
Installation von Debootstrap
Zuerst muss debootstrap vorhanden sein, am einfachsten natürlich mit apt-get install debootstrap. Unter Ubuntu kann mit debootstrap auch die Folgeversion installiert werden. Debian-User können das Ubuntu-Debootstrap direkt von http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/ herunterladen und mit dpkg -i installieren. Nutzer von RPM-Distributionen sollten ein Konvertierungstool installieren oder Debootstrap direkt aus dem .tar.gz installieren.
Vorbereitung eines Images
Für Xen DomUs haben Sie die Möglichkeit, physikalische Festplatten oder deren Partitionen zu nutzen oder Festplattenimages zu verwenden. Bei den Images wiederum gibt es zwei Möglichkeiten: Tap-Disks, die wachsen können und beispielsweise VMware VMDK-Format unterstützen oder “Plain-Images”, die als Loopback-Device gemountet werden können. Ich empfehle bei Testkonfigurationen grundsätzlich und bei Produktivsystemen für die Systempartitionen Images von Partitionen. Die Gründe:
- Im Gegensatz zu partitionierten Festplattenimages kann ein Partitionsimage ohne Verrenkungen vergrößert werden
- Ein Mounten ist simpel mit mount -o loop ... möglich, es muss kein Offset errechnet und angegeben werden
- Im Gegensatz zu VMDK-Images benötigt der Mount auf einer Xen-losen Maschine keine zusätzlichen Werkzeuge
Images erstelle ich als Sparse-Images, das geht schnell und spart Plattenplatz, hat aber bei Maschinen mit vielen Xen-Instanzen deutlich spürbare Einbußen durch doppelte Fragmentierung zur Folge. Zunächst entsteht ein Image für die Systempartition. Da ich gerne auch Kernel in der Xen-Instanz baue, hier 8GB groß, das Swap-Image bekommt ein Gigabyte:
dd if=/dev/zero bs=$((1024**2)) count=1 seek=8191 of=xvda1.img dd if=/dev/zero bs=$((1024**2)) count=1 seek=1023 of=swap.img
Als nächstes entsteht eine Swap-Signatur und ein Dateisystem auf dem Image xvda1.img. Das Dateisystem mounte ich gleich auf einen noch zu erstellenden Mountpoint /tmp/minibuntu:
mkswap -f swap.img freeloop=` losetup -f ` losetup $freeloop xvda1.img echo "loopdevice is $freeloop" mkfs.ext3 $freeloop mkdir /tmp/minibuntu mount $freeloop /tmp/minibuntu
Installation des Basissystems
Die Installation des Basissystems geht innerhalb weniger Minuten mit dem Befehl debootstrap. Auf einem 64-Bit Hostsystem haben Sie die Wahl, 32- oder 64-Bit-Gäste zu installieren. Bei Gästen, die keine allzu große Prozessgröße erwarten lassen, sind 32-Bit-Gäste oft einen Tick flotter und kompakter:
debootstrap --arch i386 lucid /tmp/minibuntu http://archive.ubuntu.com/ubuntu
oder
debootstrap --arch amd64 lucid /tmp/minibuntu http://archive.ubuntu.com/ubuntu
Das so installierte Ubuntu würde sich mit dem Hostkernel schon booten, darüber hinaus jedoch kaum nutzen lassen. Setzen wir einige Einstellungen:
vim /tmp/minibuntu/etc/default/locale
# BEGIN /etc/default/locale LANG="POSIX" # oder # LANG="de_DE.UTF-8" # END /etc/default/locale
vim /tmp/minibuntu/etc/network/interfaces
# BEGIN /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp # END /etc/network/interfaces
echo '127.0.0.1 localhost' > /tmp/minibuntu/etc/hosts echo 'lucid-domU.test' > /tmp/minibuntu/etc/hostname
Auch eine vollständige /etc/apt/sources.list wird benötigt:
vim /tmp/minibuntu/etc/apt/sources.list
# BEGIN /etc/apt/sources.list deb http://de.archive.ubuntu.com/ubuntu/ lucid main restricted deb-src http://de.archive.ubuntu.com/ubuntu/ lucid main restricted deb http://de.archive.ubuntu.com/ubuntu/ lucid-updates main restricted deb-src http://de.archive.ubuntu.com/ubuntu/ lucid-updates main restricted deb http://de.archive.ubuntu.com/ubuntu/ lucid universe deb-src http://de.archive.ubuntu.com/ubuntu/ lucid universe deb http://de.archive.ubuntu.com/ubuntu/ lucid-updates universe deb-src http://de.archive.ubuntu.com/ubuntu/ lucid-updates universe deb http://de.archive.ubuntu.com/ubuntu/ lucid multiverse deb-src http://de.archive.ubuntu.com/ubuntu/ lucid multiverse deb http://de.archive.ubuntu.com/ubuntu/ lucid-updates multiverse deb-src http://de.archive.ubuntu.com/ubuntu/ lucid-updates multiverse deb http://security.ubuntu.com/ubuntu lucid-security main restricted deb-src http://security.ubuntu.com/ubuntu lucid-security main restricted deb http://security.ubuntu.com/ubuntu lucid-security universe deb-src http://security.ubuntu.com/ubuntu lucid-security universe deb http://security.ubuntu.com/ubuntu lucid-security multiverse deb-src http://security.ubuntu.com/ubuntu lucid-security multiverse # END /etc/apt/sources.list
Ohne /etc/fstab geht wenig im domU-System, die Platten heissen nicht mehr wie bei den alten dom0- und domU-Kerneln /dev/sda, sondern /dev/xvda:
vim /tmp/minibuntu/etc/fstab
# BEGIN /etc/fstab proc /proc proc defaults 0 0 /dev/xvda1 / ext3 defaults 0 1 /dev/xvda2 none swap sw 0 0 # END /etc/fstab
Eine Konsole für Xen. Xen nutzt /dev/hvc0 als Systemkonsole, diese muss noch mit einem getty versehen werden. Das erledigen Sie durch Kopieren der Definition von tty1 und entsprechende Anpassungen:
cp /tmp/minibuntu/etc/init/{tty1,hvc0}.conf
sed -i 's/tty1/hvc0/g' /tmp/minibuntu/etc/init/hvc0.conf
Chroot, Passwort und Kernel
Zum Abschluss der Installation und der Nachinstallation von Software müssen Sie per chroot in das frisch installierte Ubuntu wechseln. Zunächst benötigen Sie dafür einige spezielle Dateisysteme:
mount -t proc none /tmp/minibuntu/proc mount -t devpts none /tmp/minibuntu/dev/pts
Wenn Host und Gast die gleiche Architektur nutzen, klappt der Chroot klassisch:
LANG=C chroot /tmp/minibuntu /bin/bash
Ist der Host dagegen 64 bittig und der Gast 32 bittig, ist setarch zu verwenden:
LANG=C setarch i386 chroot /tmp/minibuntu /bin/bash
Zunächst aktivieren wir Shadow-Passwörter und setzen ein Root-Passwort:
shadowconfig on passwd
Auf 32-Bit-Gästen muss zwingend ein PAE-Kernel installiert werden. Nur dieser enthält Unterstützung für pvops. Kernel ohne PAE laufen nur auf dem “nackten Metall”. Bei 64 Bit sollten alle Kernel pvops unterstützen:
apt-get install linux-image-generic-pae
Da ein Bootloader bei unserer Konfiguration keinen Sinn macht, sind entsprechende Nachfragen mit [No] zu beantworten.
Aufbau des Initramfs
Im Gegensatz zu gängigen Dateisystemtreibern enthält Ubuntus Kernel die Frontend-Treiber für Blockdevices und das Netz nur als Module. Diese sind entsprechend zu Initramfs-Konfiguration hinzuzufügen:
vim.tiny /etc/initramfs-tools/initramfs.conf
MODULES=list
Diese Liste ist entsprechend anzupassen:
vim.tiny /etc/initramfs-tools/modules
# BEGIN /etc/initramfs-tools/modules xen-kbdfront xen-netfront xen-blkfront # END /etc/initramfs-tools/modules
Und anschließend wird das Initramfs neu aufgebaut:
mkinitramfs -o /boot/initrd.img-2.6.32-24-generic-pae 2.6.32-24-generic-pae
Verlassen Sie nun den Chroot wieder und unmounten Sie die beiden speziellen Dateisysteme.
exit umount /tmp/minibuntu/proc umount /tmp/minibuntu/dev/pts
Kopieren der Kernel, Aufbau der domU-Konfiguration
Kopieren Sie nun Kernel und Initramfs von /tmp/minibuntu/boot in das Verzeichnis, welches Festplattenimages und später die Konfiguration enthält. Erstellen Sie dann eine Datei ubuntu.cfg mit folgendem Inhalt (selbstverständlich ist der Pfad zum Installationsverzeichnis anzupassen und Kernel sowie Initramfs umzubenennen oder zu verlinken):
kernel = "/usr/local/xendomains/lucid_test/vmlinuz"
ramdisk = "/usr/local/xendomains/lucid_test/initrd.gz"
memory = 512
name = "lucid-test"
vif = [ 'mac=00:16:00:00:42:23' ]
disk = [ 'file:/usr/local/xendomains/lucid_test/xvda1.img,xvda1,w',
'file:/usr/local/xendomains/lucid_test/swap.img,xvda2,w' ]
root = '/dev/xvda1 ro'
extra = 'console=hvc0'
Jetzt nicht vergessen, das Loopback-Device zu unmounten und freizugeben:
umount /tmp/minibuntu umount $freeloop losetup -d $freeloop
Dann kann auch die neue domU gestartet werden:
xm create -c ubuntu.cfg
Melden Sie sich in der Konsole der domU an und installieren Sie die Xen-Version der C-Bibliothek, sowie OpenSSH nach:
apt-get install ssh libc6-xen
Beim nächsten Mal kann dann die Domain ohne -c gestartet und per SSH zugegriffen werden. Soll die virtuelle Festplatte vergrößert werden, kann dies nach dem Herunterfahren mit dd erfolgen:
dd if=/dev/zero bs=$((1024**2)) count=1 seek=16383 of=xvda1.img freeloop=` losetup -f` losetup $freeloop xvda1.img fsck.ext3 -f $freeloop resize2fs $freeloop losetup -d $freeloop
That’s it! Soll die domU automatisch mit dem Xend des Hostes starten, die .cfg in /etc/xen/auto verlinken und darauf achten, dass das Startscript /etc/init.d/xendomains beim Systemstart unmittelbar nach xend gestartet wird. Die so erstellte Domain ist prinzipiell portabel, man sollte sich allerdings keine allzugroßen Hoffnungen auf einen Boot unter alten Xen-Versionen (vor 3.4) machen. Sind noch alte dom0s vorhanden, schafft möglicherweise Ubuntus ec2-Kernel für Amazons Elastic Computing Cloud Abhilfe.
Comments
7 responses to “Ubuntu 10.04 als DomU (Xen) “debootstrappen””
[…] Hier geht es lang: Neue Version dieser Anleitung für Ubuntu 10.04 (Lucid Lynx) und folgende auf Xen 3.4 oder 4.0 (oder… […]
Hi,
eine lieb gemeinte Anleitung aber hat Xen 4.0 kein xen-create-image mehr?
Gruss süppchen
Hat es nach wie vor.
Der Weg über manuelles debootstrap mag nicht gerade komfortabler sein, aber es ist sicherer. Insbesondere, wenn man nicht den dom0-Kernel booten möchte, sondern die domU mit dem Ubuntu-Kernel mit pvops.
Alternativ kann man auf dem Host den pvops-Kernel parallel installieren, das Initramfs erstellen und diesen Kernel dem xen-create-image mitgeben. Dann klappt es zumindest suaber, wenn Version und Architektur der domU der dom0 entsprechen.
Kleiner Tipp:
bs=1M
Funktioniert auch bei den anderen Parametern…
Bin ein gebranntes Kind von den dd’s anderer Unices und alter Busybox-Versionen… Da geht oft nur die numerische Angabe der Blockgröße. Ich bin zu faul, auf jeder Maschine zuerst sicherzustellen, ob ein GNU dd drauf ist.
Und falls jemand über den Bashismus $((1024**2)) meckert: Wenn ich mir nicht sicher bin, in einer bash zu sein, nehme ich natürlich ` expr 1024 ‘*’ 1024 `…
runs well, even on XEN 3.3.1 !
I needed to add that “trick” http://serverfault.com/questions/155210/cannot-utime-bad-file-descriptor-when-upgrading-ubuntu-8-04-to-10-04
to succeed with debootstrap and mkinitramfs
thanks
Working as described for hosting Ubuntu domU 10.04 LTS x64 (linux-server kernel image) ontop of SLES11 dom0 x64 (Sun Blade). Saved us from having to stick to SLES11 domUs because we need pv-mode.
Is there documentation on the xen-* (xen-kbdfront, xen-netfront, xen-blkfront) specific kernel modules needed and what they do?
Thanks!