QEMU die Zweite

Angesichts der doch recht trägen Bedienbarkeit des per QEMU emulierten Windows-Systems spielte ich hin und wieder mit dem Gedanken, die Leistungsfähigkeit mit Hilfe des KQEMU-Kernelmodules zu verbessern. Doch die scheinbar komplizierte Kompilierung und Einbindung in mein System schreckte mich immer wieder ab. Zumindest bis vor ein paar Tagen, als ich beschloss, es erneut zu versuchen; die extrem niedrige Geschwindigkeit des Windows-Systems machte es einfach nahezu unbenutzbar.

Meine Suche nach vorgefertigten Paketen für meine Paketverwaltung verlief erfolglos, also machte ich mich daran, alle erforderlichen Schritte mit Hilfe des Quellcodes durchzuführen. Meine Suche führte mich zuallererst zu einem Blogeintrag bei Geek Pit. Das dort beschrieben Vorgehen führte aber leider nicht zum Erfolg, QEMU ließ sich nicht kompilieren und quittierte mit einer nicht sonderlich hilfreichen Fehlermeldung (welche mittlerweile in meinem Kommentar zu diesem Blogeintrag nachlesbar ist). Bei meiner Suche danach stieß ich neben einigen erfolglosen Diskussionen in Mailinglisten auf Nando Florestans „Installing KQEMU in Ubuntu“. Das dortige Script erschien mir, nachdem ich es mir zu Gemüte geführt hatte, recht brauchbar. Wie die Kommentare unter dem Beitrag aber zeigen, ist es noch fehlerbehaftet, weshalb ich es ein wenig überarbeiten und an mein System anpassen musste. Die fertige Fassung stelle ich hier zur Verfügung. Besonders nützlich an dem Script ist, dass es für den Kompiliervorgang kurzzeitig den aktuell installierten GCC (GNU Compiler Collection) umbenennt und eine gleichnamige symbolische Verknüpfung auf den alten GCC 3.x anlegt. Damit greift make auf diesen zu, womit sich QEMU kompilieren lässt. Ein weiterer Fehler ließ sich beseitigen, indem ich die aktuelle Version von checkinstall installierte, welche sich noch nicht im Repository meiner Paketverwaltung befand. Dieses Programm hat die nette Eigenschaft, dass es ein mit meiner Paketverwaltung installierbares und verwaltbares Archiv erzeugt.

Nachdem QEMU und KQEMU nun erfolgreich kompiliert, installiert und im Falle von KQEMU an die richtige Stelle verschoben wurden, wollte ich das Kernelmodul per modprobe laden. Murphys Gesetz folgend verlief aber auch dies nicht erfolgreich; ich erhielt ein „FATAL: Error inserting kqemu Invalid module format“, was sich darauf begründet, dass das mit dem GCC 3.x kompilierte Kernelmodul nicht in meinen per GCC 4.x kompilierten Kernel geladen werden kann. Meine Suche danach führte mich zu diesem hilfreichen Beitrag im QEMU-Board. Ich folgte dem dort beschriebene Vorgehen, kompilierte KQEMU mit meinem aktuellen GCC erneut und verschob das Modul in das erforderliche Verzeichnis. Damit konnte ich das Kernelmodul schließlich erfolgreich laden. Ich legte die KQEMU-Gerätedatei /dev/kqemu mit den erforderlichen Zugriffsrechten an und startete mein Windows-System per QEMU.

Und es hat sich gelohnt: die Geschwindigkeit ist massiv gestiegen und macht das System nun erstmalig wirklich benutzbar. Natürlich ist das emulierte System langsamer als ein physikalisch installiertes, doch für Testläufe und dergleichen reicht es allemal. Ein weiterer Nebeneffekt machte sich kurz darauf auch bemerkbar: Töne des Windows-Systems wurden nun auch endlich ausgegeben. Mir war zuvor noch nicht bewusst, dass hierfür SDL (Simple DirectMedia Layer) erforderlich ist. Das Windows-System läuft nun also genau so wie vorher, nur weitaus schneller und mit Tonausgabe.

Angesichts der Tatsache, dass QEMU zwangsläufig mit dem GCC 3.x kompiliert werden muss, verzögerte sich das ganze Vorhaben beträchtlich aber unlösbar war es letztendlich dennoch nicht.