Bytesphinx hat geschrieben:howto posten, wie man von einem frisch installierten squeeze mit eingerichteter kvm-vm ein pci-gerät durchreicht? Also welche Pakete, welche Einstellungen, wo, etc ...?
Das dumme dabei ist ja, dass es mit dem KVM-Paket von Squeeze nicht geht (es sei denn der Bug ist inzwischen behoben, was ich aber nicht prüfen kann). Das Du dafür ausserdem spezielle Hardware brauchst, das weißt Du hoffentlich schon. Ansonsten kannst du hier nachlesen, welche Hardware funktioniert:
http://wiki.xensource.com/xenwiki/VTdHowTo.
Ich habe mittlerweile von
http://www.linux-kvm.org/page/Downloads die neueste qemu-kvm Version 0.14.1 heruntergeladen und selbst kompiliert. Das ist im Prinzip recht einfach. Ich habe das so gemacht, dass ich als Superuser in den Sourcetree gegangen bin und dann folgende Kommandos aufgerufen habe:
Das Problem dabei steckt allerdings im Detail. Bei meinem esten Versucht fehlten einige Funktionen, sodass ich noch einige Header-Dateien installieren musste (sowas wie z.B. libc6-dev). Das kann ich jetzt aber nicht mehr alles nachvollziehen. Man kann aber nach Durchlauf von ./configure mal die Ausgabe von configure genau analysieren, da sieht man dann, welche Bibliotheken gefunden wurden und welche nicht. Die fehlenden dann halt einfach nachinstallieren. Oder man installiert die KVM-Pakete von Testing, so wie das @rendegast weiter oben schon vorgeschlagen hat. Dann erspart man sich die Umstände des Kompilierens.
Alles weitere kann man hier lesen:
http://www.linux-kvm.org/page/How_to_as ... T-d_in_KVM
Da es auf englisch ist, mal ein paar Zeilen von mir noch dazu: Wer einen selbst kompilierten Kernel hat, sollte folgende Optionen in der Kernelkonfiguration aktivieren:
Code: Alles auswählen
Bus options (PCI etc.) --> Support for DMA Remapping Devices
Bus options (PCI etc.) --> Enable DMA Remapping Devices
Bus options (PCI etc.) --> PCI Stub driver
So jedenfalls steht es in dem KVM-HowTo. Es funktioniert allerdings sogar ohne DMA Remapping, wie ich mit dem Realtime-Kernel feststellen musste, weil "full realtime" mich dazu zwang, DMA Remapping wieder zu deaktivieren. Ganz wichtig aber ist PCI Stub, das ist nämlich für das Durchreichen zuständig.
Dann gibt es, je nach Hardware, gegebenenfalls ein Problem mit IRQ-Sharing und man kann dann das eine oder andere PCI-Gerät nicht durchreichen, wenn es sich einen IRQ mit einem anderen Gerät teilt. Da müsste man dann gegebenenfalls die IRQ's manuell den Geräten zuweisen, was ich bis jetzt Gott sei Dank noch nicht tun musste. Bei solchen Problemen könnte unter Umständen auch ein aktuellerer Kernel abhilfe schaffen. Mittlerweile verwende ich Kernel 2.6.39.1. Mit Kernel 2.6.36 oder 2.6.37 hatte ich z.B. so ein Problem mit IRQ-Sharing und konnte die VM nicht starten. Mit Kernel 2.6.39.1 kann man wie es aussieht sogar PCI-Karten durchreichen, die sich den IRQ mit einem anderen Gerät teilen. Jedenfalls funktioniert das mit meinem Mainboard hervorragend.
Zum Durchreichen der Hardware muss man noch ein kleines Skript schreiben, welches man vor dem Start der VM als Superuser aufruft. Dazu muss man als erstes einmal herausfinden, welche PCI-Adresse das Gerät hat:
Code: Alles auswählen
lspci
00:05.0 Audio device: ATI Technologies Inc SBx00 Azalia (Intel HDA) (rev 40)
Das Wäre in diesem Beispiel also die Adresse 00:05.0. Dann such man sich die Geräte-ID heraus:
Das ist in diesem Beispiel "1002:4383" und das Skript muss dann so aussehen:
Code: Alles auswählen
echo "1002 4383" > /sys/bus/pci/drivers/pci-stub/new_id
echo 0000:05:00.0 > /sys/bus/pci/devices/0000:05:00.0/driver/unbind
echo 0000:05:00.0 > /sys/bus/pci/drivers/pci-stub/bind
Erklärt sich eigentlich fast von selbst: in der ersten Zeile die Geräte-ID anpassen, in zeile 2 und 3 die PCI-Adresse anpassen. Das Skript weist dann eben dieses Gerät dem Treiber PCI-Stub zu und das Gerät steht somit für eine VM bereit. Ich starte dieses Skript, solange KVM bei mir noch eine Baustelle ist, per Superuser vor dem KVM-Start. Man könnte das Skript aber auch in den Bootprozess einbauen, oder in ein Skript, welches die VM startet. Da kann man ja recht kreativ sein. Und dann kann man die VM z.B. so starten:
Code: Alles auswählen
sudo qemu-system-x86_64 \
-enable-kvm \
-M pc-0.14 \
-cpu host,+svm \
-smp 4 \
-enable-nesting \
-m 2G \
-name MeineVM \
-vga vmware \
-k de \
-usb -usbdevice tablet \
-net none \
-device pci-assign,host=00:05.0,id=sound0 \
-drive file=/dev/mapper/vol-kvm1,if=scsi,media=disk,index=0,snapshot=off,cache=writethrough,format=raw,boot=on \
-boot c
Den Backslash am Ende der Zeilen muss man natürlich weglassen, wenn man dieses Kommando in der Konsole eingibt. Ich habe das so in einem Bash-Skript stehen und der Übersicht wegen über mehrere Zeilen verteilt. Entscheidend für das Durchreichen der PCI-Karte ist hier die Zeile -device pci-assign,host=00:05.0,id=sound0 und sollte eigentlich auch selbsterklärend sein. HIer wird das PCI-Gerät, welches sich an PCI-Adresse 00:5.0 befindet, an KVM übergeben.
Ein Fehler ist noch in diesem Aufruf: Man startet die VM als Superuser, was nicht gerade eine sehr gute Idee ist. Es gibt noch die KVM-Startoptionen -chroot /home/kvmuser -runas kvmuser, aber leider funktionieren die bei mir nicht. Vielleicht würde ja jemand hier noch ein HowTo posten, wie man KVM erfolgreich als kvmuser startet?