NetBSD/xen-HOWTO

BSD daemon

Einleitung

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.


NetBSD-Installation als domain0

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.
      

Unprivilegierte Domains erstellen

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.

Erstellen von unprivilegierten Linux-Domains

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.

Verwenden von PCI-Geräten in Gast-Domains

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.

Änderungen für Xen3

Es gibt kaum Unterschiede zwischen der Xen2 und der Xen3-Installation und -Konfiguration (abgesehen von der Installation der xentools30 und xenkernel30 anstelle derer mit der Endung 20)
  • Zusätzlich zu xend starten Sie xenbackendd in der domain0 (das Paket enthält ein entsprechendes rc.d Skript). Von xenbackendd werden die Skripte in /usr/pkg/etc/xen/scripts aufgerufen sobald ein neues Gerät erstellt oder zerstört wird (Die Skriptnamen sind in xend-config.sxp festgelegt).
  • Sie können PCI-Geräte weder aus einer NetBSD dom0 exportieren, noch können PCI-Geräte in unprivilegierten NetBSD-Gästen verwendet werden. Wenn dieses notwendig ist müssen Sie Xen2 verwenden.

Links und weitere Informationen


Zurück zu  NetBSD/xen Port Page

(contact us)   Generated from %NetBSD: howto.xml,v 1.23 2006/11/21 23:44:55 hubertf Exp %
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.
NetBSD® is a registered trademark of The NetBSD Foundation, Inc.