Aus Linux-Magazin 02/2003

Der PC-Emulator Bochs

Die Open-Source-Gemeinde hat selbst für komplexe Office-Suiten freie Alternativen entwickelt, doch mit einem PC-Emulator tut sie sich immer noch schwer. Das Bochs-Projekt ist zumindest für Tests interessant, trotz schwacher Performance.

Bochs (gesprochen wie Box) ist ein schon 1994 begonnenes Projekt, das die Emulation eines portablen x86-Emulators zum Ziel hat[1]. Portabel heißt in diesem Fall: nicht nur unter Linux und nicht nur auf Intel-Plattformen. Dafür ist der Code auch vollständig in C++ implementiert. Bochs läuft also auf verschiedensten Plattformen, von Linux über Windows bis hin zum Mac. Sogar auf Linux/zSeries wurde Bochs schon eingesetzt – wie ausgerechnet Bugmeldungen auf Sourceforge zeigen.

In der Plattform-Unabhängigkeit besteht der zentrale Unterschied zur kommerziellen Alternative VMware. Die x86-Befehle werden vollständig simuliert und sind damit auch auf fremden Architekturen verfügbar. Virtualisierung, bei der die simulierten Instruktionen fast mit Hardware-Geschwindigkeit laufen, ist dagegen nur auf x86-gebundenen Emulatoren möglich. Bochs ist daher im Gegensatz zu VMware sehr langsam.

Wer aber die Entwicklung von Bochs über die letzten Releases verfolgt hat, stellt die großen Fortschritte fest, die von Release zu Release gemacht werden, sowohl hinsichtlich der unterstützten Befehlssätze und Peripherie als auch der Geschwindigkeit. Das Projekt ist sehr aktiv und ein Download der neuesten Version lohnt sich immer.

Die Hardware

Bochs bietet einen einfachen PC mit folgender Ausstattung:

  • 286 bis Pentium-Pro-Befehlssatz (je nach Konfiguration)
  • VGA-Grafikchip
  • zwei Floppy-Laufwerke (1,44 MByte oder 2,88 MByte )
  • vier ATA-Kanäle mit bis zu acht Geräten
  • Maus- und Tastatur-Unterstützung
  • Soundblaster-Emulation
  • NE-2000-Unterstützung
  • Simulation von bis zu 15 Prozessoren ist möglich

Die VGA-Emulation erlaubt natürlich nur geringe Auflösungen und die Netzwerk-Unterstützung funktioniert nur bei vorhandener NE-2000-kompatibler Netzwerkkarte. Damit ist die Hardware-Ausstattung sicherlich nicht auf dem neuesten Stand, aber für die Installation und Nutzung eines Gastsystems mehr als ausreichend.

Bochs stellt an das Betriebssystem des Wirts zwar keine Anforderungen, für die Hardware gilt dagegen: je mehr Rechenleistung, desto besser. Ein rein in C++ implementiertes, völlig im User-Mode ablaufendes Emulatorprogramm kann gar nicht genug davon haben. Vor der Verwendung von Bochs haben die Götter aber zunächst den Download und insbesondere die Konfiguration gestellt.

Download und Installation

Über die Bochs-Homepage[1] können das Quellpaket sowie fertige Binaries auch im RPM-Format heruntergeladen werden, sie enthalten das Festplattenimage eines einfachen Linux-Systems (»dlx«, mit einem 1.3-Kernel). Grundlage für diesen Artikel ist Version 2.0.0-pre2, bei Erscheinen des Linux-Magazins sollte allerdings die Ausgabe 2.0.0 schon verfügbar sein.

Seit Version 1.4.1 gibt es allein von der Funktionalität her keinen wichtigen Grund mehr, das Quellpaket herunterzuladen und selbst zu kompilieren. Vorher war dies wegen des deutschen Tastaturlayouts sinnvoll. Die Quellen enthalten jedoch eine Reihe von Patches, die es nicht oder noch nicht in den offiziellen Code geschafft haben. Wer also etwas experimentieren oder neueste Features ausprobieren will, sollte eine eigene Version von Bochs herstellen.

Letzteres ist kein Problem, da Bochs mittels »./configure Optionen; make; make install« das übliche Vorgehen unterstützt. Normalerweise dauert die Entscheidung, welche »configure«-Optionen zu verwenden sind, länger als der gesamte Kompilierprozess. Wer keine schnelle und ständige Internetverbindung hat, sollte vor »make install« das Makefile editieren, sonst versucht das Kommando ein komplettes Linux-Festplattenimage herunterzuladen.

