|
Xen ist ein VirtualMachine-Monitor für x86 (läuft nur auf i686-class CPUs), der den Einsatz verschiedenster Gast-Betriebssysteme auf einem einzelnen Computer unterstützt. Gast-Betriebssysteme (so genannte „domains“) benötigen einen angepassten Kernel, welcher Xen hypercalls für die Verbindung zur Hardware unterstützt. Der Xen-Kernel wird beim booten (via grub) des Gastbetriebssystems der ersten domain ( domain0 genannt) geladen. Die domain0 besitzt Privilegien, um die Hardware (PCI- und ISA-Geräte) zugänglich zu machen, andere Domains zu administrieren und virtuelle Geräte (Festplatten und Netzwerk) anderen Domains zur Verfügung zu stellen. Für mehr Details siehe http://www.cl.cam.ac.uk/Research/SRG/netos/xen/.
NetBSD kann sowohl für das Gastbetriebssystem
domain0 als auch für andere,
unprivilegierte Domains verwendet werden. (tatsächlich kann
es mehrere privilegierte Domains geben, die den unprivilegierten
Domains unterschiedliche Teile der Hardware als virtuelle
Geräte zur Verfügung stellen. Wir sprechen nur über
den Fall einer privilegierten Domain, und zwar der
domain0). Diese domain0
sieht physikalische Geräte ganz wie ein regulärer
i386-Kernel und besitzt die physikalische Konsole (VGA oder
Seriell). Unprivilegierte Domains sehen nur eine zeichenbasierte
virtuelle Konsole, virtuelle Festplatten (xbd) und
virtuelle Netzwerkschnittstellen (xennet), die von
einer privilegierten Domain (normalerweise
domain0) bereitgestellt werden.
xbd-Geräte werden mit physikalischen Block-Geräten (zum
Beispiel eine Partition einer Festplatte, Raid, ccd, ...
Geräte) in den privilegierten Domains verbunden. Die
xennet-Geräte werden an virtuelle Geräte der
privilegierten Domain angeschlossen. Die Benennung ist wie folgt
aufgebaut: xvif<domain Nummer>.<if-Nummer für diese
Domain> (Beispiel: xvif1.0). Beide, xennet- und
xvif-Geräte, werden wie reguläre Netzwerk-Geräte
gesehen (sie können wie ein Crossover-Kabel zwischen 2
Computern betrachtet werden), ihnen können Adressen
zugewiesen (und geroutet oder NATed, gefiltert mit IPF, usw. ...)
oder als Teil einer Bridge hinzugefügt werden.
Zuerst installieren Sie NetBSD/i386 in der Version 3.0 (oder neuer) wie sonst auch auf i386 Hardware. Die binäre i386 Version erhalten Sie unter ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-3.0/i386/ weitere Binär-Snapshots werden unter ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-daily/ zur Verfügung gestellt. Bei der Partitionierung sollten Sie daran denken, ggf. zusätzliche Partitionen für virtuelle Domains zu reservieren. Alternativ können auch große Dateien erstellt werden, die zu vnd(4)-Geräten gemappt und diese vnd-Geräte zu anderen Domains exportiert werden.
Die nächsten Schritte sind die Installation der Pakete
sysutils/grub und sysutils/xentools20. Grub wird für das
Laden der xen und domain0-Kernel
benötigt; xentools20 enthält Dienstprogramme, um xen aus
der domain0 heraus zu steuern.
Danach wird der Xen 2.0 Kernel selbst benötigt. Sie
erhalten eines der unterstützten Binärpakete von http://www.cl.cam.ac.uk/Research/SRG/netos/xen/downloads/. (Laden Sie z.B. die Datei
xen-2.0.7-install-x86_32.tgz herunter.) Entpacken
Sie hieraus die Datei xen.gz und kopieren Sie
diese in das root-Dateisystem.
Nun brauchen Sie den NetBSD/Xen-Kernel für die
domain0 im root Ihres Dateisystems. Hierzu
kann der XEN2_DOM0-Kernel (XEN0 in NetBSD 3.0) verwendet werden, der als Teil der
i386-Binärkernel bereitgestellt wird; allerdings könnten
Sie diesen anpassen wollen. Behalten Sie den NetBSD/i386-Kernel
bei, er könnte für einen Recovery-Fall hilfreich sein.
Hinweis: Stellen Sie sicher, dass der Kernel KERNFS
unterstützt und /kern bereits gemountet
ist.
Anschließend installieren Sie Grub, um den
xen.gz-Kernel, ebenso wie den NetBSD
domain0-Kernel, als Modul laden zu
können. In der Grub-Konfiguration wird unter anderem
definiert, wieviel Speicher domain0
zugewiesen wird, welche Konsole verwendet wird, etc ...
Hier ist eine selbsterklärende
Beispiel-Konfigurationsdatei
(/grub/menu.lst):
# Grub-Konfigurationsdatei für NetBSD/xen. Speichern Sie diese als /grub/menu.lst und führen
# Sie den Befehl "grub-install /dev/rwd0d" aus (Vorausgesetzt, Sie booten von wd0).
#
# Standardmässig sollte der erste Eintrag geladen werden.
default=0
# Nach 10 Sekunden soll der vorgegebene Eintrag ausgeführt werden wenn der
# Anwender keine andere Taste als Enter während dieser Zeit betätigt.
timeout=10
# Konfiguriere den seriellen Port zur Verwendung als Konsole.
# Ignoriere dies, wenn nur VGA verwendet wird
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
# Der Anwender soll zwischen serieller und VGA-Konsole wählen können,
# vorgegeben wird VGA nach 10 Sekunden
terminal --timeout=10 vga console
# Ein Eintrag für NetBSD/xen. Verwendet wird /netbsd als der domain0 Kernel,
# und die VGA-Konsole. Domain0 werden 64MB RAM zugewiesen.
# Ausgehend davon, dass NetBSD in der ersten MBR Partition installiert ist.
title Xen 2.0 / NetBSD (hda0, vga)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536
module (hd0,a)/netbsd root=/dev/hda1 ro console=tty0
# Ebenso wie zuvor, allerdings unter Verwendung der seriellen Konsole.
# Wir können console=tty0 (Linux syntax) oder console=pc (NetBSD syntax) verwenden.
title Xen 2.0 / NetBSD (hda0, serial)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536 com1=115200,8n1
module (hd0,a)/netbsd root=/dev/hda1 ro console=ttyS0
# NetBSD/xen verwendet einen Backup-domain0-Kernel (für den Fall, dass ein Kernel
# als /netbsd installiert wurde, der nicht funktioniert.
title Xen 2.0 / NetBSD (hda0, backup, VGA)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536
module (hd0,a)/netbsd.backup root=/dev/hda1 ro console=tty0
title Xen 2.0 / NetBSD (hda0, backup, serial)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536 com1=115200,8n1
module (hd0,a)/netbsd.backup root=/dev/hda1 ro console=ttyS0
# Laden eines regulären NetBSD/i386-Kernel.
# Kann hilfreich sein, wenn ein nicht funktionsfähiger /xen.gz
# eingesetzt wurde. Anmerkung: Verwenden Sie hierzu eine Kopie eines
# funktionierenden Kernels aus der Basisinstallation.
title NetBSD 3.0 BETA
root (hd0,a)
kernel --type=netbsd /netbsd-GENERIC
# Laden des NetBSD-Bootloaders, wobei der NetBSD/i386-Kernel geladen wird.
# Könnte vorteilhafter als der vorherige Eintrag sein, da grub nicht alle benötigten
# Infos zum NetBSD/i386-Kernel (z. B. Konsole, root device, ...) durchläuft.
title NetBSD chain
root (hd0,0)
chainloader +1
## Ende der Grub-Konfigurationsdatei.
Nachdem domain0 läuft, starten Sie
den xentool-Dienst (/usr/pkg/share/examples/rc.d/xend
start). Stellen Sie sicher, dass die Dateien
/dev/xencons und
/dev/xenevt existieren, bevor
xend gestartet wird. Diese Dateien können
mit folgendem Befehl erstellt werden:
# cd /dev && sh MAKEDEV xen
xend protokolliert nach
/var/log/xend.log und
/var/log/xend-debug.log. xen kann mit dem xm
tool gesteuert werden. Der Befehl 'xm list' zeigt ähnliches
wie folgendes:
# xm list Name Id Mem(MB) CPU State Time(s) Console Domain-0 0 64 0 r---- 58.1
Die gesamte Kommunikation zwischen xend und xm findet über TCP-Sockets statt. Hierbei hört xend auf die Ports 8000, 8001 und 8002. Jeder könnte xen über diese Ports steuern; daher wird empfohlen, diese Ports unter domain0 dahingehend zu filtern (verwende IPF oder PF), dass nur von 127.0.0.1 und in der Berechtigung eingeschränkte Anwender sich bei der domain0 einloggen können.
Der Befehl 'xm create' ermöglicht das Erstellen einer
neuen Domain. Die Parameter werden hierbei aus einer
Konfigurationsdatei im PKG_SYSCONFDIR ausgelesen (normalerweise
/usr/pkg/etc/xen/). Beim Erstellen muss ein
Kernel angegeben werden, der in der neuen Domain ausgeführt
wird. (Dieser Kernel liegt im Dateisystem von
domain0 und nicht auf der virtuellen
Festplatte der neuen Domain. Sie sollten jedoch den selben Kernel
in der domainU als /netbsd
installieren, um System-Tools wie savecore(8) verwenden zu können.)
Ein anwendbarer Kernel wird als Teil der i386-Binärpakete
bereitgestellt. Dieser Kernel hat die
Bezeichnung XEN2_DOMU (XENU in NetBSD 3.0).
Hier ist ein Beispiel der Konfigurationsdatei
/usr/pkg/etc/xen/nbsd:
# -*- mode: python; -*- #============================================================================ # Python Standard-Setup für 'xm create'. # Bearbeiten Sie diese Datei entsprechend der Konfguration Ihres Systems. #============================================================================ #---------------------------------------------------------------------------- # Kernel-Imagedatei. Dieser Kernel wird in der neuen Domain geladen. # Verwenden Sie den zweiten statt des ersten Kernels für die # NetBSD-Installation in einer neuen Domain. kernel = "/home/bouyer/netbsd-XEN2_DOMU" #kernel = "/home/bouyer/netbsd-INSTALL_XEN2_DOMU" #kernel = "/home/bouyer/netbsd-XENU" # in NetBSD 3.0 #kernel = "/home/bouyer/netbsd-INSTALL_XENU" # in NetBSD 3.0 # Zuweisung des Arbeitsspeicher (in Megabyte) für die neue Domain. memory = 128 # Hier wird ein Name für die neue Domain vergeben, der u. a. als # Bezeichnung in der Ausgabe des Befehls 'xm list' erscheint. Diese # Bezeichnung kann anstelle der Domain-Nummer als Parameter # für xm-Befehle verwendet werden. # Achte daher darauf, dass sich dieser Wert von denen anderer # Konfigurationsdateien unterscheidet. name = "nbsd" # Welche CPU soll zum Starten der Domain verwendet werden? # Nur bei SMP-Hardware relevant. Die Nummerierung der Prozessoren # beginnt bei 0. Wenn z.B. der 2. von 2 Prozessoren für # diese Domain zugewiesen werden soll verwende den Wert 1. cpu = -1 # behalte diesen Wert bei, um Xen die Auswahl zu überlassen. #---------------------------------------------------------------------------- # Netzwerkschnittstellen für die neue domain. # Anzahl der Netzwerkschnittstellen (muss mindestens 1 sein). Standard ist 1. nics=1 # Definiere MAC-Adresse und/oder Bridge für die Netzwerkschnittstelle. # # Zufällige MAC-Adressen werden vergeben, sofern keine zugewiesen wird. # Die als Wert von ``mac'' zugewiesene MAC-Adresse wird von der Schnittstelle # der neuen Domain verwendet. Die Schnittstelle in domain0 verwendet diese # Adresse ge-xor-t mit 00:00:00:01:00:00 (z.B. aa:00:00:51:02:f0 in unserem Beispiel). # Sofern keine MAC-Adresse angegeben ist wird eine zufällig generierte # Adresse zugewiesen. # # Wenn xend(8) eine neue Domain erstellt, wird das vif-Script aufgerufen, # um die xvif-Schnittstelle in domain0 zu konfigurieren. Hierbei wird der # erforderliche Parameter 'bridge' an das vif-Script übergeben. # # In diesem Beispiel wird xvif der bridge0 hinzugefügt, welche konfiguriert # sein sollte bevor die neue domain erstellt wird. Entweder im ``network''-Skript # oder unter Verwendung der Datei /etc/ifconfig.bridge0. # dafür aber mit einer privaten Adresse konfiguriert. vif = [ 'mac=aa:00:00:50:02:f0, bridge=bridge0' ] #---------------------------------------------------------------------------- # Die Festplatte, auf die die Domain Zugriff haben soll und wie diese # erreichbar sein wird. # Jeder Eintrag hat das Format: # # phy:DEV,VDEV,MODE # # wobei DEV für das Gerät steht. VDEV ist der Name, den die Domain # sehen wird; anstelle von MODE wird "r" für nur lesenden oder "w" für # lesenden und schreibenden Zugriff angegeben. Sofern die neue Domain innerhalb # einer Datei statt einer eigenen Partition erzeugt werden soll, hat der Eintrag # das Format: # # file:PATH,VDEV,MODE # # VDEV ist nicht wirklich relevant für NetBSD-Gastbetriebssysteme, aber # für Linux. Unangenehmer ist, dass das Gerät in /dev/ der domain0 # vorhanden sein muss, weil xm einen stat() (Statusabfrage) darauf versuchen # wird. Das bedeutet, dass Sie zum Laden eines Linux-Gastbetriebssystem aus # einer NetBSD-domain0 die Geräte /dev/hda1, /dev/hda2, ... unter domain0 # mit den Gerätenummern (major/minor) von Linux erstellen müssen. # Alternativ ist es möglich die Gerätenummer in Hexadezimalformat # anzugeben, z.B. 0x301 für /dev/hda1 oder 0x302 für /dev/hda2, etc ... disk = [ 'phy:/dev/wd0e,wd0d,w' ] #disk = [ 'file:/var/xen/nbsd-disk,wd0d,w' ] #disk = [ 'file:/var/xen/nbsd-disk,0x301,w' ] #---------------------------------------------------------------------------- # Kernel-Befehlszeile für die neue Domain. # Setze das root Gerät. Dieses ist für NetBSD wichtig. root = "/dev/wd0d" # Weitere Parameter, die an den Kernel übergeben werden. # Hier können Boot-Flags wie -s, -a, etc. verwendet werden. #extra = "" #---------------------------------------------------------------------------- # Definiere, ob die Domain neu gestartet werden soll, wenn sie beendet wird. # Die Vorgabe ist False (also kein automatischer Neustart nach dem Beenden). #autorestart = True # Ende der nbsd-Konfigurationsdatei =========================================
Wurde eine neue Domain erstellt, so ruft xen für jede
virtuelle Netzwerkkarte der domain0 ein
Script auf (/usr/pkg/etc/xen/vif-bridge).
Dieses Script kann verwendet werden, um automatisch die
xvif?.?-Schnittstelle der domain0 zu konfigurieren.
In diesem Beispiel wird eine Bridge anhand des, in der domain0
erzeugten, bridge0-Gerätes generiert.
Die bridge muss jedoch im Vorfeld vorhanden sein.
Erstellen Sie hierzu die Datei /etc/ifconfig.bridge0
mit folgendem Inhalt:
create !brconfig $int add ex0 up
(Ersetzen Sie ex0 durch den Namen Ihrer Netzwerkkarte).
Anschließend wird die bridge bei jedem boot-Vorgang erzeugt.
Weitere Detail-Informationen erhalten Sie in der man page bridge(4)
Das Folgende ist eine brauchbare
/usr/pkg/etc/xen/vif-bridge
für die xvif?.? Konfiguration (eine funktionierende vif-bridge wird mit
xentools20 mitgeliefert):
#!/bin/sh
#============================================================================
# /usr/pkg/etc/xen/vif-bridge
#
# Script zur Konfiguration von vif im Modus "bridged" anhand einer dom0-Schnittstelle.
# Der xend(8)-Dienst ruft ein vif-Script auf wenn vif "up" oder "down" geht.
# Der zu verwendende Skriptname ist im Bereich ``vif-script'' der Datei
# /usr/pkg/etc/xen/xend-config.sxp festgelegt.
#
# Aufruf:
# vif-bridge up|down [var=value...]
#
# Aktion:
# up Fügt die vif-Schnittstelle zur Bridge hinzu.
# down Entfernt die vif-Schnittstelle von der Bridge.
#
# Variablen:
# domain Name der Domain, deren Schnittstelle "on" ist (wird benötigt).
# vif vif Schnittstellen-Name (wird benötigt).
# mac vif MAC-Addresse (wird benötigt).
# bridge Bridge zum Hinzufügen der vif (wird benötigt).
#
# Beispiel:
# vif-bridge up domain=VM1 vif=xvif1.0 mac="ee:14:01:d0:ec:af" bridge=bridge0
#
#============================================================================
# Beenden, sobald etwas schiefgeht.
set -e
# Dies wird protokolliert in xend-debug.log
echo "vif-bridge $*"
# Betriebsbezeichnung ("up" oder "down").
OP=$1; shift
# Übertragen der Variablen aus args in die Umgebung
for arg ; do export "${arg}" ; done
# Benötigte Parameter. Läuft auf Fehler wenn nicht gesetzt.
domain=${domain:?}
vif=${vif:?}
mac=${mac:?}
bridge=${bridge:?}
# Optionale Parameter. Setzt Vorgaben.
ip=${ip:-''} # Standardmässig ist der Wert null (bleib tatenlos)
# Gehen wir "up" oder "down"?
case $OP in
up) brcmd='add' ;;
down) brcmd='delete' ;;
*)
echo 'Invalid command: ' $OP
echo 'Valid commands are: up, down'
exit 1
;;
esac
# Bleibe tatenlos wenn der Wert von Bridge "null" ist.
if [ "${bridge}" = "null" ] ; then
exit
fi
# Bleibe tatenlos wenn keine Bridge vorhanden ist.
if ! ifconfig -l | grep "${bridge}" >/dev/null; then
exit
fi
# Hinzufügen/Entfernen von vif zum/von Bridge.
ifconfig x${vif} $OP
brconfig ${bridge} ${brcmd} x${vif}
#Ende von /usr/pkg/etc/xen/vif-bridge
Das Ausführen des folgenden Befehls sollte eine Domain
erstellen und hierin den in der Konfigurationsdatei
/usr/pkg/etc/xen/nbsd
angegebenen NetBSD-kernel laden:
xm create -c /usr/pkg/etc/xen/nbsd
(Hinweis: -c weist xm an, eine Verbindung zur
Konsole einer Domain aufzubauen, nachdem diese erstellt wurde).
Hierbei versucht der Kernel nun, sein root-Dateisystem in xbd0
(z. B. wd0e) zu finden, das jedoch noch nicht existiert. wd0e
wird als Festplatten-Gerät in der neuen Domain betrachtet
daher wird es "Unterpartitioniert". Wir können eine ccd an
wd0e anbinden, mit newfs(8) ein neues Dateisystem anlegen und
die NetBSD/i386-Binärarchive (binary sets)
hier entpacken, aber es gibt auch einen einfacheren Weg: Laden Sie
den Kernel netbsd-INSTALL_XEN2_DOMU
(netbsd-INSTALL_XENU in NetBSD 3.0),
der unter NetBSD/i386
zur Verfügung gestellt wird. Wie andere i386-Installationskernel
enthält er eine Ramdisk mit sysinst, damit
kann NetBSD unter Verwendung von sysinst in der
neuen Domain installiert werden. Hierzu muss jedoch temporär
der Eintrag in der Datei
/usr/pkg/etc/xen/nbsd angepasst werden. Hier
gibt es zwei Einträge für den Kernel, von denen der
zweite auskommentiert ist. Um jedoch den INSTALL-Kernel nutzen zu
können, muss die Raute vor dem zweiten Kernel-Eintrag
entfernt, dafür dem ersten Eintrag vorangestellt
werden.
Wenn NetBSD anhand eines CDROM-Images installiert werden soll,
müssen in /usr/pkg/etc/xen/nbsd
die folgenden Zeilen enthalten sein:
disk = [ 'phy:/dev/cd0a,cd0a,r', 'phy:/dev/wd0e,wd0d,w' ]
Nach dem Booten der Domain sollte der Gerätename des CD/DVD-ROM-Laufwerks in xbd1d geändert worden sein, sofern die Option zur Installation via CD/DVD-ROM übernommen wurde.
Anschließend führen Sie halt -p in der
neuen Domain aus (kein reboot oder halt;
INSTALL_XEN2_DOMU (INSTALL_XENU in NetBSD 3.0) wird jedesmal neu geladen, bis die
Konfigurationsdatei wieder angepasst wurde), wechseln zurück
zum XEN2_DOMU-Kernel (XENU in NetBSD 3.0) in der Konfigurationsdatei
/usr/pkg/etc/xen/nbsd und starten die neue
Domain erneut. Nun sollte es möglich sein, root on
xbd0a zu verwenden und Sie haben ein zweites,
funktionsfähiges NetBSD/i386-System unter der
xen-Installation.
Während des Boot-Vorgangs der neuen Domain sieht man
einige Warnungen hinsichtlich wscons und der
Pseudo-Terminals. Das können Sie verhindern, indem Sie die
Dateien /etc/ttys und
/etc/wscons.conf editieren. Sie sollten alle
Terminals, bis auf console, in
/etc/ttys wie folgt deaktivieren:
console "/usr/libexec/getty Pc" vt100 on secure ttyE0 "/usr/libexec/getty Pc" vt220 off secure ttyE1 "/usr/libexec/getty Pc" vt220 off secure ttyE2 "/usr/libexec/getty Pc" vt220 off secure ttyE3 "/usr/libexec/getty Pc" vt220 off secure
Abschließend müssen alle
screens in der Datei
/etc/wscons.conf auskommentiert werden.
Ebenso sollten Sie den folgenden Eintrag in der Datei rc.conf
hinzufügen bzw. entsprechend anpassen:
powerd=YES
Hierdurch wird die Domain korrekt heruntergefahren, wenn xm shutdown -R oder xm shutdown -H unter domain0 verwendet wird. Ihre Domain sollte nun bereit zur Nutzung sein, viel Spaß damit.
Es gibt keinen großen Unterschied zwischem dem Erstellen von unprivilegierten Linux-Domains und NetBSD-Domains, aber es gibt einige Dinge, die man beachten sollte.
Zu allererst der zweite Parameter bezüglich der Festplatte (die "wd0d" im unten stehenden Beispiel) bei Linux:
disk = [ 'phy:/dev/wd0e,wd0d,w' ]
Erwartet wird hier ein Linux-Gerätename (z. B. hda1).
Die xen-tools suchen diesen Namen im Verzeichnis /dev der domain0,
um die Gerätenummer zu erhalten. Glücklicherweise ist
es möglich, diesen Namen durch die Gerätenummer im
Hexadezimalformat anzugeben. Linux erstellt Gerätenummern als:
(major << 8 + minor). Somit hat hda1, mit major 3 und minor
1 auf Linux-Systemen, die Geräte-Nummer 0x301. Um eine
Partition für ein Linux-Gastsystem zu exportieren,
können wir folgendes anwenden:
disk = [ 'phy:/dev/wd0e,0x301,w' ] root = "/dev/hda1 ro"
Dadurch erscheint wd0e auf dem
Linux-System als hda1 und wird als
root-Partition verwendet.
Ein virtuelles Block-Gerät in der Linux-Domain kann nicht
partitioniert werden wie in einer NetBSD-Domain. Das bedeutet, dass
jede Partition, welche unter Linux verfügbar sein soll, vom
domain0-System aus exportiert werden muss. Normalerweise werden zwei Partitionen
benötigt (/ und swap). Dadurch ergibt sich ein ähnlicher
Eintrag in der Konfigurationsdatei wie:
disk = [ 'phy:/dev/wd0e,0x301,w', 'phy:/dev/wd0f,0x302,w' ]
Hierbei wird hda1 zu
/ und hda2 zu
swap.
Um Linux auf die Partition der Gast-Domain zu installieren,
kann die folgende Methode verwendet werden: Installieren Sie das
Paket sysutils/e2fsprogs aus
pkgsrc. Um die Root-Partition der Linux-Domain zu formatieren,
verwenden Sie mke2fs und mounten es dann.
Anschließend kopieren Sie die Dateien eines funktionierenden
Linux-Systems, führe Anpassungen in /etc
(fstab, Netzerk-Konfiguration) durch. Es
sollte ebenso möglich sein, Binärpakete wie
.rpm oder .deb direkt
auf die gemountete Partition zu entpacken, unter Verwendung des
passenden Tools, und sie in NetBSDs Linux-Emulation laufen zu
lassen. Nachdem das Dateisystem bekannt gemacht wurde, unmounten
Sie es. Wenn gewünscht, kann das Dateisystem unter Verwendung
von tune2fs -j in ein
ext3-Dateisystem konvertiert werden. Es
sollte nun möglich sein, die Linux-Gast-Domain zu booten,
wenn einer der vmlinuz-*-xenU-Kernel aus der
Xen-Binärdistribution verwendet wird.
Der Virtualisierungsmonitor (Hypervisor) ermöglicht den
Zugriff auf ausgewählte PCI-Geräte anderer Domains als
domain0. Dies kann zum Beispiel einer
unprivilegierten Domain den Zugriff auf eine Netzwerkkarte oder
einen Festplattencontroller ermöglichen. Bedenken Sie, dass das
Ermöglichen des Zugriffs auf ein PCI-Gerät einer Domain
ebenso Lese-/Schreibzugriff auf den physikalischen Speicher
bedeutet, da PCs keinen IOMMU für eingeschränkten Zugriff
auf DMA-fähige Geräte besitzen. Ebenso ist es nicht
möglich, ISA-Geräte zu unprivilegierten Domains zu
exportieren (das bedeutet, dass der primäre VGA-Adapter nicht
exportiert werden kann. Eine Gast-Domain, die versucht, auf die
VGA-Register zuzugreifen, gerät in einen sogenannten
panic-Zustand).
Vor dem Exportieren eines PCI-Gerätes zu einer Gast-Domain ist es empfehlenswert, den Virtualisierungsmonitor dahingehend zu konfigurieren, dass dieses PCI-Gerät von der domain0 nicht erkannt wird. Dies erreicht man mit der Option physdev_dom0_hide auf der boot-Kommandozeile. Das Format ist:
physdev_dom0_hide='(%02x:%02x.%1x)(%02x:%02x.%1x)...'
Wenn Sie zum Beispiel die Geräte PCI-Bus 0, Gerät 10, Funktion 2 und PCI-Bus 0, Gerät 6, Funktion 0 sowie PCI-Bus 1, Gerät 17, Funktion 0 unkenntlich machen wollen, geben Sie die Werte wie folgt an (Beachten Sie hierbei, daß die NetBSD-Kernelnachrichten diese Werte als Dezimal-Zahlen ausgibt, bei der Übergabe an physdev_dom0_hide jedoch als Hexadezimal-Zahlen interpretiert werden):
physdev_dom0_hide='(00:0A.2)(00:06.0)(01:11.0)'
Als nächstes bauen Sie einen domainU-Kernel mit Unterstützung für die Geräte, die Sie verwenden wollen. Hier ein Beispiel:
include "arch/i386/conf/XEN2_DOMU" #include "arch/i386/conf/XENU" # in NetBSD 3.0 # Hinzufügen von PCI-Bus-Unterstützung zum XEN2_DOMU-Kernel # (XENU in NetBSD 3.0): pci* at hypervisor? bus ? # Jetzt füge PCI und verbundene Geräte hinzu, die # von dieser Domain verwendet werden sollen. # USB-Controller und Geräte # PCI USB-Controller uhci* at pci? dev ? function ? # Universal Host Controller (Intel) # USB-Bus-Unterstützung usb* at uhci? # USB-Hubs uhub* at usb? uhub* at uhub? port ? configuration ? interface ? # USB Massenspeicher umass* at uhub? port ? configuration ? interface ? wd* at umass? # SCSI-Controller ahc* at pci? dev ? function ? # Adaptec [23]94x, aic78x0 SCSI # SCSI-Bus-Unterstützung (sowohl für ahc als auch umass) scsibus* at scsi? # SCSI-Geräte sd* at scsibus? target ? lun ? # SCSI disk drives cd* at scsibus? target ? lun ? # SCSI CD-ROM drives
Abschließend fügen Sie das PCI-Gerät zum Export der Konfigurationsdatei Ihrer Domain hinzu:
# Export der PCI-Geräte. Verwenden Sie die # Hexadezimal-Werte aus der Boot-Konfiguration. pci = [ '0,4,2','0,6,0' ]
Beim Booten sollten Sie, zusätzlich zu den üblichen
xbd und
xennet-Geräten, die PCI-Busse und die
Geräte sehen, die Sie exportiert haben.