Im alltäglichen Sprachgebrauch kommen die Begriffe Emulation und Virtualisierung zwar oft gleichrangig zum Einsatz, doch tatsächlich unterscheiden sich die beiden Techniken grundlegend.

Emulatoren bilden per Software einen kompletten Computer nach, dessen Architektur sich dadurch von jener des tatsächlich zugrunde liegenden Systems völlig unterscheiden kann (aber nicht zwingend muss). Auf diesem Weg lassen sich beispielsweise Betriebssysteme und Programme für ARM- oder RISC-CPUs auch auf einem Intel-PC ausführen. Dabei verlangt allerdings das Nachstellen einer kompletten Systemarchitektur der Basismaschine einiges an Leistung ab. Virtualisierer (wie Vmware oder VirtualBox) dagegen verzichten zugunsten der Performance auf diese Plattformunabhängigkeit und reichen die meisten Instruktionen direkt an die vorhandene Hardware durch. Das Ausführen systemfremder Software beherrschen sie daher nicht.

Bei Bochs ([1], gesprochen wie "Box") handelt es sich um einen klassischen Emulator. In C++ geschrieben, läuft er auf vielen realen Hardware-Plattformen ohne Abhängigkeiten zum Befehlssatz. Dort bildet er x86-Systeme vom 286er bis zur modernen 64-Bit-CPU nach, bei Bedarf inklusive der diversen Befehlssätze wie MMX, SSE oder 3DNow (siehe Kasten "Emulierte Hardware"). Der Mehraufwand der Emulation gegenüber der Virtualisierung zeigt sich klassisch in der Ablaufgeschwindigkeit. Während alte Betriebssysteme wie etwa Windows 98 (Abbildung 1) mit halbwegs aktuellen Rechnern als Wirt in annehmbarer Geschwindigkeit laufen, brauchen selbst extrem schlanke Linux-Distributionen wie Puppy-Linux (Abbildung 2) schon zum Booten geraume Weile.

Abbildung 1: Windows98 bootet im Bochs-Emulator.
Abbildung 2: Puppy-Linux.

Emulierte Hardware

Prozessor bis zu 15 CPUs

Befehlssatz i286 bis x86_64

Grafik VGA, SVGA

Sound Soundblaster

Massenspeicher 4 ATA-Kanäle, bis zu acht (IDE-)Geräte

Disketten zwei Laufwerke, 1,44 oder 2,88 MByte

Schnittstellen 2 parallel, 4 seriell

Netzwerk NE2K

Bedienung Maus, Tastatur

Sonstiges PCI (rudimentär), USB (rudimentär)

Wer also gerade nicht ein älteres Betriebssystem booten will, greift also besser zum Virtualisierer. Für eine kleine Zeitreise in Sachen IT dagegen eignet sich Bochs bestens und führt historische Betriebssysteme genau so aus, wie sie sich seinerzeit auf der damaligen Hardware angefühlt haben. Übrigens hat auch Bochs selbst eine fast zwanzigjährige Historie vorzuweisen, einige Informationen dazu finden Sie im Kasten "Bochs: Bewegte Geschichte".

Bochs: Bewegte Geschichte

Kevin Lawton entwickelte Bochs seit 1994, zunächst als kommerzielles Produkt. Mandrakesoft kaufte den Code von Bochs Anfang 2000 und stellte ihn unter die LGPL. Gleichzeitig nahm Kevin Lawton einen Job bei dem Unternehmen an und widmete sich dort dem Projekt Plex86, das einen Virtualisierer mit ähnlichen Merkmalen wie Vmware schaffen sollte.

Mit dem Ende der New-Economy-Blase musste auch Mandrakesoft kürzer treten und entließ eine ganze Reihe von Angestellten, darunter auch Kevin Lawton. Das Plex86-Projekt kam de facto zum Erliegen, als One-Man-Show hätte es vermutlich ohnehin nicht gegen Konkurrenz wie Vmware bestehen können.

Im März 2001 wurde Bochs ein Sourceforge-Projekt, das eine ganze Reihe von Entwicklern weitertrieb. Dadurch konnte Bochs ins Sachen Hardware-Support kontinuierlich zulegen, insbesondere hinsichtlich der unterstützten CPU-Typen und Festplattenformate.