Zwei »configure«-Optionen, die im Linux-Binarypaket nicht verwendet werden, waren sinnvoll, funktionieren aber zumindest unter der 2.0.0-pre2 nicht mehr. Erstens die Option »–enable-slowdown«, die für die Synchronisation der Bochs-Uhr mit der Systemuhr des Wirtssystems sorgt. Ohne diese Option läuft das System mit einem eigenen Verständnis der Zeit. Die zweite nützliche Option ist »–enable-idle-hack«, sie reduziert die CPU-Last des Emulators, falls nichts zu tun ist – sonst muss man mit ständiger Vollauslastung leben.

Installiert wird mit »make install« unter »/usr/local/bochs/latest/«, das ein Link auf die aktuelle Version ist. So können auch mehrere Versionen parallel installiert sein. Die Version 1.4.1 ist Teil der aktuellen SuSE Linux 8.1, allerdings installiert diese Version nur die alte Dokumentation sowie eine zumindest für deutsche Tastaturen unbefriedigende Konfiguration. Hier ist also auch etwas Handarbeit angesagt.

Bochs einrichten

Bochs selbst besteht aus Benutzersicht aus dem eigentlichen Emulator »/usr/ local/bin/bochs« sowie aus einer Konfigurationsdatei, die die Hardware-Ausstattung und das Verhalten bei Problemen festlegt. Diese Konfigurationsdatei wird der Reihe nach an folgenden Orten gesucht:

  • »./.bochsrc«
  • »./bochsrc«
  • »./bochsrc.txt«

n »~/.bochsrc«

  • »/etc/bochsrc« (seit 2.0)

SuSE hat den Quellcode so gepatcht, dass zuerst die Datei »/etc/bochsrc« gesucht wird – ein sehr zweifelhaftes Vorgehen, denn damit ist es nicht mehr möglich, dass verschiedene Benutzer eigene Konfigurationen haben beziehungsweise dass mehrere Konfigurationen parallel in verschiedenen Verzeichnissen verwendbar sind.

Die Konfigurationsdatei selbst ist einfach aufgebaut und außerdem ausführlich dokumentiert. In Listing 1 sind die wichtigsten Konfigurationseinstellungen zu sehen. Die meisten Parameter erklären sich von selbst. Deshalb an dieser Stelle nur zwei Bemerkungen zu den Zeilen 20 (»com1«) sowie 27 (»ips«): »com1« könnte sowohl eine echte serielle Leitung sein, alternativ aber auch ein Terminal (»>pty«) unter X. Für dessen Einrichtung startet man zwei XTerms: erst eines für Bochs, das andere für den Output von »com1«. Im zweiten Terminal wird das »pty« über den Befehl »tty« abgefragt. Nach dem Start von Bochs geht dann der gesamte serielle Output in dieses XTerm.

Eigene Leistungsmessung

Die Konfigurationsoption »ips« steht für Instructions per Second und gibt die Anzahl emulierter Instruktionen pro Sekunde an. Diese Zahl hat Auswirkungen auf das Verhalten des Emulators, beispielsweise auf das »vga_update_interval« oder die verschiedenen Keybord-Delay-Raten. Letztlich steuert diese Angabe das Zeitverhalten des Emulators, was am besten an der Systemuhr der emulierten Systeme zu sehen ist – ist nichts zu tun, rennt sie davon.

Der Wert von »ips« ist aber leider nicht konstant, er hängt von der Komplexität der emulierten Instruktionen ab. Experimente mit Linux als Gastsystem haben jedoch ergeben, dass der Schwankungsbereich unter gleichbleibender Last minimal ist, bei unterschiedlicher Auslastung aber durchaus um ein bis zwei Zehnerpotenzen schwankt.

Um eine genaue Zahl für »ips« herauszufinden, wird der Quellcode selbst kompiliert und eine Option in der von »configure« erzeugten Datei »config.h« gesetzt, die den aktuellen Wert periodisch ausgibt. Wer sich nicht die Mühe machen will, auf diesem Wege einen eigenen Wert zu ermitteln, muss mit den Hinweisen in der kommentierten Muster-»bochsrc«-Datei leben.

