As you have seen in a previous article, Btrfs snapshots are a convenient and fast way to make backups. Please note that these articles do not suggest that you avoid backup software or well-tested backup plans. Their goals are to show a great feature of this file system, snapshots, and to inspire curiosity and invite you to explore, experiment and deepen the subject. Read on for more about how to recover your files from Btrfs snapshots.
A subvolume for your project
Let’s assume that you want to save the documents related to a project inside the directory $HOME/Documents/myproject.
As you have seen, a Btrfs subvolume, as well as a snapshot, looks like a normal directory. Why not use a Btrfs subvolume for your project, in order to take advantage of snapshots? To create the subvolume, use this command:
btrfs subvolume create $HOME/Documents/myproject
You can create a hidden directory where to arrange your snapshots:
mkdir $HOME/.snapshots
As you can see, in this case there’s no need to use sudo. However, sudo is still needed to list the subvolumes, and to use the send and receive commands.
Now you can start writing your documents. Each day (or each hour, or even minute) you can take a snapshot just before you start to work:
btrfs subvolume snapshot -r $HOME/Documents/myproject $HOME/.snapshots/myproject-day1
For better security and consistency, and if you need to send the snapshot to an external drive as shown in the previous article, remember that the snapshot must be read only, using the -r flag.
Note that in this case, a snapshot of the /home subvolume will not snapshot the $HOME/Documents/myproject subvolume.
How to recover a file or a directory
In this example let’s assume a classic error: you deleted a file by mistake. You can recover it from the most recent snapshot, or recover an older version of the file from an older snapshot. Do you remember that a snapshot appears like a regular directory? You can simply use the cp command to restore the deleted file:
cp $HOME/.snapshots/myproject-day1/filename.odt $HOME/Documents/myproject
Or restore an entire directory:
cp -r $HOME/.snapshots/myproject-day1/directory $HOME/Documents/myproject
What if you delete the entire $HOME/Documents/myproject directory (actually, the subvolume)? You can recreate the subvolume as seen before, and again, you can simply use the cp command to restore the entire content from the snapshot:
btrfs subvolume create $HOME/Documents/myproject
cp -rT $HOME/.snapshots/myproject-day1 $HOME/Documents/myproject
Or you could restore the subvolume by using the btrfs snapshot command (yes, a snapshot of a snapshot):
btrfs subvolume snapshot $HOME/.snapshots/myproject-day1 $HOME/Documents/myproject
How to recover btrfs snapshots from an external drive
You can use the cp command even if the snapshot resides on an external drive. For instance:
cp /run/media/user/mydisk/bk/myproject-day1/filename.odt $HOME/Documents/myproject
You can restore an entire snapshot as well. In this case, since you will use the send and receive commands, you must use sudo. In addition, consider that the restored subvolume will be created as read only. Therefore you need to also set the read only property to false:
sudo btrfs send /run/media/user/mydisk/bk/myproject-day1 | sudo btrfs receive $HOME/Documents/
mv Documents/myproject-day1 Documents/myproject
btrfs property set Documents/myproject ro false
Here’s an extra explanation. The command btrfs subvolume snapshot will create an exact copy of a subvolume in the same device. The destination has to reside in the same btrfs device. You can’t use another device as the destination of the snapshot. In that case you need to take a snapshot and use the send and receive commands.
For more information, refer to some of the online documentation:
man btrfs-subvolume man btrfs-send man btrfs-receive
Alessio Ciregia
Alessio is an unpretentious sysadmin. Linux and FOSS are not his hobby… they are a job.