Raspberry Pi Root FS on USB Drive
This tutorial will demonstrate how to install the Debian root filestem (ie. ‘/’) on a USB drive instead of the SD card. The SD card still retains the /boot partion and swap space. This requires a modified kernel to support the USB storage. You can download the minimal modified kernel and modules here or follow my guide on how to compile it for yourself.
In either case, begin by installing the Debian image as you normally would to an SD card. Manually format the USB drive you intend to use as the root filesystem as ext4 using a utility like gparted.
Next, copy the root filesytem from the Debian install on the SD card to the USB drive, preserving attributes with the -a flag, substituting “sdcard-rootfs-partition-uuid” and “usbdrive-rootfs-partition-uuid” with the respective identifiers as the filesystem are mounted in Ubuntu.
sudo cp -a /media/sdcard-rootfs-partition-uuid/* /media/usbdrive-rootfs-partition-uuid/
sync
Now, delete the existing kernel.img and replace it with the new one, substituting “sdcard-boot-partition-uuid” with the identifier of the partion as it is mounted in Ubuntu.
sudo rm /media/sdcard-boot-partition-uuid/kernel.img
sudo mv kernel.img /media/sdcard-boot-partition-uuid/
Next, remove the existing /lib/modules and lib/firmware directories,
sudo rm -rf /media/usbdrive-rootfs-partition-uuid/lib/modules/
sudo rm -rf /media/usbdrive-rootfs-partition-uuid/lib/firmware/
and copy the new modules and firmware in their place:
cd ../../kernel/
sudo cp -a lib/modules/ /media/usbdrive-rootfs-partition-uuid/lib/
sudo cp -a lib/firmware/ /media/usbdrive-rootfs-partition-uuid/lib/
sync
Now we need to modify the location of the root partition in the /boot partion. This is contained within the file, cmdline.txt. In this file, change:
root=/dev/mmcblk0p2
to:
root=/dev/sda1
That’s it! Plug in and boot up the root filesystem from the USB stick!









Do you get a performance boost doing this? I mean the best SD cards are 10Mbps whereas USB2 is good for 400+.
It certainly seems faster but I haven’t run any benchmarks to be sure. I will give some filesystem benchmarks a try (maybe iozone, postmark, or bonnie++) and let you know the results!
Great news! But is the kernel-creation-copy stuff with the new official debian image still necessary?
Best regards
triggerhurt
I just gave it a try with the 2012-06-18-wheezy-beta.zip. It looks like the kernels included with the newer images already have necessary support!
Thanks a lot!
Managed to make the switch by changing the files on the live Raspberry system!
Mounted the USB drive at /media/usb-stick. Copied root filesystem with rsync:
rsync -av / /media/usb-stick –exclude={/dev/,/proc/,/sys/,/tmp/,/run/,/mnt/,/media/,/lost+found,/lib/init/rw/}
I think you can drop the “cd ../../kernel/” from the “copy the new modules and firmware in their place:” box.
Thanks,
Stephan
The rysnc command you specified doesn’t work for me. It would still include all these directories, so would keep recursively copying the files already copied.
I ended up using the following:
sudo rsync -av / /media/usb-hdd/ –exclude “/dev/” –exclude “/proc/” –exclude “/sys/” –exclude “/tmp/” –exclude “/run/” –exclude “/mnt/” –exclude “/media/” –exclude “/lost+found” –exclude “/lib/init/rw/”
I could’ve also put all these in a text file and used –exclude-from “textFile”
I used the following commands
sudo dd if=/dev/the-SD-root-partition of=/dev/my_external_usb_drive bs=4096
e2fsck -f /dev/my_external_usb_drive
resize2fs /dev/my_external_usb_drive
The last two commands is for expanding partition space (or else it will be as big as the SD-partition)
Don’t forget to change “root=/dev/mmcblk0p2″ into “root=/dev/your_root_device”
Just use nano /boot/cmdline.txt (don’t forget sudo)
I am not managing to boot from Usb.
What I am using : raspbian wheezy
My procedure: Installed on the SD, then cloned the ext4 root partition from SD to USB with a partition software.
First step:
I can see in raspberry the usb is infact /dev/sda1 , so changed the cmdline.txt boot to that: Did not work, will not boot!!!
Second step (seemed logical maybe is not) : Changed also fstab from /dev/mmcblk blah to /dev/sda1
Will not boot?
Any ideas? The fsystem was infact copied correctly and since I cloned the partition there shouldn’t be any modification..
Hi alberto,
Are any error messages displayed when the device fails to boot?
damn, cant get it to completely work.
It boots and all, but I cant log in, it gives me a
Could not chdir to home directory /home/pi: Permission denied
Tried both using the cp method and rsync. Putting the usb stick back into a normal linux computer, the permissions look fine (right owners, right flags, etc). Im confused. :-/
As stated elsewhere by user lewmur:
It is possible to place all of the Raspbian files on the ext3 partition and then edit the /boot/config.txt file to point to that partition, but it wouldn’t be the easiest way.
It would be much easier to use gparted to resize the ext3 partition and then create a new partition for the Raspbian image. The problem with trying to just copy the files to the existing partition is getting all of the permissions correct.
so, is the copy of the kernel, modules and firmware needed or not? Please clarify.