Making DOS bootable USB hard disks

Would you like to share some of your solutions for certain problems? Tips or tricks? Post here. All new topics are automatically moderated.

Making DOS bootable USB hard disks

Postby aragon » 13 Nov 2010, 07:53

There are a number of guides online that show one how to create DOS bootable USB floppy disks, but these all follow the same theme:

  1. Obtain preformatted floppy image.
  2. Write image to USB stick.

The problem with that is that you're stuck with two things:

  1. A DOS file system that can never hold more than 1.44 MB of data (ok, 2.88 MB if you manage to find a 2.88 MB image file).
  2. A USB stick that is useless for anything else unless you reformat it.

The other problem is that a lot of these guides are written for Windows. This one is for FreeBSD!

I've had more than one occasion where a firmware update simply couldn't fit into 1.44 MB, even after deleting everything but [file]io.sys[/file], [file]msdos.sys[/file], and [file][/file].

So I decided to figure out how to create a bootable DOS hard disk manually. One key difference between a hard disk and a floppy disk in this context is that the hard disk has an MBR and so can have multiple partitions - one for your bootable DOS image, another for the rest of your USB stick. The other difference is that hard disk partitions can be much larger than 1.44 MB. By setting up your USB stick like this you could even have multiple OSes installed with a boot manager to select between them, or just have a small DOS partition and another for your normal data.

So the first thing you need to do is setup your MBR and partition table. There are some limitations with DOS in that its boot partition can't start beyond a certain offset on the disk. For simplicity I'll only be showing you how to set things up with your DOS partition at the beginning of the disk, but feel free to experiment.

All commands assume your USB disk is at [file]/dev/da0[/file]. Adjust accordingly. Before you begin you will need:

  1. The attached [file]bootsect.gz[/file] file.
  2. A bootable DOS floppy image, or any source of [file]io.sys[/file], [file]msdos.sys[/file], and [file][/file] (an MS-DOS 6.22 image from is one option).

