HowTo: FreeNAS oder FreeBSD paravirtualisiert auf XenServer

Aus wiki.shutdown-system.de
Wechseln zu: Navigation, Suche

Herzlich Willkommen.

In diesem HowTo zeige ich wie man die Open Source Storage Platform FreeNAS paravirtualisiert auf dem Citrix XenServer laufen lassen kann.

Das ganze funktioniert unter FreeBSD 8.2, FreeBSD 9.0-RC2 und den Kernel kann man dann für FreeNAS verwenden.

Inhaltsverzeichnis

Vorbereitung

Um einen Xen fähigen Kernel für FreeNAS zu erstellen müssen wir diesen erst bauen. Da FreeNAS nicht die entsprechende Umgebung dafür liefert, werden wir den Kernel direkt auf einem FreeBSD bauen da FreeNAS auf FreeBSD basiert. Ich verwende FreeBSD 8.2.

Leider ist es mir z.Z. nicht mit der 64-Bit Version gelungen. Aus diesem Grund nehmen wir hier nur die 32-Bit-Versionen.

ISOs downloaden

Die beiden ISO-Files bitte herunterladen.

FreeBSD paravirtualisieren

Xen fähigen Kernel auf FreeBSD erstellen

Damit Ihr den Kernel erstellen könnt, müsst Ihr FreeBSD als HVM auf euren XenServer installieren.

Als Template eignet sich hier am besten "Other install media". Ich habe der VM eine CPU und 512MB RAM gegeben und eine Festplatte mit 15GB.

Installiert nun FreeBSD ganz normal.

FreeBSD-Anpassungen

FreeBSD User anlegen

Per SSH könnt Ihr per default leider nicht mit dem User "root" auf die neue VM. Aus diesem Grund empfehle ich erstmal über das XenCenter euch auf die VM einzuloggen und einen neuen User zu erstellen:

bsd-vm1# adduser 
Username: foobar
Full name: Foo Bar
Uid (Leave empty for default): 
Login group [foobar]:    
Login group is foobar. Invite foobar into other groups? []:      
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/foobar]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: 
Username   : foobar
Password   : *****
Full Name  : Foo Bar
Uid        : 1002
Class      : 
Groups     : foobar 
Home       : /home/foobar
Home Mode  : 
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (foobar) to the user database.
Add another user? (yes/no): no
Goodbye!
bsd-vm1# 

Danach erhält der User die Rechte um sich per SSH authentifizieren zu können:

bsd-vm1# pw user mod foobar -G wheel

Nochmal prüfen ob auch alles stimmt :)

bsd-vm1# groups foobar
foobar wheel

Perfekt! :) Das hat schonmal geklappt. Nun kann man sich per SSH mit dem User und dem vergebenen Passwort auf die VM einloggen und danach mit su die Root-Rechte erlangen:

host ~ $ ssh -l foobar bsd-vm1.irgendwas.de
Password:

$ su
bsd-vm1# 

So lässt es sich doch gleich viel besser arbeiten ;)

Build-Umgebung für den Kernel schaffen

Damit wir den Kernel bauen können, müssen wir noch ein paar Dinge nachinstallieren (wir brauchen die Sources).

Dafür verwenden wir das Tool sysinstall.

Einfach im Terminal sysinstall ausführen und dann folg. Navigieren:

-> Configure ->Distributions -> src -> und wählen base und sys an und installieren dann die Pakete.

Die Art der Installation bleibt euch überlassen (ich habe den deutschen FTP-Mirror gewählt).

Nach der installation sollte es nun das Xen-Configfile für den Kernel geben:

bsd-vm1# ls /usr/src/sys/i386/conf/XEN 
/usr/src/sys/i386/conf/XEN

Xen-Kernel bauen

Nur kommt endlich der große Schritt, wir bauen den XenKernel:

bsd-vm1# cd /usr/src/
bsd-vm1# make kernel KERNCONF=XEN

Das sollte eigentlich Problemlos durchlaufen. Der Kernel wird auch gleich nach /boot/kernel/kernel installiert.

Jetzt die VM nicht rebooten!

Vorher müssen wir den XenKernel noch auf unseren XenServer kopieren:

