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
kernel /boot/vmlinuz-2.6.18-6-486 root=/dev/sda1 ro vga=792
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.