Raspberry Pi 4 / 400 Ubuntu USB Mass Storage Boot Guide

Ubuntu Server 20.04 + Raspberry Pi
Ubuntu Server 20.04 + Raspberry Pi

Official support from Canonical for the Raspberry Pi has come a long way. We can now install officially supported Ubuntu on the Pi! In my previous guide for Ubuntu 18.04 on the Pi the Raspberry Pi was not officially supported yet and to be honest the experience was pretty janky.

The previous LTS “unofficial” release had so many problems I actually rolled my own image with dozens of fixes to common ailments before I quickly realized that maintaining a Linux distro, even in such a limited capacity as patching in and distributing fixed binaries, was a monumental undertaking.

Fortunately the current Ubuntu 20.04 LTS release is officially certified for the Raspberry Pi. This combined with Ubuntu’s full 64 bit userland/system environment allows you to take full advantage of the 8 GB Pi’s memory without per-process 3GB memory limits (very useful if you are doing something like running a Minecraft server and want to allocate almost all of the 8 GB to it) means there has never been a better time to give Ubuntu a try on the Pi.

This guide takes it a step further and shows you how to get Ubuntu 20.04 / 20.10 / 21.04 / etc. working with a SSD. Let’s get started!

Equipment Used

Kingston A400 SSD
Kingston A400 2.5″ SATA SSD

The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community!

Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg*

StarTech 2.5" SATA to USB 3.0/3.1 Adapter
StarTech 2.5″ SATA to USB 3.1 Adapter

The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended.

Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg*

NVME Option (powered USB hub required, see “Power Requirements” section in my more generalized Raspberry Pi 4 USB booting guide):

Samsung 970 EVO NVMe SSD
Samsung 970 EVO Plus NVMe SSD

The Samsung 970 EVO Plus is a fantastic drive and has fallen in price substantially. It’s widely available around the world. The smaller capacities (such as the 250GB version) of this drive are perfect for the Pi! This is the top performance option without going into the “Pro” series of the lineup which are much more expensive.

Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg*

ASUS ROG Strix NVMe Enclosure
ASUS ROG Strix Enclosure

If you really want to take things over the top the ASUS Rog Strix M.2 NVMe enclosure uses the latest USB 3.2 Gen2 specification, is RGB capable and works with the Pi! Unsurprisingly, adding the extra lighting does take extra power! A powered USB hub is also required for this enclosure. More widely available than the ICY BOX but tends to be on the expensive side.

Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, *Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg*

Prerequisites

Verify Power Supply Size (3.5A strongly recommended)

Check your Raspberry Pi’s power supply size and make sure it is delivering at least 3.5A. There are a lot of USB C adapters for the Raspberry Pi that are only 3.0A. These will typically work fine, until you plug in something like a SSD which draws power from the Pi and there is nothing left to give.

Most SSDs are quite power efficient but HDDs draw significantly more. Older generations of SSDs used quite a bit more power than newer ones as well. If you are using an older drive or a drive that you know is power hungry you need to pay extra attention to having a quality power source with plenty of capacity.

A good alternative option to relying on the Pi to power the drive is using a powered USB hub* so your drive doesn’t need to draw power from the Pi’s limited power budget. Make sure you get one that is compatible with the Pi as some powered USB hubs won’t work properly with it so check the reviews and do your research to make sure people are using it successfully with the Pi.

Using a 3.5A power supply* or powered USB hub* will ensure your drive is getting enough power without impacting the Pi’s stability.

Recommended Power Solutions

Sabrent Powered USB Hub
Sabrent Powered USB 3.0 Hub

The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures.

Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*

Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power

CanaKit 3.5A Power Adapter
CanaKit 3.5A Power Adapter

The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A.

Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg*

Verify Storage Adapter Compatibility

You will need a USB 3.0 storage adapter. See my other article on USB booting not specific to Ubuntu for a lot more details on the storage adapters!

Get Latest Raspbian & Updates

To update your bootloader / firmware you should use Raspbian on a SD card. Right now support in third party operating systems to do anything with the new Raspberry Pi 4’s firmware or bootloader is very limited / nonexistent. You can use a third party operating system later once you set the boot mode, but to actually make these changes we will use official Raspbian.

