Can I have a swapfile on btrfs?
Modern Ubuntu versions are using a swap file instead of a swap partition by default.
Before the 5.0 Linux kernel it was not possible to place a swap file on a btrfs
partition, btrfs
file system could be damaged.
Now kernels support swap files on btrfs partitions. Can I use a swap file on Ubuntu installed on btrfs
and what are possible problems?
Solution 1:
It is possible to use a swap file on btrfs
, but there are some considerations that need taking care of.
btrfs
filesystem doesn't let to create snapshots if there is a working swap file on the subvolume. That means that it is highly recommended to place a swap file on a separate subvolume.
Lets assume that the current swap is already off, the /
is on /dev/sda1
and Ubuntu is installed with /
on @
subvolume and /home
is on @home
subvolume.
-
Mount
/dev/sda1
to/mnt
.sudo mount /dev/sda1 /mnt
If you run ls /mnt
, you'll see @
, @home
and other subvolumes that may be there.
-
Create a new
@swap
subvolume.sudo btrfs sub create /mnt/@swap
-
Unmount
/dev/sda1
from/mnt
sudo umount /mnt
-
Create
/swap
directory where we plan to mount the@swap
subvolume.sudo mkdir /swap
-
Mount the
@swap
subvolume to/swap
.sudo mount -o subvol=@swap /dev/sda1 /swap
-
Create the swap file.
sudo touch /swap/swapfile
-
Set 600 permissions to the file.
sudo chmod 600 /swap/swapfile
-
Disable COW for this file.
sudo chattr +C /swap/swapfile
-
Set size of the swap file to 4G as an example.
sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=4096
-
Format the swapfile
sudo mkswap /swap/swapfile
-
Turn the swap file on.
sudo swapon /swap/swapfile
Now the new swap should be working.
You also need to update /etc/fstab
to mount all this on boot. Add there two lines:
UUID=XXXXXXXXXXXXXXX /swap btrfs subvol=@swap 0 0
/swap/swapfile none swap sw 0 0
The UUID
is the one of your /dev/sda1
.
Swap file can't be located on a btrfs raid of any sort.
Comments and suggestions are welcome.
Solution 2:
Note that for modern systems/laptops with NVME SSDs, you have /dev/nvme0n1p2
instead of /dev/sda1
and you should ignore /dev/nvme0n1p1 because that is your efi boot disk that your OS created when you installed it.
In addition it should be recommended to add two mount options 'defaults' and 'noatime'. Defaults will automatically load the mount options for the drive (SSD, HDD). Noatime will prevent files being written if only opened:
UUID=XXXXXXXXXXXXXXX /swap btrfs defaults,noatime,subvol=@swap 0 0
/swap/swapfile none swap sw 0 0