The following instructions are for headless (i.e. without a monitor) Raspberry Pi server installation of Ubuntu using a machine running macOS.
Download image
Download the latest Ubuntu for Raspberry Pi 64-bit ARM image.
version="20.04"
img_file="ubuntu-${version}-preinstalled-server-arm64+raspi.img"
xz_file="${img_file}.xz"
url="http://cdimage.ubuntu.com/releases/${version}/release/${xz_file}"
wget "$url"
Check that the image file downloaded successfully.
checksum="48167067d65c5192ffe041c9cc4958cb7fcdfd74fa15e1937a47430ed7b9de99
echo "${checksum} *${xz_file}" | shasum -a 256 --check
You should see this return:
ubuntu-20.04-preinstalled-server-arm64+raspi.img.xz: OK
Extract the compressed image file.
xz -d "$xz_file"
Locate SD card
Locate the mount point of the SD card (e.g. /dev/disk2
).
diskutil list
The SD card should look somewhat like this, depending on the size of the card, and how many drives you have attached.
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *32.0 GB disk2
1: Windows_FAT_32 boot 268.4 MB disk2s1
2: Linux 31.7 GB disk2s2
Be careful with this step to ensure that you don’t select the wrong drive.
n=2
Unmount SD card
Check active mounts and unmount the target disk.
diskutil unmountDisk "/dev/disk${n}"
You should see something like:
Unmount of all volumes on disk2 was successful
Double check mount status with:
mount
df -H
Install coreutils
I recommend installing the GNU coreutils variant of dd
first via Homebrew, and using that version instead of the default BSD variant that ships with macOS.
brew install coreutils
Image SD card
Now you’re ready to format the SD card using dd
.
# Input file.
if="ubuntu-20.04-preinstalled-server-arm64+raspi.img"
# Output file.
# Note the use of 'rdisk' here, for raw disk access.
of="/dev/rdisk${n}"
sudo dd if="$if" of="$of" bs="32M" status="progress"
Now we’re ready to eject the disk and boot up the Raspberry Pi device.
sudo diskutil eject "$of"
Initial boot
The default admin account is ubuntu
, with the password ubuntu
.
SSH access on the Ubuntu image is enabled by default, unlike Raspberry Pi OS.
Additional configuration is available in our Raspberry Pi cheat sheet.