bsd-vm1# scp /boot/kernel/kernel root@<ip-vom-xenserver>:/root/

FreeBSD Anpassungen

  • fstab

In der /etc/fstab müssen wir nun noch ad0 oder ad1 durch xbd0 bzw. xbd1 ersetzen (bei FreeBSD-9.0-RC2 kann es auch ada0 oder ada1 sein).

Jenachdem was in der fstab drin steht. Macht man am besten gleich mit sed

bsd-vm1# sed -i 's/ad0/xbd0/g' /etc/fstab
bsd-vm1# sed -i 's/ad1/xbd1/g' /etc/fstab
  • ttys

Dann editieren wir noch die /etc/ttys und fügen folg. Zeile hinzu:

xc0 "/usr/libexec/getty Pc" vt100 on secure
  • rc.conf

Damit das Netzwerk dann auch richtig funktioniert nehmen wir noch eine Änderung in der /etc/rc.conf vor und ersetzen re0 durch xn0. Am ende sollte es ungefähr so aussehen:

bsd-vm1# cat /etc/rc.conf 

# -- sysinstall generated deltas -- # Thu Nov 17 06:02:25 2011
# Created: Thu Nov 17 06:02:25 2011
# Enable network daemons for user convenience.
# Please make all changes to this file, not to /etc/defaults/rc.conf.
# This file now contains just the overrides from /etc/defaults/rc.conf.
defaultrouter="192.168.2.1"
hostname="bsd-vm1.irgendwas.de"
ifconfig_xn0="inet 192.168.2.x  netmask 255.255.255.0"
keymap="german.iso"
sshd_enable="YES"

Konfiguration auf dem XenServer

Als erstes müssen wir den Kernel für die VM nach /boot/guest legen da die Security-Policy von XenServer keinen anderen Ablageort mehr zuläßt um extern einen Kernel einzubinden:

[root@xen01 ~]# mkdir -p /boot/guest
[root@xen01 ~]# mv /root/kernel /boot/guest/freebsd-8.2-xen-kernel

Nun benötigen wir die UUID der VM die wir paravirtualisieren wollen:

[root@xen01 ~]# xe vm-list 
uuid ( RO)           : b704aa30-a7a3-bc4c-686b-7d8ebf120f1e
     name-label ( RW): FreeBSD
    power-state ( RO): running

Jetzt stellen wir die VM von HVM auf PV um:

[root@xen01 ~]# xe vm-param-set uuid=b704aa30-a7a3-bc4c-686b-7d8ebf120f1e HVM-boot-policy=""

Nun setzen wir den neuen Kernel und ein paar Argumente damit die VM auch booten kann:

[root@xen01 ~]# xe vm-param-set uuid=b704aa30-a7a3-bc4c-686b-7d8ebf120f1e PV-kernel="/boot/guest/freebsd-8.2-xen-kernel"
[root@xen01 ~]# xe vm-param-set uuid=b704aa30-a7a3-bc4c-686b-7d8ebf120f1e PV-args="boot_verbose=1,vfs.root.mountfrom=ufs:/dev/xbd0s1a,kern.hz=100"

Und schon kann die VM heruntergefahren werden und dann neu starten. Ein reboot hat bei mir nicht geklappt. Also am besten ausschalten und wieder anschalten.

Sollte die VM nicht booten, kann es sein, dass das falsche root-Device angeben ist. Dann im letzen Schritt statt ufs:/dev/xbd0s1a mal ufs:/dev/xbd1s1a probieren.

(bei FreeBSD 9.0-RC2 kann es auch xbd0p1, xbd0p2 oder xbd1p1 sein, kommt drauf an was als Root-Device in der fstab steht).

DONE! Die VM läuft nun paravirtualisiert und ist wesentlich schneller als die vorherige HVM.

KnownBug

Leider hat bei mir die Console nicht funktioniert und es kann sein das man diese ja doch benötigt wenn z.B. das Interface vom Netzwerk nicht hoch kommt.

In so einem Fall kann man über den XenServer selbst, ohne XenCenter, per Console auf die VM connecten.

Als erste benötigen wir wieder die UUID der VM:

