I recently wiped my CubieTruck (a single board computer, like RaspberryPi), and tried installing the root filesystem on a hard drive instead of the built-in NAND, due to the NAND’s tendency to get corrupted.
I used Igor Pečovnik’s Image, which is really convenient, as I like it better than the images offered at the official site, and it’s obviously much easier than building by myself.
However, I had one serious issue.
Igor’s image is designed to be installed on and booted from an SD card, and includes a script to install the OS to a hard drive, which does 3 things:
- Formats and prepares the hard drive
- Copies the root FS to the hard drive
- Modifies the SD card’s
/bootdirectory to load the root FS from the hard drive
Igor, assuming there’s only one hard drive, always targets
/dev/sda1 as the hard drive. This was an issue for me, as I have two hard drives - an internal one that I installed the OS on, and an external one that I connect every now and then.
The uEnv file (the entry point for CubieTruck’s boot sequence) contains something like
rootfs=/dev/sda1, and when both my drives were connected, my external hard drive was discovered first, meaning
/dev/sda1 was pointing to it, causing the kernel to panic as it couldn’t find a proper root fs.
Being used to a standard-built Linux kernel, I modified the uEnv file to look like
root=UUID=<PARTITION GUID>, which works around the naming issue.
It didn’t work, causing the boot sequence to hang with:
waiting for root device UUID=<Whatever I wrote in uEnv>
I tried some tricks, including referring to
/dev/disk/by-uuid/, but no luck. Eventually I found this lifesaver, that made me realize that
initramfs isn’t included in Igor’s build, and without it there’s no
LABEL mapping, only
PARTUUID mapping. Using the value taken from
rootfs=PARTUUID=<SOME GUID>), the boot went OK.
However, when editing the
/etc/fstab file (which also contained
/dev/sda1 as the root mountpoint), I noticed that
mount PARTUUID=<Something> didn’t work. Thanks to this post, I learnt that support for
PARTUUID was added to
mount, but the Ubuntu version is too old to contain it. This might change, but I worked around this by using good
Now all is well.
uEnv, found via
/etc/fstab, test with
mount before using. If it fails, work around with