Install Arch Linux With Btrfs Snapshotting

Updated on March 10, 2017
Install Arch Linux With Btrfs Snapshotting header image


Arch Linux is a general-purpose distribution well-known for its cutting-edge technology and flexible configuration. With Btrfs snapshots, we can take the advantage of its fast-pace while being confident of the system's stability. Let's start.


  • A newly-created Vultr instance.
  • Some free time and patience.


You can choose the Arch Linux ISO from the ISO library when creating the instance. If not, you can load that in the machine's settings. As the time of writing the newest (2017.01.01) ISO is available in the library. If that ISO is outdated, I recommend downloading it again.

After the machine starts, click View Console and boot the system up. We need to set up a root password for the environment so that we can access it from our working computer:

systemctl start sshd

Close the VNC window and connect to the machine via ssh:

ssh root@<your host ip here>

Install tmux so that we can keep our session across unstable connections:

pacman -Sy tmux

If the connection accidentally closes during the installation, simply ssh back to the machine and run:

tmux attach


First things first, let's partition the disk.

mkfs.btrfs -m single -L arch /dev/vda
mount -o compress=lzo /dev/vda /mnt

Next comes the tricky part: creating subvolumes.

cd /mnt
btrfs su cr @
btrfs su cr @boot
btrfs su cr @home
btrfs su cr @log
btrfs su cr @pkg
btrfs su cr @srv
btrfs su cr @tmp

Then, mount the subvolumes.

cd /
umount /mnt
mount -o compress=lzo,subvol=@ /dev/vda /mnt
cd /mnt
mkdir -p {boot,home,srv,var/{log,cache/pacman/pkg,tmp}}
mount -o compress=lzo,subvol=@boot /dev/vda boot
mount -o compress=lzo,subvol=@home /dev/vda home
mount -o compress=lzo,subvol=@log /dev/vda var/log
mount -o compress=lzo,subvol=@pkg /dev/vda var/cache/pacman/pkg
mount -o compress=lzo,subvol=@srv /dev/vda srv
mount -o compress=lzo,subvol=@tmp /dev/vda var/tmp

Install the base system.

pacstrap -i /mnt base base-devel snapper vim

Configure the system.

genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt
ln -s /usr/share/zoneinfo/Region/City /etc/localtime # Replace Region/City with your value
hwclock --systohc
vim /etc/locale.gen # Uncomment en_US.UTF-8 UTF-8 line
echo "LANG=en_US.UTF-8" > /etc/locale.conf
pacman -S networkmanager 
echo "your-hostname" > /etc/hostname # Replace your-hostname with your value
vim /etc/hosts # Configure and ::1 lines accordingly
systemctl enable NetworkManager.service

Enable sshd for future remote logins.

vim /etc/ssh/sshd_config # Set PermitRootLogin yes
systemctl enable sshd.service

Note that the best practice is putting your public key into the ~/.ssh/authorized_keys file instead of enabling password login for root.

Configure the initramfs so that it satisfies our need for btrfs.

vim /etc/mkinitcpio.conf

Locate MODULES="..." and add btrfs into the list. Re-generate the initramfs:

mkinitcpio -p linux

Set the root password.


Install and configure the bootloader.

pacman -S grub
grub-install /dev/vda
grub-mkconfig -o /boot/grub/grub.cfg

Reboot and remove the ISO in your machine control panel.


Connect to the server again (perhaps after a short while; wait until the boot completes). Note that the server fingerprint has changed, so you may need to alter your known_hosts file:

vim ~/.ssh/known_hosts
ssh root@<your host ip here>

Let's configure snapper, which automates the snapshotting procedure.

snapper -c root create-config /

Edit the config and alter TIMELINE_LIMIT_{HOURLY,DAILY,WEEKLY,MONTHLY,YEARLY} according to your needs.

vim /etc/snapper/configs/root

Enable the systemd timers.

systemctl enable snapper-timeline.timer
systemctl start snapper-timeline.timer
systemctl enable snapper-cleanup.timer
systemctl start snapper-cleanup.timer

Job's done!

The configuration of the system is now finished. For more detailed information about how to use snapper, consult the wiki page or snapper(8) for more information. Enjoy your new Arch Linux with btrfs auto-snapshotting system!