Auf einem Duron-700-System schafft es Bochs, etwa fünf Millionen Instruktionen pro Sekunde zu emulieren (gemessen beim Laden und Initialisieren eines 2.0-Kernels). Demgemäß gibt Linux beim Start eine Zahl von 4,96 Bogomips aus, das Linux Hostsystem schafft dagegen 1400 Bogomips. Unter Bochs 1.4.1 waren es nur zwei Millionen IPS, die neue Bochs-Ausgabe ist also deutlich spürbar schneller geworden.

Disketten und CDs

Bochs verwendet das reale Diskettenlaufwerk (in Listing 1 in Zeile 4 konfiguriert) oder ein Diskettenimage (Zeile 5 als Beispiel für das zweite Laufwerk). Solche Images lassen sich sehr einfach erzeugen:

dd if=/dev/zero of=floppy.img bs=1k U count=1440
mkdosfs floppy.img

Listing 1: »bochsrc«

01: romimage: file=/usr/local/bochs/latest/BIOS-bochs-latest, address=0xf0000
02: megs: 64
03: vgaromimage: /usr/local/bochs/latest/VGABIOS-elpin-2.40
04: floppya: 1_44=/dev/fd0, status=inserted
05: floppyb: 1_44=/var/bochs/floppy_b.img, status=ejected
06: ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
07: ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
08: ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e8, irq=11
09: ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x368, irq=9
10: ata0-master: type=disk, path=/data/bochs/hda.10M, cylinders=306, heads=4, spt=17
11: ata0-slave: type=cdrom, path=/dev/cdrom, status=ejected
12: ata1-master: type=disk, path=/data/bochs/hdb.10M, cylinders=306, heads=4, spt=17
13: boot: disk
14: floppy_bootsig_check: disabled=0
15: log: /var/log/bochs.log
16: panic: action=report
17: error: action=report
18: info: action=report
19: debug: action=ignore
20: com1: dev=/dev/pts/1
21: parport1: enable=1, file="/var/bochs/parport.out"
22: sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp, loglevel=2, log=sb16.log, dmatimer=600000
23: vga_update_interval: 300000
24: keyboard_serial_delay: 250
25: keyboard_paste_delay: 100000
26: floppy_command_delay: 500
27: ips: 2000000
28: private_colormap: enabled=0
29: ne2k: ioaddr=0x280, irq=9, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth0
30: keyboard_mapping: enabled=1, map=/usr/local/bochs/latest/keymaps/x11-pc-de.map

Natürlich ist auf diese Weise auch das Anlegen einer Diskette mit einem Ext-2- oder Minix-Dateisystem möglich. Diskettenimages haben vor allem den Vorteil, deutlich schneller zu sein als das reale Laufwerk. Auch CDs sind entweder vom CD-ROM-Laufwerk oder von einem ISO-Image lesbar. Da moderne CD-Laufwerke aber gewöhnlich sehr schnell sind, bleiben die Unterschiede zu den Images marginal.

Ab Version 1.4 unterstützt Bochs auch das Booten von CD-ROM. Hierzu wurden die El-Torito-Funktionen ins Bios aufgenommen. Das ist ein großer Fortschritt, weil jetzt beispielsweise Installations-CDs einer Linux-Distribution direkt starten und der Umweg über Bootdisketten damit entfällt.

Festplatten nur als Images

Festplatten werden analog wie Disketten als Imagedateien erzeugt, rohe Partitionen lassen sich eventuell auch verwenden, davon wird jedoch explizit abgeraten. Welche Werte für den »bs«- und den »count«-Parameter des »dd«-Befehls zu verwenden sind, ist der alten Dokumentation unter »docs-html/install.html« zu entnehmen. Einfacher geht es aber mit dem neuen Tool »bximage«. Es fragt interaktiv die Größe und den Namen der Imagedatei ab, erzeugt sie und gibt zuletzt die korrekte Konfigurationszeile für die »bochsrc«-Datei aus (Ab-bildung 1).

Abbildung 1: Erzeugen einer virtuellen Festplatte.

Abbildung 1: Erzeugen einer virtuellen Festplatte.

Partitionieren lassen sich die Festplattenimages am einfachsten nach dem Start eines Linux-Minisystems von Diskette innerhalb von Bochs. Eine Alternative wäre der Aufruf von »fdisk« mit der Imagedatei als Argument. In diesem Fall ist im Hauptmenü von Fdisk vor dem eigentlichen Partitionieren das Expertenmenü aufzurufen, um die Zylinder-, Sektor- und Kopfanzahl manuell einzugeben.

