When trying to set up my Argon One cased Raspberry to boot from the USB attached M.2 drive, I ran into a little snag! I set up the Raspberry to boot from Ubuntu 64 image on the USB drive, but after I copied the entire thumb drive to the m.2, I could not boot! Turns out there are a couple more steps. The system copy was easy. I literally did a bitwise copy of the entire drive to the USB attached m.2.
dd if=/dev/sda of=/dev/sdb bs=1024k status=progress
Modifying Ubuntu for USB Booting
So, at this point, I can boot off the thumb drive and the m.2 drive is attached via the Argon One case. The two drives are perfect copies or other another, but I can only boot off the thumb drive.
Find and Mount Storage Device
First let’s find your storage device using the command:
lsblk
This will show you all the storage devices attached to your system:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 256M 0 part
└─sda2 8:2 0 2.8G 0 part
mmcblk0 179:0 0 59.5G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot
└─mmcblk0p2 179:2 0 59.2G 0 part /
Your SD card will always start with mmcblk so you can rule that one out. That leaves sda as the only other disk device on the system. This will be the same for most of you but depending on what type of drive and storage adapter you use this can vary. You can substitute whatever yours is in place of /dev/sda in these instructions going forward. If yours is sdb use /dev/sdb. If it’s nvme0 use /dev/nvme0, etc.
In my output under the “MOUNTPOINT” column you can see it is blank. This means the drive isn’t mounted on my system. My mmcblk0p1 mountpoint though is not blank and is “/boot” as an example of a non-blank mountpoint. If you are using the full “Desktop” version of Raspbian it may have automatically mounted your drive and created 2 shortcuts on your desktop that will take you to the files. If your mountpoint is not blank and has something like /media/pi/writable go ahead and unmount them now using the following commands substituting the mountpoint listed for your drive:
sudo umount /media/pi/writable
sudo umount /media/pi/system-boot
Now we are going to create two mountpoints and mount the Ubuntu drive. Use these commands substituting your own drive it is not /dev/sda:
sudo mkdir /mnt/boot
sudo mkdir /mnt/writable
sudo mount /dev/sda1 /mnt/boot
sudo mount /dev/sda2 /mnt/writable
Once you have mounted everything correctly your lsblk command’s output should look like this with the mountpoint field now populated:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 256M 0 part /mnt/boot
└─sda2 8:2 0 2.8G 0 part /mnt/writable
mmcblk0 179:0 0 59.5G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot
└─mmcblk0p2 179:2 0 59.2G 0 part /
Modify Mounted Partitions – Option A – Automated Script
If you just want to get your Ubuntu partition bootable I have made an automated script to do this. As long as you have mounted the partitions as /mnt/boot and /mnt/writable the script will make the necessary changes for Ubuntu 20.04 / 20.10 to boot! The source code for the script is available at https://github.com/TheRemote/Ubuntu-Server-raspi4-unofficial/blob/master/BootFix.sh
Here is a one liner to run the script:
sudo curl https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BootFix.sh | sudo bash
You may also download it for inspection (such as nano BootFix.sh or opening it in the Text Editor if you are using Desktop Raspbian) with:
curl https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BootFix.sh -O BootFix.sh
chmod +x BootFix.sh
nano BootFix.sh
To execute the script use:
sudo ./BootFix.sh
As long as you mounted your partitions correctly it will modify the partition and tell you that it was successful. Now unmount your partitions with the following commands:
sudo umount /mnt/boot
sudo umount /mnt/writable
You may now shut down your Pi and remove the thumb card from the Pi leaving just the USB mass storage device plugged in. Reconnect the power and boot (successfully) from the m.2.