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
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
fdisk to remove the second partition on
fdisk /dev/mmcblk0 use
d followed by
2 to remove the second partition and close 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
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 (
/dev/mmcblk0p1 /boot vfat defaults,ro 0 0
And your done!