[root@xen01 ~]# xe vm-list 
uuid ( RO)           : b704aa30-a7a3-bc4c-686b-7d8ebf120f1e
     name-label ( RW): FreeBSD
    power-state ( RO): running

Mit der UUID können wir herausfinden welche ID die VM hat:

[root@xen01 ~]# list_domains | grep b704aa30-a7a3-bc4c-686b-7d8ebf120f1e
593 | b704aa30-a7a3-bc4c-686b-7d8ebf120f1e |    B  

Die VM hat also die ID 593. Damit können wir uns jetzt auf die Console connecten:

[root@xen01 ~]# /usr/lib/xen/bin/xenconsole 593
[Enter]

FreeNAS paravirtualisieren

So, FreeBSD funktioniert nun paravirtualisiert auf dem Citrix XenServer und den kopierten Kernel können wir nun für FreeNAS verwenden.

Als erstes installieren wir FreeNAS auf dem XenServer als HVM indem wir wieder das Template "Other install media" verwenden. Ich habe der VM eine CPU und 512MB RAM gegeben und 15GB Festplatte.

Nach erfolgreichem booten konfigurieren wir erstmal über das XenCenter auf der Console das Netzwerk der VM.

Im Anschluß können wir dann per HTTP und auf die FreeNAS VM einloggen und aktivieren unter Dienste den Service SSH und geben noch unter den Einstellungen an login as root with password. Nun konfigurieren wir ein Passwort bei My Account.

Nun können wir uns per SSH einloggen.

Nacharbeiten auf FreeNAS

In der fstab müssen wir diesmal nichts anpassen. Sie sollte eigentlich so aussehen:

[root@stor1] ~# cat /etc/fstab 
/dev/ufs/FreeNASs1a / ufs ro 1 1
/dev/ufs/FreeNASs3 /cfg ufs rw,noauto 2 2
/dev/ufs/FreeNASs4 /data ufs rw,noatime 2 2

Aber das Interface müssen wir noch anpassen damit wir nach dem Reboot mit dem neuen Kernel auch das Netzwerkinterface verwenden können.

FreeNAS speichert die Konfiguration allerdings nicht in die /etc/rc.conf sondern in eine sqlite3-Datenbank.

Diese liegt hier:

[root@stor1] ~# ls /data/freenas-v1.db
/data/freenas-v1.db

Um nun das Interface zu verändern habe ich als erstes einen Dump von der Datenbank erzeugt:

[root@stor1] ~# sqlite3 /data/freenas-v1.db .dump >> /data/dump.sql

Mit dem Editor vi öffnen wir nun den Dump und suchen nach "re0" und ersetzen den Wert einfach durch "xn0".

Danach können wir den Dump wieder in ein sqlite3 fähiges Datenbankformat bringen:

[root@stor1] ~# cat /data/dump.sql | sqlite3 /data/freenas-v1.db_new

Und nun moven wir einfach die Datenbank und sichern noch zusätzlich die alte:

[root@stor1] ~# mv /data/freenas-v1.db /data/freenas-v1.db_old
[root@stor1] ~# mv /data/freenas-v1.db_new /data/freenas-v1.db
  • ttys

Dann editieren wir noch die /etc/ttys und fügen folg. Zeile hinzu:

xc0 "/usr/libexec/getty Pc" vt100 on secure

Das war es dann schon :)

Einbinden des XenKernels in FreeNAS

Hier kann man die gleich Anleitung verwenden wie bei Konfiguration auf dem XenServer

Danach kann man FreeNAS rebooten und sich per SSH einloggen und FreeNAS ist paravirtualisiert!

Per Xen-Console auf FreeNAS connecten

Hier kann man die gleich Anleitung verwenden wie bei den KnownBugs

Fazit

Ich bin wirklich sehr überrascht! Trotz nur 512MB RAM ist die Leistung doch recht erstaunlich und die IO-Werte lassen sich sehen. Sogar schneller als mein paravirtualisierter OpenFiler. Und ZFS rockt einfach :)

FreeNAS läuft übrigens auch ohne Probleme mit dem Kernel aus FreeBSD 9 :)


Meine Werkzeuge