Bochs einrichten

Zu Redaktionsschluss war Bochs 2.5.1 die aktuelle Version, das aber noch nicht allen Distributionen beiliegt. OpenSuse 12.1 stellt beispielsweise Bochs 2.2.1 bereit. Debian bringt Bochs 2.4.6 mit, das es auf mehrere Pakete verteilt. Die selbe Version findet sich auch in Ubuntu 11.10.

Auf den Projektseiten von Bochs gibt es auch ein RPM der aktuellen Version als Download, das aber als Voraussetzung zwei weitere Pakete benötigt: libltdl und glitz. Letzteres bereitet unter dem aktuellen OpenSuse Probleme, da die Distribution es seit Version 11.4 nicht mehr ausliefert. Eine Paketsuche im OpenSuse-Software-Verzeichnis [2] mit der Einstellung All distributions fördert es aber zutage.

Nach dem Einrichten des RPM-Pakets finden Sie die komplette Dokumentation im Verzeichnis /usr/share/doc/bochs im HTML-Format. Zusätzlich enthält das Paket auch ein direkt startbereites Bochs-Image – das Kommando bochs-dlx entpackt es und startet den Emulator.

Können oder möchten Sie das RPM-Paket nicht verwenden, holen Sie sich den Quelltext-Tarball und installieren Bochs nach dessen Entpacken mit dem Dreischritt configure && make && make install. Dazu benötigen Sie freilich die entsprechenden Devel-Pakete der verwendeten Bibliotheken.

Erste Schritte

Obwohl Bochs auf Wunsch sogar Mehrkernprozessoren emuliert, läuft es selbst nur single-threaded, wobei es einen CPU-Kern komplett auslastet. Zu einem vollwertigen System gehören neben der CPU auch weitere Komponenten, wie ein BIOS, ACPI-Tabellen und ein APIC. Diese stellt Bochs durchaus bereit, allerdings funktionieren sie nicht immer so, wie man erwarten würde. Bei aktuellen Linux-Distributionen bewährt es sich deshalb, sie mit der Option "apci=off noapic" zu starten.

Die zu emulierende Hardware definieren Sie in einer textbasierten Konfigurationsdatei. Beim Start sucht Bochs an folgenden Stellen (in dieser Reihenfolge):

  • ./.bochsrc
  • ./bochsrc
  • ./bochsrc.txt
  • ~/.bochsrc
  • /etc/bochsrc

Das RPM von der Bochs-Homepage liefert eine vollständige und gut kommentierte Vorlage im Verzeichnis /usr/share/doc/bochs. Die Datei fällt zwar recht groß aus, tatsächlich benötigen Sie aber letztlich nur wenige Einträge zwingen. Eine kompakte Ausgangsbasis für erste eigene Experimente zeigt das Listing 1.

Listing 1

# Bochs-Konfigurationsdatei
cpu: count=1, ips=64000000
cpuid: apic=legacy, x86_64=0
memory: guest=1024, host=1024
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-de.map
vga: extension=cirrus
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest-cirrus
clock: sync=realtime, time0=local
ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth0
#ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:00, ethmod=tuntap, ethdev=/dev/net/tun, script=/home/bablokb/src/bochs-tools/bin/bxttuncfg
pci: enabled=1, chipset=i440fx, slot1=ne2k
ata0-master: translation=auto, type=disk, mode=flat, path=/data/bochs/hda.img, cylinders=311, heads=16, spt=63
ata1-master: type=cdrom, path=/dev/cdrom, status=inserted

Massenspeicher

Bochs liest sowohl physisch gemountete CDs und Floppys als auch entsprechenden Images. Wollen Sie im im laufenden Betrieb eine Wechselmedium tauschen, nutzen Sie dazu entweder reale Medien oder wenden einen kleinen Trick an: In der Hardware-Definition tragen Sie nicht den Pfad direkt zum Image ein, sondern einen symbolischen Link, der auf das Image zeigt. Für den Medienwechsel geben Sie dann zunächst den Datenträger im Gastbetriebssystem frei, anschließend über das Icon oben links zusätzlich im Bochs-GUI. Jetzt legen Sie den Symlink einfach auf das neue Image um, machen Bochs über die GUI wieder mit dem Datenträger bekannt und greifen letztlich im Gastbetriebssystem darauf zu.

