USB Boot Instructions
- Prepare Bootloader SD Card – Image your SD card with the latest Raspbian 10 “Buster” release (I prefer Raspbian Lite) however you would normally do it.
- Prepare SSD / Flash Drive – Image your SSD or Flash Drive. Make sure you create the empty file named “ssh” on the boot partition of both drives.
- Boot / Update Raspberry Pi – Start up your Raspberry Pi with only the SD card in the slot. After the Pi boots to plug in your SSD / Flash drive.
Type “sudo apt-get update && sudo apt-get dist-upgrade” to update the system and firmware. - Run sudo blkid – With your SSD / Flash drive plugged in type the command “sudo blkid” (example below)
- Identify drive – Your list will contain /dev/mmcblk0p1 and 2 (SD card) and your SSD / Flash drive (usually/dev/sda1 and 2).
We are looking for the PARTUUID of your flash / SSD drive’s second partition (rootfs). This will end with -02. Here is an example:
/dev/sda2: LABEL=”rootfs” UUID=”638417fb-7220-47b1-883c-e6fee02f51ac” TYPE=”ext4″ PARTUUID=”0634f60c-02″
Save or white a note somewhere of the values for both drives. We will use both PARTUUIDs for /dev/sda* and dev/mmcblk* later. - Edit /boot/cmdline.txt – First make a backup by typing: sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak
Now type “sudo nano /boot/cmdline.txt” – Change your boot command to load the partition from the SSD / Flash drive instead of your SD card.
Before: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=af1800e7-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
After: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=0634f60c-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait - Reboot Pi – If your Pi won’t boot put your micro SD into a computer and restore /boot/cmdline.txt.bak to get back into the Pi.
Note: the first boot with your SSD / Flash drive will be slow the first time as it runs fsck on the drive and other first boot configuration.
It can take over a minute or two sometimes for really big drives so give it a little bit of time here before assuming it didn’t work - Update fstab – Change /etc/fstab entry for /boot to point to the SD card to ensure that firmware and bootloader updates retrieved — detailed example/instructions in section below
- Resize file system – Upon first startup the size of your root (/) filesystem partition will only be 1.8G no matter how big your drive is — see section below for detailed example/instructions
Your system will now be running completely from your USB drive! To verify this, run the command “findmnt -n -o SOURCE” / to ensure your root partition has switched over as shown below to /dev/sda2 instead of /dev/mmcblk0p2.
pi@raspberrypi:~ $ findmnt -n -o SOURCE / /dev/sda2
Updating fstab
Right now your fstab file on the USB drive is automounting the /boot/ partition from the USB drive even though it isn’t being used. We need to update this to your SD card so that firmware/bootloader updates are actually utilized.
The current file will look similar to this:
cat /etc/fstab proc /proc proc defaults 0 0 PARTUUID=0634f60c-01 /boot vfat defaults 0 2 PARTUUID=0634f60c-02 / ext4 defaults,noatime 0 1
We want to change the /boot partition (ending with -01 to load our SD cards PARTUUID instead of the USB drive. After making the change my /etc/fstab file looks like this:
proc /proc proc defaults 0 0 PARTUUID=af1800e7-01 /boot vfat defaults 0 2 PARTUUID=0634f60c-02 / ext4 defaults,noatime 0 1
Make sure the SD card and new drive both have a blank “ssh” file if you want to keep SSH enabled. Switching bootloaders will often work fine but if you forget this step you’ll try to connect to your Pi and think it’s down when really it just isn’t listening for SSH after changing the bootloader without recreating it.
ot. After reboot typing: “df -H” should show /boot/ as being the SD card again (mmcblk0). Now we can be sure that any updates to the /boot/ partition from apt-get are applying to our system.
Resizing Filesystem
By default the partition on the SSD / Flash drive will only be 1.8G. The Pi expands this automatically on micro SD drives but we will need to do it ourselves for a SSD / Flash drive. To do this we need to expand the partition and then resize the file system.
First let’s open fdisk and print the partitions:
pi@raspberrypi:~ $ sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.33.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors Disk model: 2115 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 33553920 bytes Disklabel type: dos Disk identifier: 0x0634f60c Device Boot Start End Sectors Size Id Type /dev/sda1 8192 532480 524289 256M c W95 FAT32 (LBA) /dev/sda2 540672 4292607 3751936 1.8G 83 Linux
There is the line we need. Our start value for /dev/sda2 (rootfs) is 540672. Next we need to remove and recreate the partition as a larger size. If you make any mistakes during this command just close fdisk by pressing q. The changes won’t be written to disk. If you mess up any of the commands the drive will no longer boot and you’ll have to start over again so be careful!
Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (532481-500118191, default 589815): 540672 (enter the start value exactly as it was, the default will be wrong) Last sector, +/-sectors or +/-size{K,M,G,T,P} (540672-500118191, default 500118191): (press enter to accept default which is the full disk) Created a new partition 2 of type 'Linux' and of size 238.2 GiB. Partition #2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: n (don't remove signature)
If everything went well then type “w” and press enter. Otherwise press “q” to quit and try again. Once you enter “w” the changes will be permanently written to disk!
Now reboot the system. Type “df -h” to view the current disk:
pi@raspberrypi:~ $ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 1.8G 1.2G 450M 73% / devtmpfs 866M 0 866M 0% /dev tmpfs 995M 0 995M 0% /dev/shm tmpfs 995M 8.4M 987M 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 995M 0 995M 0% /sys/fs/cgroup /dev/sda1 253M 40M 213M 16% /boot tmpfs 199M 0 199M 0% /run/user/1000
We can see our disk is still 1.8G even after resizing the partition. That’s because we still have one more step! We need to resize the filesystem to fill our new partition space. For this we will use “sudo resize2fs /dev/sda2”:
sudo resize2fs /dev/sda2 resize2fs 1.44.5 (15-Dec-2018) Filesystem at /dev/sda2 is mounted on /; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 15 The filesystem on /dev/sda2 is now 62447190 (4k) blocks long.
Now let’s check df -h again:
Filesystem Size Used Avail Use% Mounted on /dev/root 235G 1.2G 224G 1% / devtmpfs 866M 0 866M 0% /dev tmpfs 995M 0 995M 0% /dev/shm tmpfs 995M 8.4M 987M 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 995M 0 995M 0% /sys/fs/cgroup /dev/sda1 253M 40M 213M 16% /boot tmpfs 199M 0 199M 0% /run/user/1000
And that’s it! You will now be using all of your space on your SSD / Flash drive.