System backup
This rsync script allows creating a full backup copy across filesystems. It is setup so that the copy includes intact booting capabilities, optionally excluding selected files.
The approach has benefits over omitting system files by just copying personal data; if the system becomes corrupted in the main partition, overcoming the problem means booting into the backup as opposed to identifying and reinstalling affected programs.
Instructions were converted from this forum post.
Contents
With a single command
This operation can be done while the system is running. Since it's going to take a while, you may freely browse the web during this time. Worst case scenario you won't get the same opened tabs when you restore the backup (or boot from it) because they weren't saved. Not a big deal.
As root, run:
# rsync -av /* /media/Backup/backup --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,$HOME/.gvfs}
/dev
, /proc
, /sys
, /tmp
, /run
were excluded because they are populated at boot (while the folders themselves are not created), lost+found
is filesystem-specific, and $HOME/.gvfs
should be added too, so that it won't complain at the end that "some files/attrs were not transferred".~/.thumbnails/*
, ~/.mozilla/firefox/*.default/Cache/*
and ~/.cache/chromium/*
With a list
For this method, two files are needed: the backup script and a file stating which files to include/exclude from the backup source.
Backup script
The script is very simple; it rsyncs in archive mode, ensuring that symbolic links, devices, permissions and ownerships, among other file attributes are preserved, while excluding files that match the patterns from the include/exclude list.
Save it as rbackup.sh
and make it executable:
rbackup.sh
#!/bin/sh sudo sh -c " rsync -av --delete-excluded --exclude-from=backup.lst / $1; date > $1/BACKUP "
Backup source: /
— In this case it's performing a backup on the whole root.
Backup destination: $1
— Passed as an argument to the script. It will be a substitute for whatever backup destination you want later (e.g. /media/backup).
Exclude list: --exclude-from=backup.lst
— This example uses a file called backup.lst.
Exclude list
As deciding which files should populate this list can be difficult, here's a typical example of files that do not need to be backed up.
Save the following as backup.lst
:
backup.lst
# Include # Commented out. See bellow. # Exclude - /dev/* - /run/* - /proc/* - /sys/* - /tmp/* - lost+found/ - /media/* - /mnt/*
- Exclude
- Content in system directories;
/dev
,/proc
,/sys
and/tmp
are excluded because they are created by the system at runtime, while the directories themselves need to be preserved since they are not regenerated at boot. Lastly, alllost+found
instances are skipped since they are partition-specific. For Archlinux/var/lib/pacman/sync/*
can also be excluded. This can save a lot of time on every backup since the directory contains many small files that tend to change quite often. These are description files for every package from the repositories. These files can be regenerated withpacman -Syu
.
- Include
- See the example at the bottom of this article if you explicitly want to keep something from the user folder or /media (although you could simply copy them after rsync is done, so this section is a bit redundant). Note that specifying every desired file or directory in
Include
is not needed; this section only acts as a filter for statements inExclude
.
Backing up
While the system is running, open a terminal and run (as root):
# /path/to/rbackup.sh /media/backup/
/media/backup
as appropriate./
" character at the end is necessary.Boot requirements
If you transferred the system to a different partition or HDD and you want to boot it, the process is as simple as updating the backup's /etc/fstab
and your bootloader's configuration file (e.g. /boot/grub/menu.lst
). But if you plan on replacing the current install (or replacing the HDD) and you know that you will no longer have a bootloader, you will also have to (re)install one.
Here's how you can find out the device name or UUID of a certain partition:
$ blkid
# fdisk -l
Update the fstab
Edit the backup's fstab to reflect the changes:
# nano /media/backup/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid,noexec 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:
# nano /media/backup/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid,noexec 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.
(hd0,0)
as the first partition of the first drive. Syslinux will see it as h0 1
.All you need to do is duplicate the current entry, except pointing to a different drive or partition.
For GRUB Legacy:
# nano /boot/grub/menu.lst
For Syslinux:
# nano /boot/syslinux/syslinux.cfg
For GRUB2, it's recommended that you automatically re-generate a .cfg:
# grub-mkconfig -o /boot/grub/grub.cfg
(Re)install the bootloader
This section assumes that the system was backed up on a machine that no longer has a bootloader installed, or a machine that only has Windows on it (e.g. Windows has taken over the MBR after reinstalling it).
So, using a "live" Linux distribution and from a chroot environment (this is important), run:
GRUB Legacy:
# grub-install /dev/sda
GRUB2:
# grub-install /dev/sda # grub-mkconfig -o /boot/grub/grub.cfg
Syslinux:
# extlinux --install /boot/syslinux # dd bs=440 conv=notrunc count=1 if=/usr/lib/syslinux/mbr.bin of=/dev/sda
External links
A sample implementation can be found here: