Make snapshots recursively from btrfs-subvolumes This scripts are written in python3 and replace https://github.com/xundeenergie/mkbtrbackup
Start a debian-live session. Download a netboot.iso or any other stretch-live.iso Take care, that you've installed btrfs-progs and kernel in the highest possible version. Download and install the package mkbackup-btrfs.deb (always a symlink to the latest package) from https://github.com/xundeenergie/mkbackup-btrfs Or just download and make it executeable wget https://raw.githubusercontent.com/xundeenergie/mkbackup-btrfs/master/mkbackup-btrfs/usr/local/bin/create-btrfs-subs.sh chmod a+x create-btrfs-subs-sh
Then create a new as big as possible partition and format it with btrfs.
If you want to use UEFI, your partition-table must be GPT. For UEFI you need an extra partition for ESP (Efi System Partition). Just lool on other places how to format a Disk for the usage with (U)EFI.
If you've created a big btrfs-partition, mount it in your live-system: mount /dev/sdXY /mnt -osubvolume=/,compress
X is your drive, Y is the number oft the btrfs-partition on drive X.
then change to /mnt cd /mnt
and run the script sudo /path/to/download/create-btrfs-subs.sh
/path/to/download is where you've downloaded the script before.
You will end up in a chroot of your new installed ground-system. It is not bootable now. Install a kernel, tzdata, initramfs, grub or refind, install other packages you need (firmware, network-manager, desktops...)
You have to prepare your installation with some subvolumes.
First create a directory
mkdir -p /var/cache/btrfs_pool_SYSTEM
and
mkdir -p /var/cache/backup
The first is for the local HD, to mount the whole btrfs-partition, the btrfs-pool. The second one is for the external HD to save the backup. This two directories are hardcoded for the default-configuration in the python-skript.
Mount your btrfs-partition to /var/cache/btrfs_pool_SYSTEM
mount -t btrfs -ocompress=lzo /dev/sdXY /var/cache/btrfs_pool_SYSTEM
You neet two major subvolumes.
One for your system, which is snapshotted on every upgrade/update, on successfull boots and so on. The other one for data you will need accurat even if you boot from an older snapshot (recover your system, you need /home, /var/spool accurat - it's user-data!).
The first is called for example: "@debian"
The second one is hardcoded with "__ALWAYSCURRENT__
"
btrfs subvol create /var/cache/btrfs_pool_SYSTEM/@debian
btrfs subvol create /var/cache/btrfs_pool_SYSTEM/__ALWAYSCURRENT__
The system mounts the default-subvolume on bootup. So be sure, that @debian is your default-subvolume.
prepare your /etc/fstab to mount the always current subvolumes from __ALWAYSCURRENT__
Create the following subvolumes there:
home
opt
srv
usr-local
var-cache
var-lib-mpd
var-lib-named
var-log
var-opt
var-spool
var-spool-dovecot
var-tmp
var-www
Look at the fstab-example for mounting all this subvolumes.
Copy your data to this subvolumes
cp --reflink=always -ar source destination
Reboot an check if all this subvolumes are mounted correctly. You can clean the original directories in @debian while they are overmounted with the new ones, if you go to /var/cache/btrfs_pool_SYSTEM/@debian/sub/vol/ume and delete it there.
Be carefull. If you copy the systemd-units to your system, the timers and units are enabled!! Disable all the snapshotting with:
systemctl stop mkbackup.target
and disable it
systemctl disable mkbackup.target
Enable and start it if all the data and subvolume-structure is correct and working.
You can make your first snapshot with:
systemctl start mkbackup@manually.service
##mlocate: To avoid, that mlocate searches the backups, edit its configuration
/etc/updatedb.conf
PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /backup /backup-local /var/cache/backup /var/cache/btrfs_pool_SYSTEM"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs fuse.MksnapshotFS.py"
==Ignore Subvolumes on creating a System-Snapshot If you want to ignore a subvolume from making a backup-Snapshot, you can handle this on several ways. The easiest way is to drop a Drop-In-File for example like this for a guest-session-home:
editor /etc/mkbackup-btrfs.conf.d/guestsession.conf
[DEFAULT]
ignore = +/home/gast
The filename doesn't matter. But it must end in ".conf" This can be done by placing such a Drop-In with a debian-package, or manually. You can choose, if it should be ignored generally or only on specific interval-snapshots. The example above appends /home/gast to an existing list of ignored snapshots.
[DEFAULT]
ignore = /home/gast
this replaces every ignore-list with only this subvolume "/home/gast" the "+" before the subvolume means, that the subvolume(s) given are being appended to a existing list. Without a "+", the list is replaced by the given.
If you want to ignore a specific subvolume additionally on a specific interval (f.e. /var/www should not be backed up on hourly snapshots), place this in a file:
[hourly]
ignore = +/var/www
You can set the ignore-Option in every section also in /etc/mkbackup-btrfs.conf It works the same way. DEFAULT is valid to every interval, and default-Values get overwritten or extended (missing or given "+") by the interval-sections
To ignore several subvolumes when using mkbackup-btrfs from commandline, just use the -i option (more than once)
mkbackup -v -t manually -i /home/guest -i /var/www create SNP @debian
This overrides settings from config-files.
TODO:
- Regular-Expressions for ignoring subvolumes. Test and describe it in Todo
=Changelog
18.9.2016: -added experimental new code btrfssubvols.py - not working yet!! -new library in /usr/lib/python3/dist-packages for config-parsing -new Fuse-Filesystem for usermounting the backups and snapshots in $HOME/backup