First make sure that you have the absolute latest updates and firmware for the Pi. To upgrade all your packages and firmware to the latest version use the following command:

sudo apt update && sudo apt full-upgrade -y

Once the update has completed restart your Pi with a sudo reboot command to apply the latest firmware / kernel updates.

Verify EEPROM Bootloader is up to date

We can check if your Pi’s bootloader firmware is up to date with the following command:

sudo rpi-eeprom-update

If your Raspbian is *very* out of date you may not have this utility and can install it using:

sudo apt install rpi-eeprom

The output from rpi-eeprom-update will look like this if you are not up to date:

BCM2711 detected
VL805 firmware in bootloader EEPROM
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103)
LATEST: Tue 24 Nov 15:08:04 UTC 2020 (1606230484)
FW DIR: /lib/firmware/raspberrypi/bootloader/beta
VL805: up-to-date
CURRENT: 000138a1
LATEST: 000138a1

If it says any updates are available they be installed manually by adding ‘-a’ to the end of our previous command like this:

sudo rpi-eeprom-update -a

After the updates finish installing restart your Pi as firmware updates will not be applied until after a reboot. Now if you run rpi-eeprom-update to check for updates again it should say you are on the latest and up to date!

Changing rpi-eeprom’s Release Channel

Note: As of February 16th the firmware available in the “critical” branch is new enough to USB boot so I no longer recommend changing this. One reader even let me know in the comments that on the “stable” channel his storage was getting corrupted prompting a full reinstall!

By default you will only receive updates from Raspbian’s “critical” channel. This is a very conservative firmware update channel that will only give you very well tested firmware updates that are considered critical fixes for the device. Another channel that is available is “stable”.

Carlos and other commenters have reported that the current “critical” firmware didn’t work for them and they had to upgrade to the “stable” channel.

To switch to the stable channel we are going to edit the file /etc/default/rpi-eeprom-update:

sudo nano /etc/default/rpi-eeprom-update

Change the line FIRMWARE_RELEASE_STATUS=”critical” to:

FIRMWARE_RELEASE_STATUS="stable"

Now you can run sudo rpi-eeprom-update and you should see a new update available.

Install Ubuntu on USB Storage Device

The new official Raspberry Pi imaging tool is really good. It’s available on Windows, Linux and MacOS and is a small and fast download. It also works fine on most USB mass storage devices like SSDs. Since Ubuntu is now officially supported the image itself is also available in this tool which saves you the trouble of having to find and download the right image files.

64 bit images are recommended for the Pi 4 for better performance but the 32 bit images work as well.

If you want to do things the traditional way you can download the image from the main Ubuntu site and write it yourself using Etcher / dd / Win32diskimager / your preferred tool and skip to the next section. It’s recommended to create the media with the Raspberry Pi Imager unless you are having problems with that utility or are using this as a troubleshooting step.

Once you’ve downloaded the tool run it as administrator/sudo to avoid permission errors. To run the utility from the command line is usually sudo rpi-imager. You’ll be greeted with this screen:

Raspberry Pi Imager - Main Menu
Raspberry Pi Imager – Main Menu

Next click the “Choose OS” button:

Raspberry Pi Imager - OS Menu
Raspberry Pi Imager – OS Menu

Ahh, the benefits of being officially supported! Ubuntu is right there on the list waiting for us. Select the Ubuntu option and you will get the different choices of flavors/architectures. There’s Ubuntu Desktop, Ubuntu Server, and Ubuntu Core in various forms of 64-bit (arm64) and 32-bit (armhf).

If you want to use the out-of-the-box Ubuntu Desktop edition you need to use the 64 bit Ubuntu 20.10 image as they never made a 20.04 desktop version for some reason. This really isn’t usually a big deal though because you can always choose the “Server” version and install Ubuntu’s desktop environment later with:

sudo apt install ubuntu-desktop

Once you’ve selected the edition you want go ahead and pick the “Choose SD Card” option and write the image. Despite not being a SD card my USB mass storage devices showed up anyway (writing the guide I used a StarTech adapter and a Kingston A400 SSD).

I’m sure some of you will manage to find unusual devices and configurations that may not show up in this tool. It doesn’t appear to show “fixed drives” that are physically installed in your machine. Regardless if it is causing a headache you may need to do it the old fashioned way and download the image from the main Ubuntu site and write the image using your favorite imaging tool instead.

