Duisburger Linux User Group - http://www.dulug.de
Workshop zu OpenSolaris unter qemu
Autor: M. Franke

Da ich schon länger mit OpenSolaris rumspiele und an sich recht interessant finde, habe ich mich entschlossen eine kurze Anleitung zu schreiben wie man OpenSolaris im qemu installiert. Zuerst sollten ein paar Vorbereitungen getroffen werden.

Vorbereitungen
1. Zeit
Nehmt Euch Zeit, denn die werdet Ihr brauchen! Ich bin nachdem die Installation abgeschlossen war glücklich aber ziemlich betrunken eingeschlafen.
2. dev.rtc.max-user-freq
Stellt sicher das der Wert für dev.rtc.max-user-freq auf 1024 steht (als root):
# sysctl -a | grep max-user-freq
dev.rtc.max-user-freq = 64

Sollte der Wert nicht auf 1024 stehen (wie oben) dann gebt bitte als root folgendes ein:
# sysctl -w dev.rtc.max-user-freq=1024
3. OpenSolaris ISO
Ladet Euch das aktuelle OpenSolaris von http://www.opensolaris.org herunter. Bei mir kommt im Momemt Solaris Express Community Edition 'b78' zum Einsatz. Desweiteren empfehle ich die DVD herunterzuladen, dann entfällt der Wechsel der CD's.
4. 10 GB freier Festplattenspeicher
Für die virtuelle Festplatte für qemu empfehle ich 10GB Speicher. Sorgt also dafür das Ihr entsprechend viel Platz frei habt.

Installation
Zuerst solltet Ihr ein qcow-Image erstellen das dann als virtuelle Festplatte dienen wird:
$ qemu-img create -f qcow opensolaris.qcow 10G
Danach startet qemu und lasst ihn von Eurer OpenSolaris-DVD booten:
$ qemu -cdrom sol-nv-b78-x86-dvd.iso -boot d opensolaris.qcow -m 768m -no-kqemu -monitor stdio
Den Wert für den Speicher solltet Ihr zumindest für die Installation auf 768 MB (-m 768m) setzen, später könnt Ihr den dann wieder runtersetzen. Egal ob Ihr die Kernel-Beschleunigung für den qemu (kqemu) geladen habt oder nicht, solltet Ihr diese nicht verwenden (-no-kqemu). Wenn soweit alles geklappt habt hat, dann sollte jetzt der Bootmanager zu sehen sein. Als Installationsroutine wählt bitte Solaris Interactive Text (Console session) (Menüpunkt 4) aus, alles andere macht nur Ärger. Nachdem Euer Rechner nun ein wenig ackert, sollte der Hinweis Setting up Java. Please wait... kommen. Übt Euch an dieser Stelle in Geduld, das kann schon mal eine halbe bis dreiviertel Stunde dauern bis die Installation fortfährt. Danach werden ein paar Parameter (Hostname, root-Passwort etc.) abgefragt, alles relativ straight-forward. Je nachdem welches OpenSolaris-Release Ihr nutzt kann die Systemidentifikation auch länger dauern. Auch hier heisst es wieder Geduld haben. Irgendwann später wird die Software die Ihr ausgewählt habt installiert und der Rechner neugestartet. An dieser Stelle gebt in der qemu-Shell nur quit ein:
(qemu) quit

Erster Start
Zuerst müsst Ihr als root /dev/shm neu mounten:
# umount /dev/shm
# mount -t tmpfs -o size=528m none /dev/shm

Wenn Ihr die Kernelbeschleunigung für qemu nutzen wollt:
# modprobe kqemu
Den Wert für max-user-freq wieder setzen (falls nötig):
# sysctl -w dev.rtc.max-user-freq=1024
Nun könnt Ihr als normaler User Euer frisches OpenSolaris starten:
$ qemu -boot c opensolaris.qcow -m 512m -monitor stdio
Der erste Start dauert was länger, aber irgendwann könnt Ihr den grafischen Login-Screen sehen (wie Ihr seht wurde der Speicher auf 512 MB begrenzt). Dann könnt Ihr Euch als root anmelden und mit OpenSolaris rumspielen. Wenn Ihr OpenSolaris das nächste mal startet sollte alles was zügiger gehen!

