Some time ago I wrote this guide on how to run Raspbian Stretch from an HDD on the Raspberry Pi 3. With the new Buster release, and the new Raspberry Pi 4, the process is a bit different, so here I'm documenting it with an updated guide.

Note: You still need the SD card to boot, but the rest of the system runs from the HDD. I tested this on Raspbian Buster Lite (Headless), Raspbian Buster with desktop should work too.

Raspbian Buster Installation

Grab the official Stretch image and flash it with balenaEtcher to your SD card. Insert the SD card to your Raspberry Pi, plug in your external HDD and power it on.
After loggin in to your Pi, update and make sure you have rsync installed:

$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get install rsync

Running Raspbian from HDD

First unmount your disk:

 $ sudo umount /dev/sda1

Then prepare it. This example makes an ext4 partition utilizing all of the disk's space:

$ sudo parted /dev/sda

(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart primary ext4 0% 100%
(parted) q

$ sudo mkfs.ext4 /dev/sda1

Type y if asked by the prompt, then wait for the process to complete.

Mount your sda1 into mnt:

$ sudo mount /dev/sda1 /mnt

Copy the root to the mounted hdd:

$ sudo rsync -axv / /mnt

Now get the list os UUIDs and PARIDS of your disk:

$ sudo blkid | grep sda

/dev/sda1: UUID="uuid" TYPE="ext4" PARTUUID="partuuid-01"

You need to add your sda1's PARTUUID to root= and add rootdelay=5 at the end of the /boot/cmdline.txt file and save it:

$ sudo nano /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=partuuid-01 rootfstype=ext4 elevator=deadline rootwait rootdelay=5

And finally you will need to change HDD's fstab file to auto mount everything:

$ sudo nano /mnt/etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=####-01  /boot           vfat    defaults          0       2
PARTUUID=####-02  /               ext4    defaults,noatime  0       1

Change the third line to this (change / to none):

PARTUUID=####-02  none               ext4    defaults,noatime  0       1

And add a new line with the sda1's UUID you copied earlier:

PARTUUID=partuuid-01  /               ext4    defaults,noatime  0       1

Save the file and copy it to /boot. Then reboot the Raspberry:

$ sudo cp /mnt/etc/fstab /boot/fstab_usb
$ sudo reboot

That's it! After booting from the SD, your system will be running from the HDD, and should be much faster. 🚀🚀🚀