Modifying Ubuntu for USB Booting

We need to make some changes to the Ubuntu drive we just created before we boot from it. Make sure your Pi is powered on and booted into Raspbian then plug in your newly imaged Ubuntu drive. We are going to make the changes using the Pi.

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 SD card from the Pi leaving just the USB mass storage device plugged in. Reconnect the power.

Modify Mounted Partitions – Option B – Manual Instructions

See bottom of the article for the manual instructions section

First Boot

If all went well the system should boot up into Ubuntu’s logon screen! The default credentials are:

Username: ubuntu
Password: ubuntu

Before logging in for the first time you will be forced to select a new password. Once you have done that you will be fully logged in!

Important Note: Upon logging in for the first time if the Pi is connected to the internet Ubuntu will immediately/soon start a lengthy update process via snapd and apt.  This can be annoying since you'll be ready to start configuring the system and if you do an apt install it will halt and wait for the updates to finish.  

It may seem like they're stuck, but if you use the 'top' command you will see all sorts of apt/package/update/extraction related activity happening.  Even on my 8 GB Pi and a gigabit fiber connection these took a good 20 minutes or so before my CPU activity went back to 0 and the apt lock released.

I highly recommend letting these finish and not yanking the power on the Pi / forcing a reboot / trying to kill the processes.  It will often cause a ton of very nasty apt and dpkg problems to the point where it's easier to start over from a fresh image than try to fsck and apt install --fix-broken your way out of it  Try to do other necessary configuration that doesn't involve apt in the mean time and let these finish in the background.

Once the patching is finished your shiny new Ubuntu 20.04 system is fully ready to use!

Manual Instructions

These are the manual instructions to recreate what the automated script does. If you used the automated script you don’t need to do anything further in this section unless you want to understand more about how it works or you want to do the process manually.

Decompress the kernel

We need to decompress the kernel as we will be changing the way the Pi is booting. Ubuntu uses u-boot by default and we will be switching away from that. We can do this with the following command:

zcat -qf "/mnt/boot/vmlinuz" > "/mnt/boot/vmlinux"

Update config.txt with correct parameters

Now let’s update /mnt/boot/config.txt with the parameters we need to load the decompressed kernel. Open up config.txt with nano with:

sudo nano /mnt/boot/config.txt

Change the [pi4] section to the following contents:

[pi4]
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel

Create script to automatically decompress kernel

We are going to create a script to automatically decompress the kernel. If we don’t do this we have to decompress it every time Ubuntu updates. This particular part of the script was not written by me and was found at the post on the Raspberry Pi forums by egrechko.

First let’s create the decompression script. Open up a new file with nano using:

sudo nano /mnt/boot/auto_decompress_kernel

Paste the following contents:

#!/bin/bash -e
# auto_decompress_kernel script
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux
# Check if compression needs to be done.
if [ -e $BTPATH/check.md5 ]; then
   if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
      echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
      exit 0
   else
      echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
   fi
fi
# Backup the old decompressed kernel
mv $DKPATH $DKPATH.bak
if [ ! $? == 0 ]; then
   echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
   exit 1
else
   echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
fi
# Decompress the new kernel
echo "Decompressing kernel: "$CKPATH".............."
zcat -qf $CKPATH > $DKPATH
if [ ! $? == 0 ]; then
   echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
   exit 1
else
   echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
fi
# Hash the new kernel for checking
md5sum $CKPATH $DKPATH > $BTPATH/check.md5
if [ ! $? == 0 ]; then
   echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
else
   echo -e "\e[32mMD5 generated Succesfully\e[0m"
fi
exit 0

Create apt script to call kernel decompression script automatically

This is a one liner to create a script to call the auto_decompress_kernel script:

echo 'DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };' | sudo tee /mnt/writable/etc/apt/apt.conf.d/999_decompress_rpi_kernel

Verify Drive Performance

You can make sure everything is running correctly (and as fast as it should be) by running my quick storage benchmark. You can run the benchmark with the following one-liner:

sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash

This will give you a score you can compare to the other Raspberry Pi Storage Benchmark results and make sure that you are getting an equivalent speed to your peers with the same device!

Fix (some) USB Adapter Problems Using Quirks

