Thursday, May 05, 2005

Boot KNOPPIX from an USB Memory Stick

Boot KNOPPIX from an USB Memory Stick

: 把 KNOPPIX 塞在 USB 隨身碟帶著走
配備pretec 128 cf card + cf 讀卡機
2.syslinux /dev/sda bios choose boot from USB-ZIP

Boot KNOPPIX from an USB Memory Stick What you'll need:

Knoppix or an already stripped down version
USB Memory Stick
Computer capable of booting from USB
kernel with cloop-support
Preparing everything:

I used Damn Small Linux for this (it's only 51MB and has fluxbox ;-), but every other stripped down Knoppix version should do (if you have enough space on your memory stick).
You can also strip down your own version of knoppix (see the Knoppix Customising FAQ).

Modifying miniroot.gz:

First you need to modify the boot-image (KNOPPIX/boot.img). Mount it (mount -o loop boot.img /mnt) and copy everything in a directory (e.g. ~/knoppix-usb/bootdisk). You need to modify linuxrc in miniroot.gz and put the relevant usb modules in modules/usb/.

Now use gunzip to uncompress miniroot.gz and then mount it (mount -o loop miniroot /mnt). Open linuxrc with your editor. You need to load the relevant usb-modules and make sure to sleep some time, because the modules need some time to recognize your USB Memory stick. I put the relevant parts before the scsi modules are loaded to make sure, that my USB Memory Stick will be /dev/sda: # load usb-modules first (so that memory-stick becomes /dev/sda1) # uncomment for USB 2.0 support (experimental) #insmod -f /modules/usb/ehci-hcd.o insmod -f /modules/usb/usbcore.o insmod -f /modules/usb/usb-uhci.o insmod -f /modules/usb/uhci.o insmod -f /modules/usb/usb-ohci.o insmod -f /modules/usb/usb-storage.o # need to sleep because it takes some time to register things ash -c "sleep 4"

Now you need to make sure, that your root-fs is mounted to /cdrom: I commented out the section in linuxrc where a CDROM is searched and put the following lines in: # mount /dev/sda1 (memorystick to cdrom) FOUND_KNOPPIX="/dev/sda1" mount -t vfat /dev/sda1 /cdrom

You can get my modified linuxrc here

Now we still need the usb modules (that aren't on the miniroot). Mount the compressed KNOPPIX file (insmod cloop file=PATH/KNOPPIX && mount -t iso9660 /dev/cloop /cdrom) and copy the following files under /cdrom/lib/modules/$KERNELVERSION/kernel/drivers/usb/ to /mnt/modules/usb/:
ehci-hcd.o uhci.o usb-ohci.o usb-storage.o usb-uhci.o usbcore.o
Now you're finished modifying miniroot. Umount it and gzip the file again.

Preparing the Memory Stick

Create a fat-partition on your stick and format it with mkfs.vfat
Mount the memory stick
Copy the files from ~/knoppix-usb/bootdisk/ on the memory stick (that should include your modified miniroot.gz)
Copy the other files from your modified knoppix to the memory stick (the most important is KNOPPIX/KNOPPIX)
The layout on your Memory Stick should look like this:

sh-2.05b# ls -lR
.: total 1576
-rw-r--r-- 1 root root 54 Apr 27 12:48 autorun.bat
-rw-r--r-- 1 root root 47 Apr 27 12:48 autorun.inf
-rw-r--r-- 1 root root 180 Apr 27 12:48 boot.msg
-rw-r--r-- 1 root root 1759 Apr 27 12:48 f2
-rw-r--r-- 1 root root 256 Apr 27 12:48 german.kbd
dr-xr--r-- 2 root root 4096 Apr 27 12:48 knoppix
-rw-r--r-- 1 root root 3262 Apr 27 12:48 knoppix.ico
-r--r--r-- 1 root root 7836 Apr 27 12:51 ldlinux.sys
-rw-r--r-- 1 root root 34395 Apr 27 12:48 logo.16
-rw-r--r-- 1 root root 607866 Apr 27 14:03 miniroot.gz
-rw-r--r-- 1 root root 2402 Apr 27 12:48 syslinux.cfg
-rw-r--r-- 1 root root 921602 Apr 27 12:48 vmlinuz
./knoppix: total 50820
-rw-r--r-- 1 root root 2048 Apr 27 12:48
-rw-r--r-- 1 root root 1474560 Apr 27 12:48 boot.img
-rw-r--r-- 1 root root 50553629 Apr 27 04:48 knoppix
-rw-r--r-- 1 root root 27 Apr 27 12:48 mkfloppy.bat
Now you need to get the Memory Stick bootable: umount it and run 'syslinux /dev/sda1' (or /dev/sd?1 depending on your system).

The ugly part: booting

If you're lucky your computer will boot out of the box when you select USB ZIP as a bootdevice. Otherwise read on...

You can try the other USB Boot Options (Floppy, CD-ROM, Harddisk), if still nothing happens you might have to enable USB Keyboard Support in your BIOS (needed on some motherboards with AMI BIOS and a Via chipset, including Epia-m and Shuttle mv42n).
On some broken boards (like my Epia-M...) you need to plug the memory stick in without any power (remove your power plug), otherwise the BIOS might not recognize the memory stick.
If your BIOS boots from the Memory Stick, but you can see only sequences of ones and zeroes, you can try an alternative bootsector from spblinux. As the site is sometimes down you can download the bootsector here(Version 1.01). Just put this one on /dev/sda and try it out (dd if=spb2_mbr.sec of=/dev/sda). Many thanks to Christian Ostheimer for his great work (I didn't believe anymore in booting from USB, but his spblinux made it possible ;-)
You can get my modified Damn Small Linux here (52 MB)