Netzwerk
Wenn Ihr soweit gekommen seid das OpenSolaris startet dann könnt Ihr euch schonmal auf die Schulter klopfen! Nun kommen wir zu etwas schwierigen, dem Einsatz des Netzwerkes. Da ich die OpenSolaris Insatallation nativ in meinem Netzwerk nutzen wollte, müssen erst wieder ein paar Vorbereitung getroffen werden. Mein Netzwerk besteht aus Rechnern mit der IP 192.168.1.X. Server liegen in den IP-Range 1-10 mit fester IP, Workstations in dem IP-Range 11-20 gesteuert über DHCP. Da das OpenSolaris bei mir als Server dienen soll bekommt es die IP 192.168.1.5. Der qemu läuft aber auf einem Rechner mit der IP 192.168.1.18, also eine Workstation bei der die IP schon mal wechselt. Wir brauchen also ein virtuelles Netzwerkdevice auf dem eigentlichen qemu-Rechner und eine Bridge die beide Netzwerkdevices versorgen kann (das eigentliche eth0 der Workstation und das virtuelle Netzwerkdevice für den qemu selbst). Das ganze sieht ungefähr so aus:

Das Device rtls0 ist später das eigentlich Device das OpenSolaris sieht, aber dazu später, entscheidend sind zunächst die Geräte br0, eth0 und tap0. Zuerst erstellen wir nun die Bridge:
# brctl addbr br0
Als nächstes müssen wir das Netzwerkdevice eth0 (das Workstation Interface) mit einer fiktiven IP versehen, das Bridge Device mit der 'originalen' eth0 IP versehen und die eigentliche Brücke setzen:
# ifconfig eth0 0.0.0.0 up
# ifconfig br0 192.168.1.18 netmask 255.255.255.0 up
# brctl addif br0 eth0

Wenn Ihr das über ein SSH oder so eingebt wird die Verbingung unterbrochen etc. (erstellt euch ein Skript wenn Ihr auf einem entfernten Host arbeitet). Zudem kann es schonmal kurz dauern bis das Device br0 zur Verfügung steht. Sollte das alles soweit geklappt haben, dann läuft Eure Netzwerkkommunikation nun über br0. Als nächstes solltet Ihr das IP-fowarding aktivieren:
# sysctl -w net.ipv4.ip_forward=1
Nun wird das virtuelle Netzwerk Decive für den Qemu eingerichtet, dafür müsst Ihr zunächst das Modul tun laden:
# modprobe tun
Ggf. noch Rechte verteilen damit normale User dieses Interface nutzen können:
# chmod 666 /dev/net/tun
Und zuletzt das eigentliche virtuelle Netzwerkdevice erstellen (anstelle von user gebt den Benutzernamen an mit dem das virtuelle Netzwerkdevice nutzen wollt/müsst, bei root könnt Ihr den Parameter -u weglassen):
# tunctl -u user -t tap0
Dann erstellt euch das Skript /etc/qemu-ifup mit folgendem Inhalt:
#!/bin/bash
ifconfig $1 0.0.0.0 promisc up
brctl addif br0 $1
sleep 2

Startet nun den qemu mit den zusätzlichen Netzwerkparametern:
# qemu -boot c opensolaris.qcow -m 512m -monitor stdio -net nic,vlan=0,model=rtl8139,mac=11:22:33:44:55:66 -net tap,vlan=0,ifname=tap0
Wenn Euer OpenSolaris nun soweit gebootet ist, dann meldet Euch als root an (in welcher Form auch immer). Anschliessend gebt den folgenden Befehl ein:
# prtconf -v | less
Die Ausgabe von prtconf wird nun nach less gepipet, dort sucht bitte nach dem Wort Ethernet mittels /Ethernet. Scrollt dann ein paar Zeilen hoch, Ihr solltet dann eine solche Ausgabe sehen:
...
pci10ec,8139, instance #0 (driver not attached)
...

Nun ladet den Treiber:
# /usr/sbin/update_drv -a -i '"pci10ec,8139"' rtls
Zu guter letzt das neue Netzwerkdevice rtls0 konfigurieren:
# ifconfig rtls0 plumb
# ifconfig rtls0 192.168.1.5 netmask 255.255.255.0 up

Ihr solltet nun in Eurem heimischen Netzwerk sein.