Some storage adapters don’t work very well with the Raspberry Pi 4. There is an option that can get a lot of them working using quirks. If your Ubuntu is booting to emergency mode but not in normal mode it’s worth giving quirks a try. This lowers performance, but it’s still much faster than a SD card and your adapter won’t go to waste.

To find out the quirks mode string to use we need to find the device ID string for your adapter and then add an entry to cmdline.txt telling the kernel to apply them on boot.

Find Your Adapter

To apply the quirks we first need to get the adapter id. We will use the sudo lsusb command:

$ sudo lsusb
 Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
 Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
 Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

On line 2 we can see my ASM1051E SATA 6Gb/s bridge adapter (it’s the known working StarTech.com 2.5″ SATA to USB 3.1* adapter). You will see something very similar to mine when you run the command and it shouldn’t be too hard to figure out which device it is. If you need more information add a -v switch to make the command sudo lsusb -v. This can sometimes add some additional details to make it easier to figure out which one is your adapter.

If you’re still not sure, we have another command that between the two that can narrow things down. Type / paste the following:

sudo dmesg | grep usb

 [0.828535] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19
 [0.828568] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
 [0.828597] usb usb3: Product: DWC OTG Controller
 [0.828620] usb usb3: Manufacturer: Linux 4.19.75-v7l+ dwc_otg_hcd
 [0.828644] usb usb3: SerialNumber: fe980000.usb
 [0.830051] usbcore: registered new interface driver uas
 [0.830182] usbcore: registered new interface driver usb-storage
 [0.836488] usbcore: registered new interface driver usbhid
 [0.836511] usbhid: USB HID core driver
 [0.971598] usb 1-1: new high-speed USB device number 2 using xhci_hcd
 [1.154217] usb 1-1: New USB device found, idVendor=2109, idProduct=3431, bcdDevice= 4.20
 [1.154254] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
 [1.154281] usb 1-1: Product: USB2.0 Hub
 [1.301989] usb 2-1: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd
 [1.332965] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00
 [1.332999] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1
 [1.333026] usb 2-1: Product: ASM105x
 [1.333048] usb 2-1: Manufacturer: ASMT
 [1.333071] usb 2-1: SerialNumber: 123456789B79F

This is the dmesg log showing the hardware detection as hardware is activated on the Pi. If your log is really long you can generate fresh entries by just unplugging a device and plugging it back in and running the command again. Here we can clearly see that the ASM105x is what our StarTech adapter is being detected as.

Now we can go back to our first lsusb command and we want the 8 characters from the ID field that comes right after the Device:

Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge

Our adapter’s ID is: 174c:55aa

Applying Quirks

To apply the quirks to our USB adapter we are going to edit /boot/firmware/cmdline.txt. Type:

sudo nano /boot/firmware/cmdline.txt

We are going to add the following entry into the very front of cmdline.txt:

usb-storage.quirks=XXXX:XXXX:u

In place of the X’s above you will put in your adapter’s ID that we got before. With the example commands I gave above mine would look like this: usb-storage.quirks=174c:55aa:u. After this my cmdline.txt looks like this (everything should be one continuous line, no line breaks!):

usb-storage.quirks=174c:55aa:u dwg_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc

Now reboot the Pi. If the Pi fails to boot you can plug the SD card into the computer and go to /boot/cmdline.txt and undo the change we did so you can boot back in with your SD card.

Verifying Quirks

Once you have rebooted after changing cmdline.txt we can verify the quirks have been applied by doing another dmesg | grep usb command:

sudo dmesg | grep usb
 [1.332924] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00
 [1.332957] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1
 [1.332983] usb 2-1: Product: ASM105x
 [1.333006] usb 2-1: Manufacturer: ASMT
 [1.333028] usb 2-1: SerialNumber: 123456789B79F
 [1.335967] usb 2-1: UAS is blacklisted for this device, using usb-storage instead
 [1.336071] usb 2-1: UAS is blacklisted for this device, using usb-storage instead
 [1.336103] usb-storage 2-1:1.0: USB Mass Storage device detected
 [1.336479] usb-storage 2-1:1.0: Quirks match for vid 174c pid 55aa: c00000
 [1.336611] scsi host0: usb-storage 2-1:1.0