[SIZE="4"]Step 1: Wipe your disk[/SIZE]
[cmd=#]dd if=/dev/zero of=/dev/da0 bs=1m count=2[/cmd]

[SIZE="4"]Step 2: Create MBR and partitions[/SIZE]
I'll be creating a 64 MB FAT16 partition. If you experiment with the size you might need to adjust the partition type. See here for a guide on partition types. I'm also using the basic, active partition chainloading boot manager at [file]/boot/mbr[/file], but you could try [file]/boot/boot0[/file] too.
[cmd=#]gpart create -s MBR da0[/cmd]
[cmd=#]gpart add -s 64m -t \!6 da0[/cmd]
[cmd=#]gpart set -a active -i 1 da0[/cmd]
[cmd=#]gpart bootcode -b /boot/mbr da0[/cmd]

Code: Select all
# gpart show da0
=>      63  32014017  da0  MBR  (15G)
        63    131040    1  !6  [active]  (64M)
    131103  31882977       - free -  (15G)

[SIZE="4"]Step 3: Create file system and system boot files[/SIZE]
Decompress the attached [file]bootsect.gz[/file] file:
[cmd=#]gunzip bootsect.gz[/cmd]

It's important that you follow the next few steps precisely. Veering off from these instructions may cause the file system to be created incorrectly.

Take note of the start offset of the partition you created above. In this example it is 63. Create the file system:
[cmd=#]newfs_msdos -B /full/path/to/bootsect -o 63 /dev/da0s1[/cmd]
You'll notice above the partition offset goes in the "-o" parameter. Make sure you specify a full path to the bootsect file or else [man=8]newfs_msdos[/man] will look in [file]/boot[/file].

Mount your file system:
[cmd=#]mount_msdosfs /dev/da0s1 /mnt[/cmd]

Setup system files root directory entries:
[cmd=#]cd /mnt && touch IO.SYS MSDOS.SYS COMMAND.COM[/cmd]
The order of the files above and their uppercase names is crucial.

Copy valid system files to your file system:
[cmd=#]cp io.sys msdos.sys /mnt/[/cmd]
(I haven't shown you where/how to get the above system files on purpose - they could come from many sources...)

[cmd=#]umount /mnt[/cmd]

You're done for now. You should be able to boot up with your USB stick now.

More details coming...
(515 Bytes) Downloaded 478 times
Giant Locked
Posts: 2031
Joined: 16 Nov 2008, 17:04
Location: Cape Town, South Africa

Obtaining io.sys, msdos.sys, and

Postby aragon » 13 Nov 2010, 08:10

This is just one example for obtaining the above DOS system files, but it's probably the easiest too.

Go to and look for the section labeled "Non-Windows Based Image Files". Download a DOS 6.22 image. This will likely be a Zip file, so extract it:

[cmd=$]mkdir /tmp/boot[/cmd]
[cmd=$]cd /tmp/boot[/cmd]
[cmd=$]tar xzf /path/to/zip/file[/cmd]

Inside [file]/tmp/boot[/file] you'll see a file that is approximately 1.4 MB in size. That's the image you're after. Mount it:

[cmd=#]mkdir /tmp/dos[/cmd]
[cmd=#]mount_msdosfs /dev/$(mdconfig -a -t vnode -f /path/to/image/file) /tmp/dos[/cmd]

Now if you look in [file]/tmp/dos[/file] you'll see all the DOS files that are in the image. The most important ones are [file]io.sys[/file], [file]msdos.sys[/file], and [file][/file] mentioned in the previous post, but you might want to grab all the others too... especially since you have plenty of disk space now. :)
Giant Locked
Posts: 2031
Joined: 16 Nov 2008, 17:04
Location: Cape Town, South Africa

Volume Label

Postby aragon » 13 Nov 2010, 08:23

The only minor annoyance left is to fix the volume label of your DOS partition. Unfortunately you can't specify one with "-L" to [man=8]newfs_msdos[/man] as that will cause it to create a root directory entry before the 3 system files. This will break bootability so the volume label has to be changed after creating your boot disk in post #1.

If anyone knows of a tool to rewrite volume labels in FreeBSD, please let us know. Otherwise the only option is to use a Windows box, sorry. :)

Ok, so there's a half fix for those confident with a hex editor:

[cmd=#]dd if=/dev/da0s1 of=/tmp/bs bs=512 count=1[/cmd]

Open [file]/tmp/bs[/file] in your hex editor and modify offsets 0x2B to 0x35 inclusive (11 bytes). For labels less than 11 characters, use spaces as padding (0x20).

Save your changes and then:

[cmd=#]dd if=/tmp/bs of=/dev/da0s1 bs=512 count=1[/cmd]

This is a half fix because it doesn't create a volume label entry in the root directory structure further down in the file system. Some systems only bother to read the volume label from the boot sector though. If you're really obsessed you could create that entry with a hex editor too - let us know how it went. ;)
Giant Locked
Posts: 2031
Joined: 16 Nov 2008, 17:04
Location: Cape Town, South Africa

How did I create the bootsect file?

Postby aragon » 13 Nov 2010, 08:34

This information might be handy in future, so here goes.

The bootsect file attached in post #1 is a slightly modified DOS floppy disk boot sector. I started with the floppy image referenced in post #2, but I imagine others will work too.

Following on from post #2, copy the boot sector out of the floppy image:

[cmd=#]dd if=/path/to/image/file of=/tmp/bootsect bs=512 count=1[/cmd]

Open the resulting file in a hexeditor and modify offset 0x24 - change it from 0x0 to 0x80. You can also modify the OEM string if you like. It's at 0x3 to 0xA inclusive (8 bytes) and is space padded (0x20). I set it to "FREEBSD" in the file attached in post #1.

The bootsect file is useless as is - you need to feed it to [man=8]newfs_msdos[/man] when you create your file system.
Giant Locked
Posts: 2031
Joined: 16 Nov 2008, 17:04
Location: Cape Town, South Africa


Postby aragon » 13 Nov 2010, 09:05

Giant Locked
Posts: 2031
Joined: 16 Nov 2008, 17:04
Location: Cape Town, South Africa

Return to Howtos & FAQs (Moderated)

Who is online

Users browsing this forum: No registered users and 0 guests