
Booting FreeDOS with two CD-ROM drives
In the 1980s and 1990s, DOS was my favorite operating system. There were a ton of great DOS applications and games. And the great thing about DOS is that it provides great backwards compatibility, so you don’t have to keep “rebuilding” the DOS programs to run them on a different version of DOS. It’s all “DOS.” That means I can still run my favorite DOS applications and games, even in 2025, using the FreeDOS Project.
I have a “retro” ‘386-SX40 laptop if I want to run FreeDOS on real hardware—but most of the time, I just run FreeDOS in a “window” on Linux, using a virtual machine. There are a lot of great virtual machine systems that run DOS, but my favorite is QEMU. This is a very flexible virtual machine that is included by default on many Linux distributions. If it’s not installed on your Linux system, you should be able to install it as a package, such as with the dnf command on Fedora:
$ sudo dnf install qemu
From the command line
While other virtual machine systems like VirtualBox use a graphical interface to configure the machine, QEMU does everything from the command line. This actually works well for me; I like to use the command line anyway. For example, I use these two commands to create a virtual disk and boot the FreeDOS LiveCD to install FreeDOS on it:
$ qemu-img create -f qcow2 freedos.qcow2 500M
$ qemu-system-i386 -hda freedos.qcow2 -cdrom T2507LIVE.iso -boot order=d
That uses the FreeDOS “July 2025” monthly test release (T2507
) but you can do the same with any version of FreeDOS. The -hda
option tells QEMU to use the disk image as the first IDE disk, and -cdrom
indicates the ISO image to use for the CD-ROM drive. The -boot order=d
option instructs QEMU to only boot from the CD-ROM drive, which lets me install FreeDOS from CD.
After that, I use a longer variation of that command line to define a second virtual disk with my personal files, sound, local time, and other options. I put all of that into a script called qemu
, so I can just run that to boot FreeDOS in QEMU:
#!/bin/bash
hda=/opt/freedos/T2507/freedos.qcow2
hdb=$HOME/virtualmachines/files.qcow2
cd=/opt/freedos/T2507/T2507BNS.iso
sound='-audiodev pa,id=snd -machine pcspk-audiodev=snd -device sb16,audiodev=snd -device adlib,audiodev=snd'
kbd='-global i8042.kbd-throttle=on'
boot='-boot menu=on'
qemu-system-i386 -enable-kvm -m 32 -rtc base=localtime $sound $kbd -hda $c -hdb $d -cdrom $cd $boot "$@"
I prefer to keep my personal files on a separate virtual disk so I don’t have to back up and restore my files when I install the next month’s test release. With my files safely stored on a separate “D:” virtual disk, it’s really easy to just start over with a fresh FreeDOS install by creating a new “C:” disk and installing on that, then connecting the “D:” drive when I want to actually use the new system and run my programs.
Installing packages
I usually start with a “plain DOS” install, because that takes only a few minutes to install from CD, then install other packages as I need them. The FDIMPLES
program is the package manager on FreeDOS, and it presents a friendly interface to install packages from the CD-ROM.

For example, I like to create my own programs for FreeDOS, so I also install a few compilers and editors from the BonusCD. That works well until I need to install a package from the other CD-ROM. Wrong disc defined in QEMU? Shut down the virtual machine, update the qemu
script, and “reboot” the virtual machine.
I recently changed my qemu
script to just use both CD-ROMs at the same time. This makes it a lot easier if I need to install a package, because both the LiveCD and BonusCD will be instantly available without rebooting QEMU.
Ideally, I’d just use -hda
and -hdb
for the hard disks, and two -cdrom
options to specify the two CD images. But QEMU only allows one -cdrom
option. Instead, I have to specify everything using -drive
options to set up the IDE virtual drives.
It’s a tricky command line, but the important part is that the C: hard drive is on bus 0 unit 0, the D: hard drive is on bus 1 unit 0. And the CD drives are on bus 0 unit 1, and bus 1 unit 1. You could do it in a different order if you prefer, as long as the C: hard drive is on bus 0 unit 0.
#!/bin/bash
hda=/opt/freedos/T2507/freedos.qcow2
hdb=$HOME/virtualmachines/files.qcow2
live=/opt/freedos/T2507/T2507LIVE.iso
bonus=/opt/freedos/T2507/T2507BNS.iso
ide="-drive bus=0,unit=0,media=disk,file=${hda} -drive bus=0,unit=1,media=disk,file=${hdb} -drive bus=1,unit=0,media=cdrom,file=${live} -drive bus=1,unit=1,media=cdrom,file=${bonus}"
sound='-audiodev pa,id=snd -machine pcspk-audiodev=snd -device sb16,audiodev=snd -device adlib,audiodev=snd'
kbd='-global i8042.kbd-throttle=on'
boot='-boot menu=on'
qemu-system-i386 -enable-kvm -m 32 -rtc base=localtime $sound $kbd $ide $boot "$@"
Two at a time
With this config, when I want to install a package, FDIMPLES
will use the first CD it finds (the LiveCD on bus=1,unit=0 as the “E:” drive).

If I want to install a package from the BonusCD, I just run:
FDIMPLES F:
..and FDIMPLES
uses the BonusCD that’s on bus=1,unit=1.
