Boot into USB disk with Raspberry Pi
For some reason my SD card in my Raspberry Pi got corrupted. And after doing an fsck
in my laptop and fixing all the problems, the filesystem got corrupted again in seconds after booting my Raspberry Pi with it. It might be because it's a cheap 32 GB card, but anyway. I still had a 512 MB old SD, so I decided to put the boot partition on that and lock it so no disk corruption could possibly occur and place the root partition on my USB disk.
The basic process is really simple: write the boot partition onto the 512 MB card, edit the configuration to point to /dev/sda1
and write the second partition (the ArchLinux root) onto an USB disk. Then everything just worked. Below are the steps I did to get it working.
Create the booting SD card
Download the ArchLinux image from Raspberry Pi downloads page.
Then write it onto the SD card from your linux console. This will halt half-way, but that is not a problem:
sudo dd if=archlinux-hf-2013-01-22.img of=/dev/mmcblk0
Now we need to remove the broken second partition (which did not fit on the disk). You can either use gparted
or fdisk
to remove the second partition on /dev/mmcblk0
.
With fdisk /dev/mmcblk0
use d
followed by 2
to remove the second partition and close with w
.
With gparted
just click, click, choose remove and click again.
Now mount the boot partition and edit the cmdline.txt
file on there. Change the root
parameter to /dev/sda1
, which means the complete line will become something like this:
smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=noop rootwait
all on a single line.
Create the root partition
To create the root partition, we first create a partition table with a single primary partition on the USB disk and then copy the file system from the image onto that partition. This will leave room after the end of the file system, which we can later fill in with resize2fs
.
Use kpartx
to connect the partitions inside the image as loopback devices.
I've created a script to create loopback devices for the partitions on the image called and mount them. It's called rawmount.sh and I posted about it in this earlier post.
Use rawmount to mount the partitions and verify they have been mounted:
sudo bash rawmount.sh archlinux-hf-2013-01-22.img
The output should be something like this:
Image : /home/bram/Downloads/archlinux-hf-2013-01-22.img
Mount base : /tmp/mount_6763/
Partitions : loop0p1 loop0p2
Mounting: loop0p1
Mounting: loop0p2
Because the partitions are automatically mounted by rawmount.sh
, we will first unmount them to make sure the file system is not live during the copy. If you are not sure about the device names at this point, execute mount first to get a listing:
mount
sudo umount /tmp/mount_6763/0
sudo umount /tmp/mount_6763/1
Now we can copy the root partition (set as loop0p2
) to our USB disk partition we created earlier. Make sure you are confident you are picking the right devices here, otherwise you will be overwriting disk data. This is a check twice, execute once situation:
sudo dd if=/dev/mapper/loop0p2 of=/dev/sdd1
This should take on a little time, as the arch root partition is not very large. If you need to see process you can check out an earlier post on inspecting dd progress.
Now that the partition is on the USB disk, you can do either of two things: boot your raspberry pi and run resize2fs
, or open gparted
and run resize2fs
now. I choose the first because I was to curious to see if it would even boot.
Once you have confirmed that everything boots like normal, you can just flip the SD card lock and change the /boot
entry in /etc/fstab
to include a read-only flag (ro
):
/dev/mmcblk0p1 /boot vfat defaults,ro 0 0
And your done!