Ähnlich wie andere Emulatoren beziehungsweise Virtualisierer bildet Bochs IDE-Festplatten über große Dateien nach. Dabei unterstützt es eine reiche Auswahl an Formaten inklusive jener von Vmware. Unter Unix unterstützt Bochs auch rohe Partitionen, das Benutzerhandbuch rät davon aber explizit ab. Sie erzeugen die "Festplatte" entweder über das altbekannte Kommando dd oder mit dem Bochs-Programm bximage. Als großer Vorteil von Bximage erweisen sich die zahlreichen unterstützten Festplattenformate (siehe Tabelle "Bximage: Festplattenformate").

Das einmal erstellte, noch leere Festplattenabbild gilt es dann nach dem Booten des Gastbetriebssystem normal zu partitionieren und formatieren. Eine mögliche Alternative beschreibt der Abschnitt über die Bochs-Tools weiter unten.

Bximage: Festplattenformate

Name Eigenschaften
flat eine große Datei, LBA-Layout
concat mehrere Dateien (logisch konkateniert)
external für Entwickler
dll für Entwickler (nur Windows-Port)
sparse platzsparend, mehrere "stapelbare" Container, unterstützt Rollback und Commit
vmware3 Vmware-Festplattenformat (Version 3)
vmware4 Vmware-Festplattenformat (Version 4)
undoable analog zu flat, aber mit Rollback und Commit
growing Datei wächst mit den belegten Blöcken
volatile analog zu undoable, aber mit automatischem Rollback
vvfat reicht ein externes VFAT-Verzeichnis durch

Der erste Start

Nach der Einrichtung der virtuellen Hardware geht es an den ersten Start des Emulators. Das Kommando bochs -q ("quiet") startet Bochs und überspringt dabei den initialen Auswahldialog. Dieses meist überflüssige textbasiertes Konfigurationsmenü bietet unter anderem Auswahlmöglichkeiten für die Hardware sowie die Gelegenheit, eine angehaltene Bochs-Session wieder zu starten (Abbildung 3).

Abbildung 3: Bochs-Auswahlmenü nach dem Start.

Falls die Hardware richtig konfiguriert haben und auch sonst keine Probleme auftauchen, bootet das Gastbetriebssystem. Während des Startens und auch im Betrieb sollten Sie auf die Zahl links unten im Bochs-GUI achten: Hier steht der gemessene Wert für die instructions per second (IPS). Er bestimmt unter anderem, wie schnell die interne Uhr des Gastbetriebssystems tickt.

Fehlerhafte Werte in der Hardware-Konfiguration führen hier zu eigenartigen Effekten, da die Uhr des Gastes nicht synchron zu jener des Wirts läuft – daran ändert dann auch der Parameter sync in der clock-Definition in .bochsrc (Listing 1) nichts. Es kann dann vorkommen, dass beispielsweise jeder Anmeldeversuch am Gastsystem scheitert, weil Sie nach Eingabe des Benutzernamens nicht schnell genug das Passwort liefern können: Der Gast meint, seit Eingabe des Benutzernamens seien schon 60 Sekunden verstrichen und bricht mit einem Timeout ab, obwohl in Realzeit nur drei Sekunden vergangen sind. Oft funktionieren auch Doppelklicks nicht, da aus Sicht des Gastsystems die einzelnen Klicks zu lange auseinander liegen.

Unangenehmerweise kann Bochs obendrein keine konstante IPS-Rate synthetisieren. Dadurch läuft die Uhr des Gastes stets schneller, wenn er sich im Idle-Modus befindet. Schon beim Booten geben deshalb Linux-Kernel den Hinweis aus, dass die Uhr des Rechners keine zuverlässigen Werte liefert.

