ChromeOS currently has Linux support in beta so I installed it recently to give it a try.  To my surprise I was presented with BASH in what looks like a Debian environment.  Leaving for work the next morning it dawned on me that I should be able to get Qemu in the Debian environment.  If I can get Qemu then I can likely install Windows 98 SE in a Qemu virtual machine (VM).

Why?  Why not?

What's a virtual machine?

A virtual machine is like running a computer on another computer.  It's a useful way of running multiple "computers" on one piece of hardware.  More information on Wikipedia.

Linux app support

Linux support has been available in beta since ChromeOS 66.  You'll need to enable this from the settings menu, with more details on the Chromebook support site.  Once Linux support is installed you'll be presented with a Debian shell (in this case a BASH terminal).

Install Qemu

In the Debian shell, start with sudo apt update && sudo apt upgrade to ensure the Debian environment is up to date.  Next install Qemu via sudo apt install qemu.

Make your working directory and copy the CD

For tidiness we'll store all our files in a directory.  In the Debian shell create a new directory with mkdir Win98SE.  Move into the new directory with cd Win98SE.

My Chromebook doesn't have an optical drive and I didn't fancy trying to pass a drive through to the Debian VM (and then through to Qemu) anyway.  I took an image of my Windows 98SE installation CD in ISO format.  This then needs to be transferred into the Debian environment.  For this I'll use secure copy, scp, to copy the file over from another system on my network.

scp [email protected]:/home/user/Win98SE.iso ./Win98SE.iso

Create the Qemu file system

We use qemu-img to create a hard disk file.  The create argument does as you'd expect while -f specifies the file format (qcow2) followed by the file name and disk size.  Given Windows 98SE has a tiny installation size compared to a modern Windows environment so 600MB should be more than enough.

[email protected]:~/Win98SE$ qemu-img create -f qcow2 Win98SE.cow 600M
Formatting 'Win98SE.cow', fmt=qcow2 size=629145600 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
[email protected]:~/Win98SE$
Creating an hard disk image file with qemu-img.

Start the Qemu virtual machine

In order to install Windows we'll need to be running the Qemu VM.  This is accomplished by using qemu-system-x86_64 and specifying a number of arguments.  Making sure you're in the Win98SE directory we created earlier, start the VM:

[email protected]:~/Win98SE$ qemu-system-x86_64 -k en-gb -cdrom Win98SE.iso -boot order=d -drive file=Win98SE.cow -m 512 -display sdl
Starting the VM we'll use for our Windows 98SE installation.
  • -k en-gb sets a keyboard layout, in this case to United Kingdom English (Qwerty)
  • -cdrom attaches an optical drive to the VM and Win98SE.iso is inserted into it
  • -boot order=d instructs the VM to boot from the optical drive (D:\ in Windows' context)
  • -drive file=Win98SE.cow attaches our hard disk file to the VM
  • -m 512 provides the VM with 512MB of RAM (more than a lot of Windows 98 machines I ever used had)
  • -display sdl uses the SDL display driver to render our VM's display, acting as the monitor

The VM will now boot and we can commence installation of Windows 98SE.

Troubleshooting: cursor keys not working

Initially I didn't specify -k en-gb and I thought nothing of it - I could still type alphanumerics characters.  Unfortunately my cursor keys didn't work so I couldn't select menu options.  Specifying the keyboard layout fixed the cursor key issues.  Thanks go to this AskUbuntu question for the tip off.

Windows installation

I won't take you through the Windows installation process - it's not that exciting - but here's a few screenshots in case you're interested.  On my Asus Chromebook C423NA Touch the installation took around 50 minutes.  I even got a Blue Screen Of Death (BSOD) during the installation but the process continued.

After the installation I was saddened to find solitaire wasn't installed.  By dredging up old memories of how to customise and manage this old operating system, I got solitaire installed.  Job done!

Solitaire running on Windows 98SE, in a Qemu VM on the Linux VM.

Adding an alias

To make it easier to start Windows 98SE in the future I'll add an alias.  Aliases in BASH mean we can create a shorthand for a longer command (or potentially override a command altogether).

  1. Open the Debian terminal
  2. Type cd to ensure we're in our home directory
  3. Type vi .bashrc
    .bashrc is a script that gets run each time we start the terminal, so we can define our aliases here
  4. Scroll down to find lines starting with #alias
  5. Press i to enter insert mode so we can edit the file, then create a new line and add our alias:
  6. alias w98se='qemu-system-x86_64 -k en-gb -cdrom ~/Win98SE/Win98SE.iso -boot order=c -drive file=~/Win98SE/Win98SE.cow -m 512 -display sdl'
    Note the boot order is set to c.  I want the 98SE CD available (in case I choose to customise the OS) but I don't want to try and boot from it
  7. Save and exit by pressing escape then : then wq followed by enter

Close the terminal.  From the next time the terminal is opened we can start the VM simply by typing w98se.

External resources

There's a nice explanation of how to run Windows 98 in Qemu on Wikibooks.


Banner image taken from the Windows 98SE splash screen.