I think dd is the good way to proceed.
Meanwhile, this solution works out of the box only if there is only one /dev/sd*.
For instance, i would suggest to list all /dev/sd* except usb one then make as many partition (fdisk -n) as required on usb drive and use dd for each /dev/sd* counted.
From the link:
insert the destination USB flash drive in my workstation delete the existing vfat partition and create a single linux partition using fdisk create a filesystem and synchronize it: bash# mkfs.ext3 /dev/sdb1 bash# sync ; sync remove the usb flash drive from the workstation, put it in the target PC mount the usb drive, move the udev filesystem out of the way, and copy the local filesystem: bash# cd / bash# mkdir /mnt/sda1 bash# mount /dev/sda1 /mnt/sda1 bash# mkdir udev bash# mount --move /dev /udev bash# cp -ax / /mnt/sda1 That copy command might take awhile. When it is done, get rid of the temporary directory /udev bash# mount --move /udev /dev bash# rm -fr /udev
Now to make the usb drive bootable. It should still be mounted at /mnt/sda1. First, in file /mnt/sda1/boot/grub/device.map set hd(0) to /dev/sda and in /mnt/sda1/boot/grub/menu.lst set the kernel boot options correctly for each boot configuration, eg:
title Debian GNU/Linux, kernel 2.6.18-6-486 root (hd0,0) kernel /boot/vmlinuz-2.6.18-6-486 root=/dev/sda1 ro vga=792 initrd /boot/initrd.img-2.6.18-6-486 savedefault
Finally, install grub on the usb flash drive:
bash# grub-install --root-director=/mnt/sda1 /dev/sda
All done! Now you can reboot into the flash drive.