Um die Maus im Gastbetriebssystem zu nutzen, klicken Sie auf das Maus-Icon oben links in der Bochs-GUI. Durch Betätigen der mittleren Maustaste bei gedrücktem [Strg] kommt die Maus bei Bedarf wieder frei. Bei Tastaturkommandos kann es hie und da etwas klemmen. Darin unterscheidet sich Bochs nicht von anderen Virtualisierern: Tastenkombinationen, die der Wirt abfängt (etwa [Alt]+[F2] für eine Kommandozeile in KDE) kommen nie in der Bochs-GUI an. Während unseres Tests verlor Bochs einige Male den Kontakt zur Tastatur, wenn wir sie zwischendurch für andere Zwecke einsetzten.

Die restlichen Icons der Bochs-GUI fallen selbsterklärend aus. So erzeugt das Snapshot-Icon beispielsweise einen Screenshot als BMP-Datei. Als besonders nützlich erweist sich die sogenannte Suspend-Funktion: Hier speichert Bochs seinen Zustand in ein Verzeichnis. Beim nächsten Start können Sie dann den Bootvorgang überspringen und sofort an der Stelle weitermachen, an der Sie die Session vorher angehalten haben.

Netzwerke

Bochs stellt über einen entsprechenden Eintrag in der Konfigurationsdatei dem Gast eine NE2000-kompatible Netzwerkkarte bereit. Da Bochs dazu direkt auf das rohe Netzwerkdevice zugreift, funktioniert das nur, wenn Bochs mit Root-Rechten läuft. Bei modernen Kerneln, die die Rechte feiner abgestuft vergeben, gibt es eine Alternative (siehe Kasten "User-Zugriff auf Netzwerk-Devices").

Der Wirt kann entweder eine echte Ethernet-Karte durchreichen (ein WLAN-Anschluss reicht nicht) oder per TUN/TAP-Interface mit dem Gast kommunizieren. Die Zeile 10 in Listing 1 (auskommentiert) zeigt die entsprechende Konfiguration. Zusätzlich zum Emulator muss das Wirtsystem ebenfalls die Netzwerkschicht konfigurieren. Das Listing 2 enthält die dafür notwendigen Befehle. In ein Skript verpackt, ruft Bochs diese automatisch nach dem Einrichten des Netzwerk-Interfaces auf (Parameter script=... in Zeile 10 von Listing 1).

Listing 2

#!/bin/bash
/sbin/ifconfig $1 192.168.2.1
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun -j ACCEPT

User-Zugriff auf Netzwerk-Devices

Traditionell dürfen unter Linux nur solche Prozesse direkt auf Netzwerk-Devices zugreifen, die mit Root-Rechten laufen. Moderne Linux-Systeme können aber über so genannte Capabilities Rechte feiner abgestuft vergeben. Üblicherweise verwaltet der Kernel seit Version 2.6.24 diese erweiterten Dateirechte, die man in der Boot-Konfiguration oder auf der Kommandozeile mit file_caps=1 aktiviert. Zusätzlich gilt es die fraglichen Dateisysteme beim Start mit dem Flag user_xattr einzuhängen.

Zur Konfiguration der Capabilities dient das Hilfsprogramm setcap, das sich bei OpenSuse im Pakets libcap-prog findet, bei Debian in libcap2-bin. Ein Beispiel für die Rechtevergabe für Bochs zeigt Listing 3. Die ersten vier Befehle stellen sicher, dass nur Mitglieder der Gruppe bochs das Programm ausführen dürfen. Der nächste Befehl (setcap) setzt die entsprechenden Zusatzrechte, der letzte Befehl gibt sie zur Kontrolle nochmals aus.

Listing 3

# groupadd bochs
# usermod -A bochs bablokb
# chgrp bochs /usr/bin/bochs
# chmod 750 /usr/bin/bochs
# setcap cap_net_raw,cap_net_admin=eip /usr/bin/bochs
# getcap -v /usr/bin/bochs

Zugriff von Außen

