162 lines
6.1 KiB
Markdown
162 lines
6.1 KiB
Markdown
|
# mkbackup-btrfs
|
||
|
Make snapshots recursively from btrfs-subvolumes
|
||
|
This scripts are written in python3 and replace https://github.com/xundeenergie/mkbtrbackup
|
||
|
|
||
|
|
||
|
## Automatic installation with script
|
||
|
|
||
|
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...)
|
||
|
|
||
|
|
||
|
## Manually creation of the subvolume-structure, no installation!
|
||
|
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
|
||
|
|