Fertige Images mit vorinstallierten freien Systemen – von Minix über FreeDOS bis zu Debian – gibt es auf der Bochs-Homepage. Das aktuelle Debian zum Beispiel ist 77 MByte groß. ATA-Kanäle und Festplatten werden wie in Listing 1 (Zeilen 6 bis 12) konfiguriert. Gegenüber der alten Syntax in den Versionen 1.4.1 und früher mit »diskc« und »diskd« ist dies ein deutlicher Fortschritt.

Nicht allgemein bekannt, aber durchaus möglich: Auch Festplatten können unpartitioniert, also als große Disketten verwendet werden. Hierzu erzeugt der Befehl

mke2fs -F hdb.img

auf dem Image ein Dateisystem. Das bietet sich vor allem für die zweite Festplatte an, denn ein so erzeugtes Image lässt sich auch innerhalb des Host-Systems über das Loop-Device mounten und zum Datenaustausch zwischen Host- und Gastsystem nutzen. Partitionen von Images können mit etwas Aufwand auch über das Loop-Device gemountet werden. Dazu braucht das Loop-Device allerdings den richtigen Offset in die Imagedatei. Daher Vorsicht: Wer hier falsch rechnet, riskiert einen Datenverlust.

Start der Emulation

Nachdem die Hardware über die Konfigurationsdatei definiert ist und alle notwendigen Disketten-, CD- und Festplattenimages erzeugt sind, startet der Emulator einfach über den Befehl »bochs«. Das konfigurierte Device versucht dann, ein Betriebssystem zu laden. Die Abbildung 2 zeigt den Start der aktuellen Debian-Installations-CD.

Abbildung 2: Debian unter Bochs.

Abbildung 2: Debian unter Bochs.

Sehr schön ist die konfigurierte Hardware zu sehen (zum Beispiel eine 10 MByte große Festplatte sowie ein ATAPI-CD-ROM). Oben links im Emulator sind verfügbare Geräte verzeichnet. Die Icons oben rechts sind allerdings mit Ausnahme des Power-Schalters und des Config-Icons nicht funktionsfähig.

Wer Konfigurationsoptionen temporär überschreiben möchte, kann auch mit Hilfe der Kommandozeile Parameter übergeben. Dazu dient dasselbe Format wie in der Config-Datei. Da die Optionen Zeichen enthalten, die von der Shell interpretiert werden, müssen die Optionen in Anführungszeichen stehen. Das ist sehr nachteilig, da somit nützliche Features wie Filename-Completion nicht nutzbar sind.

Konfiguration per Skript oder interaktiv

Die Lösung dieses Problems ist ein Shell-Skript, das die Unix-übliche Übergabe von Parametern erlaubt. Es liegt im Unterverzeichnis »patches« der Quelldistribution. Zusätzlich bestimmt es sogar noch Größe und Geometrie von Disketten und Festplatten. Je nach Configure-Option enthält Bochs auch ein interaktives Konfigurationsprogramm, das aber leider ziemlich umständlich zu nutzen ist. Aufgerufen wird es entweder automatisch nach dem Start des Emulators oder über das Config-Icon rechts oben im Emulator.

Noch ein Hinweis für die KDE-Nutzer, Gnome hat aber wahrscheinlich dasselbe Problem: Das Umschalten zwischen den verschiedenen Konsolen in einem Linux-Gastsystem funktioniert nur, wenn KDE die Tastenkombinationen wie [Alt]+[F1] nicht abfängt, [Alt]+[F2] startet beispielsweise eine Mini-Befehlszeile. Hier ist eine Umbelegung erforderlich, etwa [Alt]+[Shift]+[F2] statt [Alt]+[F2] für die Befehlszeile.

Die Kommunikation zwischen Gast- und Host-System ist leider nur indirekt möglich. Daten können über Disketten, CDs oder auch Festplatten (wie oben beschrieben) ausgetauscht werden. Die Festplatten-Methode erlaubt zwar den Austausch größerer Datenmengen, erzwingt aber auch immer das Beenden und Neustarten des Emulators.

