====== Voyage Linux on USB flash drive ====== Author: Danny W. Adair Last Change: 21 May 2006 Voyage Linux won't work "on" USB storage devices out of the box. This is how I did get it working: ===== Summary ===== * We will make two partitions on the USB key, one for the boot loader and the kernel, one for the rest of the system. We need a separate partition for the kernel because of BIOS limitations (grub error 18 anyone?). * We'll get and unpack the current Voyage Linux distribution. It's got advantages over 0.2 and I hope it's going to be a stable release soon. * Voyage's "stock" kernel can't load the USB modules for mounting / to the second partition because that's a Catch-22: they're sitting on a USB drive partition! The solution is to recompile the kernel with this support built-in (hooray - we've got nothing better to do!): After recompiling the kernel and making a .deb package for it, we chroot into voyage on the host computer and install the new kernel. * We'll install voyage on the USB key, and it'll have our shiny new kernel. * We'll make minor adjustments to the installation on the USB key which the installation script currently doesn't do for us (Voyage seems to have its focus on Compact Flash drives, which are "real" IDE, and "hda" is assumed to be the target disk for voyage. We adjust that to "sda". ---- **Make sure you do all this as root.** ---- ===== 1. Prepare USB key ===== Make sure the right device driver is loaded: On my system EHCI was loaded instead of UHCI. Just rmmod ehci_hcd, modprobe uhci_hcd and then put the USB key in. The EHCI driver may look like it's working - if you get I/O errors, switch. a) Use fdisk or cfdisk to create one small bootable (make it at least 3MB, it needs to fit a kernel image) and one big (=rest) Linux partition. b) Create ext2 file systems on the partitions and turn off automated fsck: # mkfs.ext2 /dev/sda1 # tune2fs -c 0 /dev/sda1 # mkfs.ext2 /dev/sda2 # tune2fs -c 0 /dev/sda2 Your USB key is now ready for installation. ===== 2. Download voyage and kernel source ===== # mkdir ~/voyage-build # cd ~/voyage-build or whatever directory you would like to put this in # wget http://www.voyage.hk/download/voyage/voyage-current.tar.bz2 # wget http://www.voyage.hk/dists/unstable/kernel/kernel-source-2.6.15-voyage_3.0-1_all.deb # wget http://www.voyage.hk/download/kernel_config/config-2.6.15-486-voyage_3.0-1 You now have all you need for the installation. ===== 3. Recompile kernel for built-in USB storage support ===== I assume you have all necessary packages (make, gcc, kernel-package, etc.) installed on your host computer. a) Install source and unpack: # dpkg -i ~/voyage-build/kernel-source-2.6.15-voyage_3.0-1_all.deb # cd /usr/src/ # tar xjvf kernel-source-2.6.15-voyage.tar.bz2 b) Copy the "stock" voyage kernel configuration to the source tree: # cd kernel-source-2.6.15-voyage # cp ~/voyage-build/config-2.6.15-486-voyage_3.0-1 .config c) Ensure all the necessary drivers will be built-in: # make menuconfig You can navigate with cursor keys, select with enter, one level up with escape. Make sure the following are included (marked as "*" by hitting 'y'): * Device Drivers -> USB support -> Support for Host-side USB * Device Drivers -> USB support -> UHCI HCD (or OHCI HCD depending on the controller on your target computer - hopefully even EHCI HCD (USB 2.0) - not in my case) * Device Drivers -> USB support -> USB Mass Storage support * Device Drivers -> SCSI device support -> legacy /proc/scsi/ support * Device Drivers -> SCSI device support -> SCSI disk support Escape out and say "yes" to save the new kernel configuration. d) Compile the new kernel as a debian package: # make-kpkg --revision="3.0USB" --append-to-version "-486-voyage" kernel-image You can change the revision string if you like, I just want to indicate what this kernel will (additionally) be for. Now this usually takes a while... e) A shiny new kernel package (in my case called "kernel-image-2.6.15.6-ubuntu1-486-voyage_3.0USB_i386.deb") should now be sitting in /usr/src/. Note: The name of the new file may start with "linux-image-" instead of "kernel-image-". Just change accordingly in steps 5a) and 5c). ===== 4. Unpack voyage ===== # cd ~/voyage-build/ # tar --numeric-owner -zxvf voyage-current.tar.gz ===== 5. Install new kernel in voyage ===== We will need to do the old chroot procedure (see "Manual [[temp_customization|Customization]]" in the Voyage wiki). a) Copy the new kernel into voyage: # cp /usr/src/kernel-image-2.6.15.6-ubuntu1-486-voyage_3.0USB_i386.deb voyage-current/usr/src/ b) Get voyage ready for changes: # cd voyage-current/ # cp -r ro/* rw/ # cd .. # chroot voyage-current/ # mount -t proc none /proc c) Install the new kernel # dpkg -i /usr/src/kernel-image-2.6.15.6-ubuntu1-486-voyage_3.0USB_i386.deb * Say no to creating a boot floopy * Say no to booting Linux from the hard disk d) Leave the voyage "changes" environment: # umount /proc # exit e) To save space on the target, you can delete the kernel package from voyage now: # rm voyage-current/usr/src/kernel-image-2.6.15.6-ubuntu1-486-voyage_3.0USB_i386.deb NOTE: You're installing on a "fresh" key. Subsequent installations will change files differently. Shouldn't be too hard to figure out. ===== 6. Install voyage on USB key, adjust parameters for USB ===== Make sure your USB key is plugged in but not mounted. a) Go to voyage on your host: # cd ~/voyage-build/voyage-current b) Adjust the file system table of voyage: / will be mounted to sda2: # vi etc/fstab (vi or whatever editor you prefer) * Change "/dev/hda1" to "/dev/sda2" in the first line c) Make directories for mounting the USB key: # mkdir /mnt/usbkey1 # mkdir /mnt/usbkey2 Or wherever you would like to temporarily mount the key for installation. We'll be working on two partitions (and will need to copy from one to the other) so I'm using two directories. /mnt/usbkey2 will be used now, /mnt/usbkey1 will be needed in (the last) step 7. d) Start the voyage installation script: # ./voyage_update Specify correct disk (/dev/sda), voyage partition (2 -> /dev/sda2), bootstrap partition (1 -> /dev/sda1), temporary mount point (/mnt/usbkey2), and module 5 "Generic PC". Choose grub instead of lilo. You should get some congratulations soon. :-) e) Adjust the grub parameters on the boot partition (I hope this will become part of the voyage_update script): # mount /dev/sda1 /mnt/usbkey1/ # vi /mnt/usbkey1/grub/menu.lst (vi or whatever editor you prefer) * Change "kernel /vmlinuz root=/dev/hda2" to "kernel /vmlinuz root=/dev/sda2 rootdelay=10" * You can delete the "root (hd0,1)" because already exist "root=/dev/sda2". maybe is a bug from the script that makes a redundant root command, and double bad because "root (hd0,1)" should be "root (hd0,0)" anyway!! f) Provide a device map, so that grub knows what hd0 is in this case: # echo '(hd0) /dev/sda' > /mnt/usbkey1/grub/device.map ===== 7. Copy kernel to boot partition ===== We told grub that the kernel is at /vmlinuz, but it's on the other partition at the moment. Move the kernel over to the grub partition: a) /mnt/usbkey1 should still be mounted from the last steps, mount the voyage partition: # mount /dev/sda2 /mnt/usbkey2/ b) Move the entire "boot" directory to the grub partition - we'll be booting from there: # mv /mnt/usbkey2/boot/ /mnt/usbkey1/ c) Don't forget the symbolic link "/vmlinuz": # mv /mnt/usbkey2/vmlinuz/ /mnt/usbkey1/ You might have to adjust the link to point to the new kernel: # cd /mnt/usbkey1 # rm vmlinuz # ln -s boot/vmlinuz-2.6.15.6-ubuntu1-486-voyage vmlinuz # cd .. d) Done. Unmount the USB key partitions: # umount /dev/sda1 # umount /dev/sda2 e) Delete the "boot" directory from your host voyage so it doesn't get re-installed next time: # rm -R ~/voyage-build/voyage-current/boot/ ===== 8. Smile ===== Put the key into the target computer and turn it on. a) If you're not happy, tell me. I'll put problems (and hopefully their solutions) in the following "Troubleshooting" section. b) If you're happy, tell others. :-) ---- ===== Troubleshooting ===== wfm