Da Bochs sowohl auf optische Medien als auch das Netzwerk zugreifen kann, stellen weder die Installation eines Gast noch der Datenaustausch mit einem laufenden System ein prinzipielles Problem dar. Allerdings erweist sich die Performance nicht eben als berauschend, weswegen der Autor dieses Artikels vor gut zehn Jahren die Bochs-Tools [3] entwickelte, die den Zugriff auf die Festplattenabbilder von Bochs auch ohne den Emulator ermöglichen. Zusätzlich enthalten die Tools auch noch einen Skript-Wrapper für Bochs, um dem Emulator über Unix-konforme Kommandozeilenoptionen einen Teil der Hardware-Konfiguration – insbesondere das zu bootende Image – erst beim Start mitzugeben.

Die Bochs-Tools unterstützen nur das alte Festplattenformat von Bochs, dafür gehen die Erstellung, das Partitionieren und das Formatieren schnell von der Hand. In Listing 4 erstellt der Aufruf in der ersten Zeile eine Festplatte mit zwei Partitionen (maximal vier sind möglich). Startet ein normaler Benutzer bxtcreate, scheitert er normalerweise, da das Programm intern sfdisk verwendet, das nicht bei jeder Distribution im Standardsuchpfad liegt. Spätestens bei der Formatierung brauchen Sie dann aber sowieso Rootrechte.

Listing 4

# bxtcreate -1 200m -2 128m hda.img
# bxtmkfs -t ext2 hda.img:1
# bxtmkfs -t swap hda.img:2
# bxtmount hda.img:1 /mnt

Die Formatierung erledigen die Befehle in den Zeilen 2 und 3 von Listing 3 mit dem Befehl bxtmkfs. Die zu formatierende Partition hängen Sie durch einen Doppelpunkt getrennt an den Namen des Images an. Genauso geben Sie beim Einhängen mit bxtmount die entsprechende Partition an. Wie beim normalen Mount-Befehl funktioniert das wiederum nur als Root. Einmal eingehängt, nutzen Sie die Partition wie jede andere Festplatte.

Den Bochs-Tools sieht man ihr Alter an. So war zum Zeitpunkt ihrer Erstellung noch Lilo der Standard-Bootloader für Linux. Das bxtlilo-Kommando installierte von außen auf der virtuellen Festplatte eine funktionsfähige Lilo-Konfiguration und unterstützte dabei auch Dual-Boot-Konfigurationen mit Windows. Prinzipiell wäre hier eine Portierung auf Grub überfällig.

Das neuere Festplattenformat concat macht das Hantieren mit Bochs-Festplatten auch einfacher. Nutzen Sie pro Partition eine physische Containerdatei, hängen Sie diese einfach per Loopback-Device ein. Selbst für das klassische flat-Format ist Bxtmount nicht mehr notwendig, denn das Util-Linux-Paket enthält mittlerweile das Programm kpartx, das via kpartx -a hda.img für jede Partition auf hda.img ein eigenes Loop-Device erstellt, etwa /dev/loop0p1, /dev/loop0p2 und so fort. Nach dem Aushängen entfernt kpartx -d hda.img die Device-Mappings wieder.

Fazit

Bochs präsentiert sich als freier, portabler und recht kompakter x86-Emulator. Allerdings reicht die Performance selbst auf aktuellen Wirtsrechnern nicht unbedingt aus, um damit produktiv mit aktuellen Distributionen zu arbeiten. Wollen Sie dagegen ein altes Betriebssystem samt passender "Hardware" wieder zum Leben erwecken, dass mit der modernen Hardware aktueller Virtualisierer nicht zurecht kommt, liegen Sie bei Bochs goldrichtig. Nebenbei lernen Sie auch noch Einiges über die internen Abläufe in einer x86-CPU. 

Infos

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

[2] Paketsuche bei OpenSuse: http://software.opensuse.org/search/

[3] Bochs-Tools: http://www.bablokb.de/bochs-tools/

Der Autor

Bernhard Bablok betreut bei der Allianz Managed & Operations Services SE ein großes Data-Warehouse mit Performance-Messdaten von Server bis zu Mainframes. Wenn er nicht Musik hört, mit dem Radoder zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Linux und Objektorientierung. Sie erreichen ihn unter mail@bablokb.de.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Related content

Kommentare