Full system backup with rsync
Related articles
This article is about using rsync to transfer a copy of your "/" tree, excluding a few select folders. This approach is considered to be better than disk cloning with dd
since it allows for a different size, partition table and filesystem to be used, and better than copying with cp -a
as well, because it allows greater control over file permissions, attributes, Access Control Lists and extended attributes.
Either method will work even while the system is running, but files changed during the transfer may or may not be transferred, which could cause undefined behaviour of some programs using the transferred files.
This approach will also work well for migrating an existing installation to a new harddrive or SSD.
Contents
With a single command
This command depends on brace expansion available in both the bash and zsh shells. When using a different shell, --exclude
patterns should be repeated manually.
# rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/backup/folder
Using the -aAX
set of options, the files are transferred in archive mode, ensuring that symbolic links, devices, permissions and ownerships, modification times, ACLs and extended attributes are preserved (assuming that the target file system supports the feature).
The --exclude
option will cause files that match the given patterns to be excluded. The contents of /dev
, /proc
, /sys
, /tmp
and /run
were excluded because they are populated at boot (while the folders themselves are not created), /lost+found
is filesystem-specific. Quoting the exclude patterns will avoid expansion by shell, which is necessary e.g. when backing up over SSH. Ending the excluded paths with *
will still ensure that the directories themselves are created if not already existing.
You may want to include additional rsync options, such as the following (see man rsync
for the full list):
- If you are a heavy user of hardlinks, you might consider adding the
-H
option, which is turned off by default as memory expensive, but nowadays it should be no problem on most modern machines. There are a lot of hard links below the/usr/
folder, which save disk space. - You may want to add rsync's
--delete
option if you are running this multiple times to the same backup folder. In this case make sure that the source path does not end with/*
, or this option will only have effect on the files inside the subdirectories of the source directory, but no effect on the files residing directly inside the source directory. - If you use any sparse files, such as virtual disks, Docker images and similar, you should add the
-S
option. - The
--numeric-ids
option will disable mapping of user and group names, numeric group and user IDs will be transfered instead. This is useful when backing up over SSH or when using a live system to backup different system disk. - Choosing
--info=progress2
option instead of-v
will show overal progress info and transfer speed instead of huge list of files.
If you wish to restore the backup use the same rsync command that was executed, but with the source and destination reversed.
Boot requirements
Having a bootable backup can be useful in case the filesystem becomes corrupt or if an update breaks the system. The backup can also be used as a test bed for updates, with the testing repo enabled, etc. If you transferred the system to a different partition or drive and you want to boot it, the process is as simple as updating the backup's /etc/fstab
and your bootloader's configuration file.
Update the fstab
Without rebooting, edit the backup's fstab to reflect the changes:
/path/to/backup/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sda1 /boot ext2 defaults 0 2 /dev/sda5 none swap defaults 0 0 /dev/sda6 / ext4 defaults 0 1 /dev/sda7 /home ext4 defaults 0 2
Because rsync has performed a recursive copy of the entire root filesystem, all of the sda
mountpoints are problematic and booting the backup will fail. In this example, all of the offending entries are replaced with a single one:
/path/to/backup/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sdb1 / ext4 defaults 0 1
Remember to use the proper device name and filesystem type.
Update the bootloader's configuration file
This section assumes that you backed up the system to another drive or partition, that your current bootloader is working fine, and that you want to boot from the backup as well.
For Syslinux, all you need to do is duplicate the current entry, except pointing to a different drive or partition.
For GRUB, it is recommended that you automatically re-generate the main configuration file.
Also verify the new menu entry in /boot/grub/grub.cfg
. Make sure the UUID is matching the new partition, otherwise it could still boot the old system. Find the UUID of a partition as follows:
# lsblk -no NAME,UUID /dev/sdb3
where you substitute the desired partition for /dev/sdb3. To list the UUIDs of partitions grub thinks it can boot, use grep:
# grep UUID= /boot/grub/grub.cfg
First boot
Reboot the computer and select the right entry in the bootloader. This will load the system for the first time. All peripherals should be detected and the empty folders in /
will be populated.
Now you can re-edit /etc/fstab
to add the previously removed partitions and mount points.
See also
- Howto – local and remote snapshot backup using rsync with hard links Includes file deduplication with hard-links, MD5 integrity signature, 'chattr' protection, filter rules, disk quota, retention policy with exponential distribution (backups rotation while saving more recent backups than older)