Windows 98 SE VM on x86_64 Linux host

Last modified: Sun Jun 12 17:18:16 EDT 2016

Support for W98SE virtual machines (VMs) in current hypervisors is surprisingly weak.



VirtualBox ("vbox") has such complicated and invasive dependencies, including an out-of-tree kernel module, that attempting to get it working on Slackware looked hopeless.  Instead I spun up Ubuntu 16.04 LTS (Xenial) in a spare partition and installed the binary package of VirtualBox 5.0.20 from Oracle's archive using apt-get.

Vbox supplies a template for Windows 98 VMs, albeit with the warning that only "limited testing has been performed."  I made the following changes to the defaults:

The customized boot image that I had been using ever since it worked on Wildcat Point led to a lockup as soon as the CD driver was used.  Replacing XMGR.SYS, UDVD2.SYS, and SHSUCDX.COM with the original 3 drivers HIMEM.SYS, OAKCDROM.SYS, and MSCDEX.EXE got rid of the lockup.  I did not revert all the way back to the original boot image, which tries to load many other extraneous drivers.

The serious failures that occurred during installation show that vbox's emulation of vintage hardware has problems, but it is an order of magnitude better than QEMU, and the resulting VM was usable.

No love for img

A major annoyance with vbox is its irrational lack of support for using raw hard drive images.  All you can do is use its command line tool to convert to and from a supported format.

From img to vdi:  vboxmanage convertfromraw blah.img blah.vdi --format VDI
From vdi to img:  vboxmanage clonemedium disk blah.vdi blah.img --format RAW

You can't even just copy a vdi file.  Vbox "registers" virtual hard drives in a database somewhere and fails on UUID collisions.


QEMU integrates with KVM to provide hardware-assisted virtualization and emulates hardware of the appropriate vintage for running W98SE.  Unfortunately, support for W98SE in QEMU and KVM have not been maintained, assuming that they ever worked at all.

Tested qemu-2.6.0 with kernel 4.5.0.


./configure --prefix=/usr/local/qemu-2.6.0 --audio-drv-list=alsa,sdl --enable-seccomp


QEMU_SHARED_OPTS="-enable-kvm -m 384M -sandbox on -machine pc -cpu pentium2 -display gtk -vga std -no-hpet -no-acpi -soundhw sb16,pcspk -drive index=0,file=rawhdd.img,format=raw,media=disk,readonly=off"
export QEMU_AUDIO_DRV=alsa

# Must first fix permissions on /dev/kvm
qemu-system-i386 ${QEMU_SHARED_OPTS} -cdrom W98SE.iso -boot d

Despite KVM, installation ran much more slowly than it did with VirtualBox.

Problems with resulting VM:

Warnings printed by QEMU included:

main-loop: WARNING: I/O thread spun for 1000 iterations
sb16: warning: command 0xfa,0 is not truly understood yet
sb16: warning: command 0xf,1 is not truly understood yet
sb16: warning: command 0xe,2 is not truly understood yet
sb16: warning: command 0xf9,1 is not truly understood yet

Differences when KVM is not enabled:

If options if=virtio,cache=unsafe are added to the disk specification, W98SE fails thusly on the first reboot:

While initializing device IOS:
Error: An I/O subsystem driver failed to load.
Either a file in the .\iosubsys subdirectory is corrupt,
or the system is low on memory.


DOSBox-X (henceforth dbx) got to a Windows desktop without all the flailing, but the resulting VM was still unusable.

Tested git sources cloned on 2016-06-04.


# x86 dynamic cpu core cannot be enabled for x86_64.
./configure --prefix=/usr/local/dbx --with-sdl-prefix=/usr/local/SDL \
  CPPFLAGS="-I/usr/local/fluidsynth-1.1.6/include" \

Run:  dosbox-x -conf ~/tmp/dbx.conf

Here is dbx.conf.  These settings were not necessarily optimal; I found out afterward that the best available documentation is the comments in the default config file that you get by typing config -all -wcp /tmp/default.conf at the Z: prompt.

The hotkey to release the mouse grab is Ctrl-F10.

Bugs, quirks, and limitations in the tested snapshot of dbx: