commit _early_
[debienna.git] / Vortrag / XenVirtualisierung / index.mdwn
1
2 _Kurzanleitung zum Anlegen einer [[Xen Virtual Machine|http://www.cl.cam.ac.uk/Research/SRG/netos/xen/]] unter Debian GNU/Linux._ [[!toc ]]
3
4
5 ### Xen? WTF?
6
7 Mit Hilfe von virtuellen Maschinen können wir verschiedene Dienste (HTTP, Datenbank, Mail, BIND etc.) getrennt von einander fahren bzw. Server für verschiedene User/Anwendungsbereiche auf einem Host verwenden, ohne dass die jeweiligen VMs einander sehen. Ist der eine Webserver beispielsweise kompromitiert, laufen Email, Datenbanken etc. weiter, ohne von der Attacke betroffen zu sein. Außerdem fällt die Wartung leichter. Und zum Testen unterschiedlichster Software (Entwicklungsserver unter sid, Production unter sarge etc.) bzw. zum parallelen Betrieb unterschiedlicher Distributionen (wer will das schon? *g*) bzw. unterschiedlicher Betriebssyteme (Debian GNU/Linux neben [[Debian GNU/kFreeBSD|http://www.debian.org/ports/kfreebsd-gnu/]] oder sogar [[Debian GNU/Hurd|http://www.debian.org/ports/hurd/]]) ist das ganze überhaupt supi!
8
9 Xen steht unter der GPL und wird hauptsächlich an der University of Cambridge entwickelt. Für weitere Infos siehe [[http://wiki.debian.org/Xen|http://wiki.debian.org/Xen]] sowie [[http://linuxwiki.de/Xen|http://linuxwiki.de/Xen]] oder andere Howtos. ;-)
10
11 Falls dein System nicht auf Debian basieren sollte (wie kann denn das sein? *fg*), findest du hier eine Liste weiterer Howtos:
12
13 * [[HowTos - Xen Wiki|http://wiki.xensource.com/xenwiki/HowTos]]
14
15 ### Xen and friends...
16
17 Während [[Linux-VServer|http://linux-vserver.org/]] am Kernel ABI virtualisiert und somit keine Guest-Kernels, sondern nur Guest-Environments benötigt, wird bei Xen - wie auch bei [[UML (User Mode Linux)|http://user-mode-linux.sourceforge.net/]] - die ganze Maschine virtualisiert und ein Guest-Kernel verwendet, d.h. die Virtualisierung findet auf einer anderen Ebene statt.
18
19 Der Hauptunterschied zu [[UML (User Mode Linux)|http://user-mode-linux.sourceforge.net/]] wiederum besteht darin, dass Xen einen eigenen Mikrokernel, den so genannten Hypervisor, verwendet und die Guest-VM somit nicht einfach als ein Prozess des Linux Makrokernels, sondern als Hypervisor-Partition läuft. (Danke an ["Bertl"] für die Aufklärung! :-) )
20
21 * vgl. [[XML Validation: XEN with Sarge|http://www.xmlvalidation.com/xen_howto_sarge.0.html]]
22
23 ## Host (dom0)
24
25 Nachdem Xen 3.0 sich noch im Entwicklungsstadium befindet und regelmäßig verbessert wird, haben wir beim Test am [[DebiennaTreff|DebiennaTreff]] darauf verzichtet, ein Debian-Paket zu verwenden, sondern bauten uns Xen stattdessen from Source. Für diejenigen, denen das (zumindest für den Anfang) zu stressig ist, gibt es aber auch eine kurze Beschreibung zum Installieren über dpkg/apt.
26
27
28 ### Debian
29
30 Es gibt die unterschiedlichsten Repositorys, von denen du Xen für Debian GNU/Linux beziehen kannst. Seit einiger Zeit gibt es auch ein Debian Xen Team und Xen ist in sid/unstable. Solltest du ein Produktionssystem fahren, benötigst du einen Backport (s. [[http://www.backports.org/|http://www.backports.org/]]) oder einen inoffiziellen Build, z.B. von Ralph Passgang. Eine genauere Auflistung findet sich hier: [[http://wiki.xensource.com/xenwiki/DebianPackageMaintenance|http://wiki.xensource.com/xenwiki/DebianPackageMaintenance]]
31
32 Nachdem die richtigen Quellen in /etc/apt/sources eingetragen sind und die Paketlisten mit 'apt-get update' bzw. 'aptitude update' auf den aktuellen Stand gebracht wurden (s. [[http://www.debian-administration.org/articles/320|http://www.debian-administration.org/articles/320]]), können wir Xen schon installieren.
33
34 * [[!format txt """
35 pablo@packman:~$ sudo aptitude install xen-hypervisor-3.0-i386 xen-utils-3.0 linux-image-2.6.16-1-xen-686 bridge-utils iproute sysfsutils libc6-xen xen-tools
36 """]]
37 In manchen Paketen findet sich das Skript 'update-grub-xen', welches die korrekten Entries für den Bootloader in /boot/grub/menu.lst schreibt. Wo dies nicht der Fall ist, muss dieser Schritt händisch durchgeführt werden (siehe weiter unten).
38
39 Um bei einem 2.6er Kernel eine bessere Leistung zu erzielen, müssen wir unter Sarge noch die TLS-Bibliothek (Thread Local Storage) verschieben. Selbiges sollte später auch bei den Gastsystemen unternommen werden.
40
41 * [[!format txt """
42 pablo@packman:~$ sudo mv /lib/tls /lib/tls.disabled
43 """]]VORSICHT: Bei einem Upgrade der GNU C-Bibliothek(en) wird dieser Schritt automatisch rückgängig gemacht. Für einen "nachhaltigen Weg" siehe: [[http://wiki.xensource.com/xenwiki/DebianTlsLibcDiversion|http://wiki.xensource.com/xenwiki/DebianTlsLibcDiversion]]
44 Dieser Schritt entfällt unter AMD64!
45
46 Zuletzt müssen wir noch ein [[initramfs|http://wiki.debian.org/initramfs]] Image selber generieren. Alternativ gibt es unter [[http://www.debian-administration.org/articles/396|http://www.debian-administration.org/articles/396]] eine Anleitung für Xen mit mkinitrd. Die althergebrachte [[InitRamDisk|http://wiki.debian.org/Initrd]] wird jedoch zunehmend von initramfs abgelöst. Weitere Infos hierzu gibt es unter:
47
48 * [[InitrdReplacementOptions - Debian Wiki|http://wiki.debian.org/InitrdReplacementOptions]] [[!format txt """
49 pablo@packman:~$ sudo update-initramfs -c -k 2.6.16-1-xen0
50 """]]oder: [[!format txt """
51 pablo@packman:~$ sudo mkinitrd /boot/initrd-2.6.16-1-xen0.img 2.6.16-1-xen0
52 """]]
53
54 ### Custom
55
56 Wir nehmen ein minimales Debian GNU/Linux 3.1 "Sarge", besorgen uns die Xen-Sourcen und kompilieren die Xen-Tools samt Kernel. Die GNU C Library sollte möglichst aktuell sein. Zum Entpacken des Xen-Tarballs benötigen wir gzip, für den Kernel bzip2 und zum Holen benötigen wir das Paket bittorrent. Der 'Compiler results cacher' ccache beschleunigt das Kompilieren von C/C++ Code, indem bei erneutem Umsetzen dort fortgesetzt wird, wo der Kompiliervorgang zuvor unterbrochen wurde. Zum grafischen Einstellen der Kernel-Settings brauchen wir ncurses-dev. Siehe auch:
57
58 * [[What Debian packages do I need for Xen?|http://wiki.xensource.com/xenwiki/XenFaq#head-fed1b310b70f97c7691d4cde77d653441dc4eeaf]] [[!format txt """
59 pablo@packman:~$ sudo aptitude install gzip bzip2 ccache libc6 libc6-dev bittorrent ncurses-dev
60 """]]
61 Um ccache im Pfad zu haben, müssen wir noch einen kleinen Hack machen. Folgendes gilt für die GNU Bourne Shell - äquivalent für Z Shell et.al.
62
63 * [[!format txt """
64 pablo@packman:~$ editor .bash_profile
65 """]][[!format txt """
66 if [ -d /usr/lib/ccache ] ; then
67     PATH=/usr/lib/ccache:"${PATH}"
68 fi
69 """]]
70 Nun holen wir uns Xen. Den aktuellen [[BitTorrent|BitTorrent]]-Link bekommen wir unter: [[http://www.xensource.com/xen/downloads/dl_x30tarball_bt.html|http://www.xensource.com/xen/downloads/dl_x30tarball_bt.html]]
71
72 Anschließend entpacken wir den Tarball. Prinzipiell kann das alles als User erfolgen.
73
74 * [[!format txt """
75 pablo@packman:~$ cd src/
76 pablo@packman:~/src$ btdownloadcurses http://tx.downloads.xensource.com/torrents/xen-3.0.2-src.tgz.torrent
77 pablo@packman:~/src$ tar xfz xen-3.0.2-src.tgz
78 """]]
79 Bevor wir Xen kompilieren, öffnen wir auf einer zweiten virtuellen Kosole, einem zweiten Terminalfenster oder am besten in GNU Screen ccache. Falls der Compile-Vorgang unterbrochen wird, sollte bei einem zweiten Versuch unter 'cache hit' 1 statt 0 stehen.
80
81 * [[!format txt """
82 pablo@packman:~/src$ screen watch ccache -s
83 C-a C-c
84 pablo@packman:~/src$ make
85 """]]
86 Nachdem wir uns nun ein paar Tassen Kaffee oder mehrere Chips-Packerl gegönnt haben und unser Prozessor warmgelaufen ist, haben wir den längsten Teil hinter uns. Nun müssen wir noch einen Linux-Kernel für Xen bauen. Xen selbst bootet erst einen Mikrokernel, der in Folge den Linux-Betriebssystemkern aufruft.
87
88 [[KlausIta]] empfiehlt, sicherzustellen, ob alle benötigten Module aktiviert sind und ext3fs-Unterstützung (rootfs) fix in den Kernel zu integrieren. Außerdem sollten SATA bzw. SCSI aktiviert werden, falls benötigt. Für weitere Hilfe zum Kernel Bauen mit make-kpkg, sprich "The Debian Way", könnten die unteren Abschnitte des folgenden Dokuments hilfreich sein.
89
90 * [[Creating custom kernels with Debian's kernel-package system|http://newbiedoc.sourceforge.net/system/kernel-pkg.html]] [[!format txt """
91 pablo@packman:~/src$ cd linux-2.6.16-xen/
92 pablo@packman:~/src/linux-2.6.16-xen$ make menuconfig
93 pablo@packman:~/src/linux-2.6.16-xen$ cd ..
94 pablo@packman:~/src$ make dist
95 """]]
96 Im Folgenden können wir Xen installieren ...
97
98 * [[!format txt """
99 pablo@packman:~/src$ cd xen-3.0.2
100 pablo@packman:~/src/xen-3.0.2$ make world
101 pablo@packman:~/src/xen-3.0.2$ make install
102 """]]
103 Nun haben wir den Xen Hypervisor, einen Kernel und die Xen-Tools. Zuletzt müssen wir die Xen-Dienste registrieren und einen Boot-Eintrag in GRUB, dem GNU Grand Unified Bootloader, vornehmen. Solltest du keine eigene /boot-Partition haben, bitte unbedingt die Pfade anpassen. Außerdem sollten gegebenfalls root= und die Dateinamen an das eigene System angepasst werden. Sollte das alles Neuland für dich sein, siehe hier für weiterführende Links: [[http://wiki.debian.org/GRUB|http://wiki.debian.org/GRUB]]
104
105 * [[!format txt """
106 pablo@packman:~/src/xen-3.0.2$ sudo update-rc.d xend defaults 20 21
107 pablo@packman:~/src/xen-3.0.2$ sudo update-rc.d xendomains defaults 21 20
108 pablo@packman:~/src/xen-3.0.2$ sudoedit /boot/grub/menu.lst
109 """]][[!format txt """
110 ### END DEBIAN AUTOMAGIC KERNELS LIST
111
112 # boot xen vm host
113 title           Xen
114 root            (hd0,0)
115 kernel          /xen-3.0-i386.gz
116 module          /vmlinuz-2.6.16-1-xen root=/dev/hda1 ro console=tty0
117 module          /initrd.img-2.6.16-1-xen
118 """]]
119
120 ### Konfiguration
121
122 Wir können die dom0 nun rebooten und Xen starten. Nicht vergessen, unter GRUB den richtigen Eintrag auszuwählen! ;-)
123
124 Folgende kleine Eingriffe müssen eventuell vorgenommen werden:
125
126 * Netzwerkeinstellungen unter /etc/network/interfaces von DHCP auf statisch ändern. (don't forget: /etc/init.d/networking restart)
127 * Die Nameserver in /etc/resolv.conf anpassen.
128 * Unter /etc/hostname den Namen des Hosts bzw. der dom0 eintragen.
129 * Ist eine Netzwerk-Bridge erwünscht, muss die natürlich auch unter /etc/network/interfaces angegeben werden. [[!format txt """
130  pre-up brctl addbr xenbr0
131  pre-up brctl addif xenbr0 eth0
132  post-down brctl delbr xenbr0
133 """]]
134 Weitere Infos zu Debian und network-bridge:
135
136 * [[Anleitung zum Absichern von Debian - Aufsetzen einer überbrückenden Firewall (bridge Firewall)|http://www.debian.org/doc/manuals/securing-debian-howto/ap-bridge-fw.de.html]]
137 * [[QEMU - Debian - Linux - TUN/TAP - network bridge|http://compsoc.dur.ac.uk/~djw/qemu.html]] [[!format txt """
138 pablo@packman:~$ apt-cache show bridge-utils
139 Package: bridge-utils
140 Priority: optional
141 Section: net
142 Installed-Size: 148
143 Maintainer: Santiago Garcia Mantinan <manty@debian.org>
144 Architecture: i386
145 Version: 1.0.4-1
146 Depends: libc6 (>= 2.3.2.ds1-4), libsysfs1
147 Recommends: ifupdown
148 Conflicts: ifupdown (<< 0.6.0)
149 Filename: pool/main/b/bridge-utils/bridge-utils_1.0.4-1_i386.deb
150 Size: 26900
151 MD5sum: ef7bd97c308bc0291f6584f557abecf9
152 Description: Utilities for configuring the Linux ethernet bridge
153  This package contains utilities for configuring the Linux ethernet
154  bridge in Linux 2.4 or later. The Linux ethernet bridge can be used
155  for connecting multiple ethernet devices together. The connecting is
156  fully transparent: hosts connected to one ethernet device see hosts
157  connected to the other ethernet devices directly.
158 """]]
159 Wir können nun den Xen-Domänendienst starten. Eventuell muss hier noch eine Änderung vorgenommen werden.
160
161 * [[!format txt """
162 pablo@packman:~$ sudo /etc/init.d/xendomains start
163 touch: kann ,,/var/lock/subsys/xendomains" nicht berühren: Datei oder Verzeichnis nicht gefunden
164 """]]
165 Falls bei dir derselbe Fehler auftritt, musst du einfach nur das Verzeichnis anlegen, in das die Datei xendomains geschrieben werden soll.
166
167 * [[!format txt """
168 pablo@packman:~$ sudo mkdir -p /var/lock/subsys/
169 """]]
170 Anschließend legen wir fest, wo unsere Virtual Machines liegen werden, welche IP unser Server (Gateway) hat, wo der Kernel liegt und dergleichen mehr.
171
172 * [[!format txt """
173 pablo@packman:~$ sudo mkdir -p /srv/xen
174 pablo@packman:~$ sudoedit /etc/xen-tools/xen-tools.conf
175 """]][[!format txt """
176 dir     = /srv/xen
177 size    = 2Gb
178 memory  = 128Mb
179 swap    = 128Mb
180 fs      = ext3
181 dist    = sarge
182 gateway = 192.168.1.1
183 netmask = 255.255.255.0
184 passwd  = 1
185 initrd  = /boot/initrd.img-2.6.16-1-xen
186 kernel  = /boot/vmlinuz-2.6.16-1-xen
187 mirror  = http://ftp.at.debian.org/debian/
188 """]]
189
190 ## Gast (domU)
191
192
193 ### VM-Image
194
195 Sollte bis jetzt alles erfolgreich gewesen sein, können wir nun testweise ein Gastsystem aufsetzen. In den meisten Howtos wird dazu erst mit dd ein Image erstellt, dann partitioniert und über loop gemountet, und anschließend mit dbootstrap ein System aufgespielt. Dieses Image könnte nun beliebig oft kopiert werden und als Basis für verschiedenste Server u.dergl. verwendet werden.
196
197 Optional kann auch mit xen-create-image ein Image erstellt werden. Danach wird der Xen-Dienst gestartet und die Xen-Mashine mit Hilfe von xm erstellt.
198
199 * [[!format txt """
200 pablo@packman:~$ sudo xen-create-image --dir=/srv/xen --size=2Gb --swap=128Mb --memory=128Mb --fs=ext3 --cache=yes --dist=etch --hostname=debiennerl --dhcp --initrd=/boot/initrd.img-2.6.16-1-xen --kernel=/boot/vmlinuz-2.6.16-1-xen- --mirror=http://http://ftp.at.debian.org/debian/
201 pablo@packman:~$ sudo xend start
202 pablo@packman:~$ sudo xm create debiennerl -c
203 """]]
204 Einfacher als das manuelle Erstellen einer VM kann es sein, ein bestehendes System zu übernehmen: Entweder mittels dd in ein Image schreiben, oder ein bestehendes Logical Volume einer Linux LVM in Xen einbinden. Das ganze muss nur noch in die Konfigurationsdatei eingetragen werden und schon kann's losgehen!
205
206 * [[!format txt """
207   #  -*- mode: python; -*-
208   kernel = "/boot/vmlinuz-2.6.16-1-xen"
209   ramdisk = "/boot/initrd.img-2.6.16-1-xen"
210   memory = 128
211   name = "debiennerl"
212   vif = [['|bridge=xenbr0' ]]
213   disk = ['phy:/dev/debiennerl/root,hda1,w','phy:/dev/lvmxen/domu1-swap,hda2,w']
214   ip="192.168.1.100"
215   netmask="255.255.255.0"
216   gateway="192.168.1.1"
217   hostname = "debiennerl"
218   root = "/dev/mapper/debiennerl-root ro"
219   extra = "4"
220 """]]
221
222 ### LVM
223
224 Sollte der Einsatz von Logical Volumes erwünscht aber LVM noch nicht eingerichtet sein, musst du folgendes machen: LVM Partition anlegen (mit cfdisk, gparted o.ä.), LVM 2 Tools installieren, Volume Group anlegen, Logical Volumes anlegen und formatieren. Zum Verwalten von LVMs kann alternativ auch evmsn (ncurses) bzw. emvsgui (gtk) verwendet werden.
225
226 Überprüfen der Partitionstabelle:
227
228 * [[!format txt """
229 redtux@testix:~$ fdisk -l /dev/sda
230
231 Platte /dev/sda: 122.9 GByte, 122942324736 Byte
232 16 Köpfe, 63 Sektoren/Spuren, 238216 Zylinder
233 Einheiten = Zylinder von 1008 × 512 = 516096 Bytes
234
235    Gerät  boot.     Anfang        Ende     Blöcke   Id  System
236 /dev/sda1   *           1         705      355288+  83  Linux
237 /dev/sda2             706      238216   119705544    f  W95 Erw. (LBA)
238 /dev/sda5             706        2737     1024096+  83  Linux
239 /dev/sda6            2738      238216   118681384+  8e  Linux LVM
240 """]]
241 LVM einrichten:
242
243 * [[!format txt """
244 redtux@testix:~$ sudo aptitude install lvm2
245 redtux@testix:~$ sudo pvcreate /dev/sda6
246 redtux@testix:~$ sudo vgcreate vserver /dev/sda6
247 redtux@testix:~$ sudo lvcreate -L1000 -nroot vserver
248   Logical volume "root" created
249 redtux@testix:~$ sudo lvcreate -L1G -nswap vserver
250   Logical volume "swap" created
251 redtux@testix:~$ sudo lvscan -v
252     Finding all logical volumes
253   ACTIVE            '/dev/vserver/root' [[1000,00|MB]] inherit
254   ACTIVE            '/dev/vserver/swap' [[1,00|GB]] inherit
255 redtux@testix:~$ sudo mkfs.ext3 -L xen-dom0 /dev/vserver/root
256 redtux@testix:~$ sudo swapon -v /dev/vserver/swap
257 swapon für /dev/vserver/swap
258 redtux@testix:~$ sudo swapon -s
259 Filename                          Type            Size    Used    Priority
260 /dev/hdb8                         partition       562424  165328  -1
261 /dev/hda5                         partition       248968  0       -2
262 /dev/mapper/vserver-swap          partition       1048568 0       -3
263 """]]
264
265 ### Sonstiges
266
267 Damit eine Xen VM beim Hochfahren des Hosts automatisch gestartet wird, muss ein Link in /etc/xen/auto/ erstellt werden.
268
269 * [[!format txt """
270 pablo@packman:~$ sudo ln -s /etc/xen/debiennerl /etc/xen/auto/
271 """]]
272 Um die laufenden VMs anzuzigen, gibt es den befehl 'xm list'.
273
274 * [[!format txt """
275 pablo@packman:~$ xm list
276 Name                              ID Mem(MiB) VCPUs State  Time(s)
277 Domain-0                           0       64     1 r-----   112.0
278 debiennerl                         3      128     1 ------    27.4
279 """]]
280 Mit 'xm console <ID>' gelangen wir auf die Konsole der jeweiligen VM.
281
282 * [[!format txt """
283 pablo@packman:~$ xm console 3
284 """]]
285 Weitere Tipps folgen (hoffentlich) mit der Zeit.
286
287
288 ## Siehe auch
289
290 * [[The Perfect Xen 3.0 Setup For Debian|http://www.howtoforge.com/perfect_setup_xen3_debian]]
291 * [[Xen Wiki|http://wiki.xensource.com/xenwiki/]]
292 * [[xen live migration|http://aipc54.ai.wu-wien.ac.at/cgi-bin/blosxom/2006/05/20]]
293
294
295  [[!tag CategoryVortragsUnterlagen]]