Stop using the Raspberry Pi's SD card for swap
Part of the Raspberry Pi Reliability series.
Raspberry Pi OS, on a fresh installation, will allocate some amount of swap space on the SD card by default.
Using your Pi’s SD card for swap space will, in time, kill the SD card. On any Pi, I recommend disabling swap on the SD card.
If the system needs swap space to function properly, I allocate swap space on an inexpensive USB thumb drive, with the knowledge that this use will eventually kill the thumb drive.
If the system does not need swap
To completely disable swap on Raspberry Pi OS:
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo update-rc.d dphys-swapfile remove
If you’re certain you won’t want to reenable swap in the near future, you can completely remove the dphys-swapfile
manager with sudo apt purge dphys-swapfile -y
.
To verify this change, reboot the Pi and run free -m
, which should show all 0
s in the swap
row:
$ free -m
total used free shared buff/cache available
Mem: 430 33 333 6 63 342
Swap: 0 0 0
If the system needs swap
If this system needs swap to function properly, we’re going to use an external USB thumb drive for it.
This will absolutely eventually kill the USB drive, but at least that’ll be easy to replace without rebuilding the entire Pi.
Run cat /boot/cmdline.txt
. If the file includes the word noswap
, edit /boot/cmdline.txt
and remove noswap
.
Connect your sacrificial USB thumb drive and use lsblk
to figure out its device name. On the Pi I’m using, this is /dev/sda
; if yours differs, use its name in place of /dev/sda
in the following commands.
Run sudo cfdisk /dev/sda
and:
- Select
gpt
if prompted to select a partition table type. - Create a new primary Linux filesystem partition.
- Write & quit.
(This article covers those steps in more detail, including screenshots. If you follow that guide, stop after step 7; don’t proceed to mkfs.ext4
.)
We’re going to turn that partition into a classic Linux swap partition using mkswap
. Run sudo mkswap -f /dev/sda1
, and note the UUID included in its output:
# sudo mkswap -f /dev/sda1
Setting up swapspace version 1, size = 7.3 GiB (7810555904 bytes)
no label, UUID=1c1b6b47-ad57-43ad-a6ab-f1c2a64a88d1
Then, edit /etc/fstab
to add a line for this new swap partition. Replace the UUID below with the one you noted in the previous step:
UUID=1c1b6b47-ad57-43ad-a6ab-f1c2a64a88d1 swap swap defaults 0 0
You can enable the swap partition immediately with sudo swapon /dev/sda1
, or reboot the Pi and wait. In either case, verify it’s operational using the free
command:
$ free -mh
total used free shared buff/cache available
Mem: 999Mi 231Mi 522Mi 42Mi 244Mi 700Mi
Swap: 7.8Gi 0B 7.8Gi
On Raspberry Pi OS, we’ll disable the service that manages the SD card-based swap file. We don’t need it if we’re using an external drive:
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo update-rc.d dphys-swapfile remove
sudo apt purge dphys-swapfile -y
Finally, we’ll adjust the system’s vm.swappiness
setting. Reducing this from its default value (of 100
, IIRC) will force the system to use swap only when it really needs to.
Create a new file, /etc/sysctl.d/90-swappiness.conf
, with the following content:
vm.swappiness=5
This setting will take effect after a reboot; to apply it immediately to a running system, run sudo sysctl -w vm.swappiness=5
.
A note on Armbian
Armbian, an alternative Linux distribution for Raspberry Pi and other single-board computers, does not allocate any SD card-based swap by default, so unless you’ve customized your installation there’s nothing to disable.
There is a zram-based swap partition, which I recall seeing in /etc/fstab
. That is a RAM-based compressed block storage device; using it as swap space effectively tiers your RAM into two parts: fast+uncompressed and slower+compressed. I believe the intent here is to increase the effective available memory on RAM-limited boards without touching the SD card, and on my Orange Pis running Armbian I leave this setup as-is.