This time we can see in dmesg that UAS was blacklisted for the device and it has loaded with the usb-storage driver instead. This driver tends to be more compatible with the “problematic adapters” but the performance is usually significantly lower. It’s definitely worth a try though as some adapters do better with the quirks performance-wise. The only way to know for sure is to run a benchmark (see “Verify Drive Performance” section).

Other Resources

I compiled the 2022 Raspberry Pi Storage benchmarks which shows the fastest storage devices for the Pi

For easy headless imaging (does support Ubuntu) check out my Headless Raspberry Pi configuration guide

To find out where to get the 64 bit version of Raspberry Pi OS: where to get the 64 bit Raspberry Pi OS image

To find out how to add a UPS backup battery to your Pi check out my UPS for Raspberry Pi guide

348 thoughts on “Raspberry Pi 4 / 400 Ubuntu USB Mass Storage Boot Guide”

  1. Avatar for Peter Jansen

    Dear James,

    First of all this : thanks for your excellent work in all of this ! Please keep it up !

    My comment concerns your one-liner to Verify Drive Performance. It works fine, showed that replacing my Kingston USB stick with a Corsair Flash Voyager GTX (both 128GB) upped my RPI4 8GB score from about 1100 to more than 7800. (Search on PJJ in the performance web site.) But your one-liner sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash
    has a nasty side-effect. Afterwards, whenever I do a sudo apt-get update, it now includes ppa.launchpad.net/ubuntu-raspi2 which causes error messages, which I do not know how to correct or undo :

    hercules@pjrpi4z2:~$ sudo apt-get update
    Ign:1 http://ppa.launchpad.net/ubuntu-raspi2/ppa/ubuntu focal InRelease
    Hit:2 http://ports.ubuntu.com/ubuntu-ports focal InRelease
    Err:3 http://ppa.launchpad.net/ubuntu-raspi2/ppa/ubuntu focal Release
    404 Not Found [IP: 91.189.95.85 80]
    [...]
    Reading package lists... Done
    E: The repository 'http://ppa.launchpad.net/ubuntu-raspi2/ppa/ubuntu focal Release' does not have a Release file.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.
    hercules@pjrpi4z2:~$

    Can you help please ? Am I correct in assuming that this “raspi2” stuff is not needed for my RPI4 ?

    Thanks again for all your efforts !

    Cheers,

    Peter

    1. Avatar for James A. Chambers

      Hey Peter,

      Thanks for reporting this! This repository provides the ‘vcgencmd’ utility to the Pi but there are other ways to get it now.

      The Pi 1/2/3/4 part is irrelevant because the utilities this provides are just standard ARM binaries that will work with any Pi (not Pi-model specific in any way). However, I looked at the PPA and it looks like the issue is it doesn’t have a release for ‘focal’. It’s also no longer necessary because Ubuntu now officially supports the Raspberry Pi so the package should be available as libraspberrypi-bin without this PPA fortunately (almost certainly why they stopped updating this PPA and didn’t bother with a ‘focal’ release). I have removed it thanks to this post!

      I’ve fixed this in the GitHub version. Let’s have you try removing the PPA with:

      sudo add-apt-repository -r ppa:ubuntu-raspi2/ppa

      Thanks again for reporting this, can you let me know if that removed it successfully? It seems like it added 2 entries (entry 1 is hitting the server, entry 3 is returning an Err status saying 404 not found looking for the focal release). The removal command should still work though.

      Can you give that a try and let me know?

      1. Avatar for Peter Jansen

        Hi James,

        Thanks for your quick reply.

        Unfortunately, the command did not fix the problem, it seems it couldn’t remove the entry, actually tried adding it (??) :

        hercules@pjrpi4z2:~$
        hercules@pjrpi4z2:~$ sudo add-apt-repository -r ppa:ubuntu-raspi2/ppa
        Cannot add PPA: 'ppa:~ubuntu-raspi2/ubuntu/ppa'.
        ERROR: '~ubuntu-raspi2' user or team does not exist.
        hercules@pjrpi4z2:~$

        Cheers,

        Peter

        1. Avatar for James A. Chambers

          Hey Peter,

          That is strange. This is what I got (I actually don’t have it installed at all and it still asked to remove):

          ubuntu@ip-172:~$ sudo add-apt-repository -r ppa:ubuntu-raspi2/ppa
          https://wiki.ubuntu.com/ARM/RaspberryPi

          Optional PPA for Raspberry Pi 2/3 installations.
          More info: https://launchpad.net/~ubuntu-raspi2/+archive/ubuntu/ppa
          Press [ENTER] to continue or Ctrl-c to cancel removing it.

          Can you try using --remove instead of -r? There’s a lot of ways to remove these. You can also just do:

          ls /etc/apt/sources.list.d

          and you should see ubuntu-raspi2 files and can remove them that way as well. You can also check:

          /etc/apt/sources.list

          Are you behind a proxy where your networking is impacted? My server I ran those commands in is also 20.04.2.

          It is unusual. Something is not right with the networking/certificates or something in the environment. There’s a pretty extensive thread on this here.

          It could be certificates or timezone related but this looks like configuration here. This should not be happening on a fresh install of a newer copy of Ubuntu for sure. You can bypass it by removing the sources manually from /etc/apt/sources.list and /etc/apt/sources.list.d/ without having to fix the (presumably) networking issues.

          Tons of ways to remove a PPA here as well (even from the GUI if this isn’t a headless install) but I am almost wondering if your apt is having other issues. It should be as simple as removing a couple of files / lines of text. Nothing more is done than that by a PPA being added (either a line added to /etc/apt/sources.list or more commonly a file created in /etc/apt/sources.list.d/ppaname). It’s just a line of text in these lists basically.

          The apt cache could be corrupt/broken so a:

          sudo apt clean
          sudo apt autoclean
          sudo apt update
          sudo apt install --fix-broken

          might help get things moving. Definitely let me know what you find!

          1. Avatar for Peter Jansen

            Hi James,

            Thanks for your reply.

            I have good news, because after reading your comments I realized my “PPA removal problem” could be related to the fact that the DNS resolver on this RPI4 Ubuntu 10.04.2 box had become broken (again). As I have no handle yet on this DNS problem I just rebooted, DNS was then, as expected, working again. And this time the PPA removal worked perfectly well :

            hercules@pjrpi4z2:~$ sudo apt-get update
            [sudo] password for hercules:
            Ign:1 http://ppa.launchpad.net/ubuntu-raspi2/ppa/ubuntu focal InRelease
            Err:2 http://ppa.launchpad.net/ubuntu-raspi2/ppa/ubuntu focal Release
            404 Not Found [IP: 91.189.95.85 80]
            Hit:3 http://ports.ubuntu.com/ubuntu-ports focal InRelease
            Get:4 http://ports.ubuntu.com/ubuntu-ports focal-updates InRelease [114 kB]
            Get:5 http://ports.ubuntu.com/ubuntu-ports focal-backports InRelease [101 kB]
            Get:6 http://ports.ubuntu.com/ubuntu-ports focal-security InRelease [114 kB]
            Get:7 http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 Packages [849 kB]
            Get:8 http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 c-n-f Metadata [13.5 kB]
            Get:9 http://ports.ubuntu.com/ubuntu-ports focal-updates/universe arm64 Packages [793 kB]
            Get:10 http://ports.ubuntu.com/ubuntu-ports focal-updates/multiverse arm64 Packages [7888 B]
            Reading package lists... Done
            E: The repository 'http://ppa.launchpad.net/ubuntu-raspi2/ppa/ubuntu focal Release' does not have a Release file.
            N: Updating from such a repository can't be done securely, and is therefore disabled by default.
            N: See apt-secure(8) manpage for repository creation and user configuration details.
            hercules@pjrpi4z2:~$ sudo add-apt-repository -r ppa:ubuntu-raspi2/ppa
            https://wiki.ubuntu.com/ARM/RaspberryPi

            Optional PPA for Raspberry Pi 2/3 installations.
            More info: https://launchpad.net/~ubuntu-raspi2/+archive/ubuntu/ppa
            Press [ENTER] to continue or Ctrl-c to cancel removing it.

            hercules@pjrpi4z2:~$ sudo apt-get update
            Hit:1 http://ports.ubuntu.com/ubuntu-ports focal InRelease
            Hit:2 http://ports.ubuntu.com/ubuntu-ports focal-updates InRelease
            Hit:3 http://ports.ubuntu.com/ubuntu-ports focal-backports InRelease
            Hit:4 http://ports.ubuntu.com/ubuntu-ports focal-security InRelease
            Reading package lists... Done
            hercules@pjrpi4z2:~$

            So, problem solved !

            (My DNS problem may be caused by my adding of a bridge and TUN/TAP devices, although this does not immediately break the DNS resolving. This only happens later, due to reasons I haven’t found out yet. But that is my problem to work on.)

            Thanks for your kind assistance with this, also for you pointing me to /etc/apt which I did not know and have not looked into yet.

            Cheers,

            Peter

            1. Avatar for James A. Chambers

              Hey Peter,

              Fantastic, I’m so glad you were able to run with the extremely vague “networking issues”! It’s such a broad thing to say but something like the DNS resolver makes perfect sense. For sure I was hoping that it would be enough for you to fill in the missing gaps!

              That looks fantastic! It’s exactly how we would expect it to look out of the box and it’s 100% clean!

              Sorry that this happened in the first place, and thanks for reporting it as 20.04 has been out for a while so other people have to have been impacted by this as well, so I’m very glad to have it fixed. Cheers and take care!

  2. Avatar for Sam

    Hi, I followed this process successfully to put Ubuntu onto an old hardrive. I then decided to repear the the process onto a flash drive. However I’ve been trying this for 2 days: every time I run your script I get the message “Safety check: automount detected at /media/*/writable. Please unmount the automount in File Explorer or with sudo umount /media/root/system-boot.”
    When I run sudo umount /media/root/system-boot I get:
    “umount: /media/root/system-boot: no mount point specified.”
    When I run sudo umount /media/pi/system-boot I get the same message!
    Would you be able to help me please…

    1. Avatar for James A. Chambers

      Hey Sam,

      No problem at all! There’s a few places the mounts can be hiding. If your user name isn’t the default “pi” user name and is instead something like Sam it will probably be in /media/Sam/writable or something like that. Let’s start by finding out which mounts are present. Try just typing the command:

      mount

      This will list all the mounts on the computer. If you look through the list you should see one that starts with /media in there and can run the unmount command against that mount to fix this.

      The script is looking for automounted partitions. The one that is tripping yours up is going to be /media/something/writable or media/*/writable. The script uses a wildcard and is finding someone has this mounted. You can also do a cd to /media and just look and see what is mounted in there. Once you unmount it the script should let you proceed. Hopefully that helps!

  3. Avatar for Stefan

    Hmm,
    when booting with SSD (20.04.2) I do have a constant load of 1. Running the same version from SD-card, the load is “normal”, usally almost 0.
    I cannot identfy the process either with iotop or dstat.
    Any ideas?
    I will try 21.04…..
    br

  4. Avatar for thebtm

    Thank You very much for this guide. it was just what I needed to get the RPi 4 8GB loaded with Ubuntu 20.04.2 LTS for my plans for this pi. 21.04 was having issues with some of the software installed.

    Booted without issues on first try.

  5. Avatar for Jinu

    Hi I am using a WD My Passport 500GB (2020) SSD I tried this method but it does not boot from SSD, it just says

    Failed to open device: ‘sdcard’ (cmd 371a0010 status 1fff0001)
    INSERT SD-CARD

    I tried the quirks method also but same error. Any idea what could be wrong?

    1. Avatar for James A. Chambers

      Hey Jinu,

      That doesn’t sound like it’s even trying to boot from the SSD judging by the error message there. There’s a couple easy things to try. What happens if you take out the SD card completely and then connect the power with only the SSD connected? Does it change from that “sdcard” error to something else? Or is this with the SD card out already and if you insert the SD card it boots from that and ignores the SSD?

      I haven’t seen it for a while, but a couple of people getting behavior like this needed to restore their bootloader firmware using the restore image from the “Pi Imager” tool (you can download and use this in Ubuntu or on any operating system). It puts a very small file on a SD card that will restore your bootloader to the latest version. The reason this can fix it sometimes is that your error message is specifically talking about the SD card which is not what you would typically see for a SSD boot error, it’s not even trying. It sounds like the bootloader may need a restore with the recovery image!

Leave a Comment

Your email address will not be published. Required fields are marked *

Type here..

Exit mobile version