Thursday, 27 April 2017

Creating a bootable USB drive when the BIOS supports only USB ZIP

Creating a bootable USB drive when the BIOS supports only USB ZIP


Mini-ITX Epia 5000-L motherboard, ready to boot.
The red USB stick is the boot medium,
1GB USB stick with a complete Debian 6 install
masquerading as a 250MB USB-ZIP drive.

My used mini-ITX motherboard has a BIOS limitation that prevents it from booting from ordinary hybrid-iso images. The BIOS doesnt recognize USB-HDD (the popular type used today), but only older USB-FDD (USB floppy drive, limited to 1.4MB) or USB-ZIP (USB Zip Drive, limited to 250MB).

Who today has useful systems that fit in 250MB?

This is a demonstration of how to use a chainloader to get around the 250MB restriction. Here is how to build a working full install of Debian 6 on a bootable USB Stick. Its a full install (not a live-install that uses a ramdisk), so all the slow read/writes to the USB stick will make the system very slow and wear out the USB stick prematurely. Again, this is just a demo of how to use a chainloader to get around that 250MB restriction.

1) Create the Linux system

This is the long and complicated part. Use debootstrap to create a complete system somewhere else. I explained how I did it in this post for an SD card, and its almost exactly the same.

Creating the complete system in, say, /var/usb-env should include creating /boot/initrd.img.version# and vmlinuz.version# , but not grub. We will use initrd.img and vmlinuz in Step #3, and this demo uses the simpler syslinux instead of grub.

2) Prepare the USB Stick

To be understood by the old BIOS, the USB stick needs an MBR up front, followed by a FAT boot partition of less than 250MB and labeled as the 4th partition (though its really the first partition). After that, we can do whatever we like.

The best tool for creating a USB-ZIP bootable partition is mkdiskimage, part of the syslinux package. Everything below should be done as root to the unmounted USB-stick:
MAKE SURE you are using the right /dev/DEVICE
/dev/sdb was mine, but probably wont be yours!

# mkdiskimage -Mz4 -i usb-zip /dev/sdb 15 64 32
-M and 15: Create a 15 MB partition (I only needed 12 MB)
-z4: Create a zip-disk geometry on partition 4 (normal for zip disks)
-i usb-zip: Name of the partition. Use any name you wish
Of course, your /dev/DEVICENODE may vary. BE SURE you are using the right node!
15 64 32: 15 MB (see -M), 64 heads, 32 sectors (62 and 32 are required for zip)

After the USB-ZIP partition is made, you can do the rest of the partitions in your favorite editor. I used Gparted to create a 700MB Linux partition and the remaining space on the device as a swap partition.

3) Install files onto the boot partition

The install files consist of the bootloader, and the Linux /boot/initrd.img.version# and vmlinuz.version# files. The bootloader simply tells the system to load the linux kernel (vmlinuz), then to load the temporary system startup files (initrd.img) that the kernel can understand. One of the appended command options tells initrd where to find the final system root mountpoint on the other partition.

There are many bootloaders that can be used here, including grub. For simplicity, Im using syslinux instead of grub. I dont need all of grubs configuration options - I just want the bootloader to immediately start loading the kernel and initrd.

For syslinux, we only need four files on the boot partition: The syslinux binary, syslinux.cfg, vmlinuz, and initrd.img. We also need to know the UUID of the other partitions for the syslinux.cfg file.
Once again, MAKE SURE you are using the right /dev/DEVICE
/dev/sdb was mine, but probably wont be yours!

Check the USB stick partitions before mounting
# fsck -f /dev/sdb1 # Blank linux, -f forces a check
# fsck -f /dev/sdb4 # Blank boot

Get the UUIDs of the various partitions
# blikd # Get the UUIDs of the newly created partitions

Install Syslinux
# syslinux --install /dev/sdb4

Mount the boot partition
# mount -t vfat /dev/sdb4 /mnt

Copy vmlinuz and initrd.img from the prepared system.
Rename the files to comply with MSDOS 8.3 format
# cp /var/usb-env/vmlinuz.version /mnt/vmlinuz
# cp /var/usb-env/initrd.img.version /mnt/initrd.img

Create the syslinux.cfg file
# nano /mnt/syslinux.cfg # Use any editor you wish

##### Begin File
Default USB-Stick

display syslinux.msg
F1 syslinux.f1

prompt 40
timeout 30

Label USB-Stick
kernel vmlinuz
append initrd=initrd.img root=UUID=>UUID of the root partition<
##### End file

Unount the boot partition
# umount /mnt

4) Copy the linux system onto the USB Stick

Once again, MAKE SURE you are using the right /dev/DEVICE
/dev/sdb was mine, but probably wont be yours!

Mount the Linux partition
# mount /dev/sdb1 /mnt

Copy the system files
# cp -r /var/usb-env/{bin,etc,home,lib,media,mnt,opt,root,sbin,selinux,srv,tmp,usr,var} /mnt/

Create the system mountpoints
# mkdir /mnt/{boot,dev,proc,sys}

Edit /etc/fstab to add the correct UUIDs for the root, boot, and swap partitions
and remove the cruft from the creating-system disks.
If you need to discover a UUID, use the blkid command.
# nano /mnt/etc/fstab # Use any editor you wish, of course

#####Begin File
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=<UUID of the main system> / ext3 defaults,errors=remount-ro,noatime 0 1
UUID=<UUID of the boot partition> /boot vfat defaults,errors=remount-ro,noatime 0 2
UUID=<UUID of the swap partition> none swap sw 0 0
#####End File

Unmount the linux partition, check the USB stick for damage once more
# umount /mnt
# fsck -f /dev/sdb4
# fsck -f /dev/sdb1

Successful boot to Debian 6 login prompt!
5) Youre Done

Unplug the USB stick, walk over to the system you want to boot, plug in the USB stick, and....well, boot.
download
alternative link download

Like the Post? Do share with your Friends.