Bei unterstützter Netzwerkkarte ist auch die Kommunikation des Gastsystems mit jedem System im Netz möglich, außer mit dem eigenen Host-System (siehe Abbildung 3). Die Netzwerkemulation verwendet also tatsächlich die physische Netzwerkkarte. Für den Datenaustausch muss ein zweiter Rechner deshalb mit NFS- oder Samba-Server ausgestattet sein, mit Mounts sowohl zum Host- als auch zum Gastsystem.

Abbildung 3: Netzwerkverbindung im lokalen Netz.

Abbildung 3: Netzwerkverbindung im lokalen Netz.

Fazit

Konfiguration, Start und Betrieb des PC-Emulators Bochs sind inzwischen keine besonderen Probleme mehr und der rapide Fortschritt des Projekts zeigt auch, dass die Open-Source-Gemeinde durchaus immer noch an einem nutzbaren Emulator arbeitet. Durch den Verzicht auf Kernelmodule ist die Leistung jedoch in keiner Weise befriedigend (ein alter 486 des Autors bringt es auf die 20fache Leistung des auf einem Duron 700 emulierten PCs). Bochs deshalb als Spielerei abzutun, ist aber ebenfalls falsch. Es eignet sich jedoch sicherlich nicht dazu, Windows zu emulieren und das eine spezielle Programm, das unter Linux noch nicht verfügbar ist, produktiv laufen zu lassen.

Der Autor setzt Bochs aber trotzdem für verschiedene Projekte regelmäßig produktiv ein. Die Projekte – oft sind es CD-Installations- und Restore-Verfahren – erzeugen beispielsweise CD-Images, deren Startfähigkeit überprüft werden muss, oder sie führen destruktive Operationen (Restores) auf Festplatten aus. In solchen Fällen ist die pure Leistung nicht von zentraler Bedeutung. Im Gegensatz zu VMware ist Bochs sogar teilweise im Vorteil, da die Umgebung über die Kommandozeile gesteuert und somit in automatische Testskripte eingebunden werden kann.

Es bleibt die Hoffnung, dass mit dem Plex86-Projekt (siehe Kasten “Die Geschichte von Bochs”) auch die Performanceprobleme mit der Zeit gelöst werden. Bis dahin müssen Nutzer, für die die Leistung von Bochs indiskutabel ist, weiterhin auf eine der kommerziellen Alternativen ausweichen. (uwo)

Die Geschichte von Bochs

Kevin Lawton entwickelte Bochs seit 1994 (!) als kommerzielles Produkt. Anfang 2000 kaufte Mandrakesoft den Code und stellte ihn unter die LGPL. Dann widmete sich Kevin Lawton als Angestellter von Mandrake dem Projekt Plex86 (neue Homepage unter[2]), das einen Emulator mit ähnlichen Merkmalen wie VMware schaffen sollte.

Im März 2001 wurde Bochs ein Sourceforge-Projekt und dort von vielen Entwicklern betreut, die Developer-Mailingliste hat über 300 Mitglieder. Wer die Bugmeldungen und Patches seither verfolgt, sieht, dass sich hier regelmäßig etwas tut. Mit dem Ende der New-Economy-Blase musste auch Mandrake kürzer treten, eine ganze Reihe von Angestellten wurde entlassen, unter ihnen war auch Kevin Lawton. Das Plex86-Projekt kam damit de facto zum Erliegen.

Inzwischen ist das Projekt von seiner alten Homepage (www.plex86.org) nach[2] umgezogen, einem Sourceforge-Klon. Die News-Sektion suggeriert zwar, dass an dem Projekt weitergearbeitet wird, im CVS-Repository ist aber kein neuerer Code vorhanden. Der letzte aktuelle Code kompiliert aber auch schon nicht mehr – Linux hat sich eben in den letzten Jahren ebenfalls weiterentwickelt. Kevin Lawton gehört auch nicht mehr zu den (registrierten) Plex86-Entwicklern, er arbeitet aber wieder bei Bochs mit.

Es scheint weiterhin einen engen Kontakt von Bochs zu Plex86 zu geben. Idealerweise würde Plex86 die simulierten x86-Instruktionen von Bochs virtualisieren und aus dem Userspace in Kernelmodule verlagern, um auf diese Weise einen deutlichen Performancegewinn zu erzielen.

Infos

[1] Bochs-Homepage: [http://bochs.sourceforge.net/]

[2] Neue-Plex86-Homepage: [http://savannah.nongnu.org/projects/plex86]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben