add instructions
This commit is contained in:
168
README.md
Normal file
168
README.md
Normal file
@ -0,0 +1,168 @@
|
||||
# zfsbk utils
|
||||
|
||||
This is a minimalistic utility to manage backups for systems using the
|
||||
outstanding [http://en.wikipedia.org/wiki/ZFS ZFS] filesystem.
|
||||
|
||||
It relies on Snapshots to provide:
|
||||
|
||||
* local backups – they help you recover files from earlier in time.
|
||||
* remote backups – they help you recover whole datasets for system failures.
|
||||
|
||||
|
||||
## Snapshot management
|
||||
|
||||
You run `zfssnap.sh` for taking snapshots, typically from cron:
|
||||
|
||||
vim /etc/crontab ...
|
||||
# take hourly snapshot, keep 24 of them
|
||||
@hourly root /usr/local/sbin/zfssnap.sh hour 24
|
||||
|
||||
This will create, every hour, a new ZFS snapshot tagged 'hour':
|
||||
|
||||
# ls /.zfs/snapshot/
|
||||
zbk-hour-20140318-140000
|
||||
zbk-hour-20140318-150000
|
||||
zbk-hour-20140318-160000
|
||||
|
||||
Only 24 of these snapshots will be kept (see Rotation below). The name of each
|
||||
snapshot comes with format `zbk-[tag]-[date]-[time]`. Date is `YYYYMMDD` and
|
||||
time is `hhmmss`.
|
||||
|
||||
### Snapshot groups
|
||||
|
||||
Each snapshot is tagged:
|
||||
|
||||
# create a snapshot tagged 'foobar'. Maintain 10 at all times
|
||||
zfssnap.sh foobar 10
|
||||
|
||||
Snapshots with the same tag make a **snapshot group**. For example, the
|
||||
`foobar` group will count up to 10 members at all times.
|
||||
|
||||
Multiple groups can exist, just take snapshots with different tags:
|
||||
|
||||
# take 2 'hourly' snaps
|
||||
zfssnap.sh hourly 10
|
||||
# take 2 'daily' snaps
|
||||
zfssnap.sh daily 10
|
||||
# ls /.zfs/snapshot
|
||||
zfs-hourly-20140318-140001
|
||||
zfs-hourly-20140318-140003
|
||||
zfs-daily-20140318-140110
|
||||
zfs-daily-20140318-140111
|
||||
zfs-daily-20140318-140112
|
||||
zfs-daily-20140318-140114
|
||||
|
||||
Neither `zfssnap.sh` nor ZFS put a limit on the number of snaps you can
|
||||
maintain. The tool was tested with over 200. Bear in mind that it's shell
|
||||
scripts, so inherent limitations of arguments length could get in your way.
|
||||
|
||||
I recommend staying under 50 snaps per group and 200 snaps total.
|
||||
|
||||
### Snapshot rotation
|
||||
|
||||
`zfssnap.sh` takes a new snapshot every time it's run. When the number of
|
||||
existing snapshots exceeds the given limit, the oldest snapshot of that group
|
||||
(tag) is removed, so only so many are kept:
|
||||
|
||||
# take snap xyz, then keep only last 2 from xyz group
|
||||
zfssnap.sh xyz 2
|
||||
|
||||
This bounds the number of snapshots for each group to 2. To remove all snaps in a group, simply pass ''i'' as limit:
|
||||
|
||||
# remove all snaps of group xyz
|
||||
zfssnap.sh xyz 0
|
||||
|
||||
### Recovering files (local backup)
|
||||
|
||||
Lost a file? Find it under:
|
||||
|
||||
# list content of michele's home at 2pm (1400)
|
||||
ls /.zfs/snapshot/zbk-hour-140000/home/michele
|
||||
|
||||
Notice that you must look for the `/.zfs` directory at the root of the dataset actually holding it:
|
||||
|
||||
# list content of michele's home, if /home is on zroot/home
|
||||
ls /home/.zfs/snapshot/zbk-hour-140000/michele
|
||||
|
||||
### Full snapshot management cron example
|
||||
|
||||
# take 15' backups for the last hour
|
||||
*/15 * * * * root /usr/local/sbin/zfssnap.sh qrt 4
|
||||
# take hourly backups for the 6 hours
|
||||
1 * * * * root /usr/local/sbin/zfssnap.sh hourly 6
|
||||
# take 6-hours backups for the last day
|
||||
1 */6 * * * root /usr/local/sbin/zfssnap.sh 6hr 4
|
||||
# take daily backups for the last week
|
||||
1 1 * * * root /usr/local/sbin/zfssnap.sh day 7
|
||||
# take weekly backups for the last 2 months
|
||||
1 1 * * 1 root /usr/local/sbin/zfssnap.sh week 8
|
||||
|
||||
### Excluding dataset from backup
|
||||
|
||||
`zfssnap.sh` takes a recursive backup of the `zroot` pool. If you do not intend
|
||||
to maintain backups for certain datasets, you can exclude them with the
|
||||
`EXCLUDES` and `EXTRA_EXCLUDES` **environment variables**:
|
||||
|
||||
# exclude only these datasets
|
||||
EXCLUDES=“/mydataset/foobar"
|
||||
# exclude these datasets in addition to default exclusions
|
||||
EXTRA_EXCLUDES=“/mydataset/foobar"
|
||||
|
||||
Notice that these are **dataset names**, not mountpoints! If dataset
|
||||
`zroot/foo` is at mountpoint `/bar`, specify `/foo` here.
|
||||
|
||||
The following datasets, common for FreeBSD users, are excluded by default:
|
||||
|
||||
* `/usr/ports`
|
||||
* `/usr/src`
|
||||
* `/backups`
|
||||
|
||||
If you do not want these excluded, pass an empty `EXCLUDES` envvar.
|
||||
|
||||
|
||||
## Generating remote backups
|
||||
|
||||
The `zfsbk.sh` lets you generate backups and upload them to a remote location.
|
||||
|
||||
This takes a snapshot with tag `mybk` and serializes it in file `/backups/zbk-mybk-140000.dump`:
|
||||
|
||||
# generate ZFS streaming package, save to /backups folder
|
||||
/usr/local/sbin/zfsbk.sh mybk
|
||||
ls /backups
|
||||
zfs-mybk-20140318-061900.dump
|
||||
|
||||
|
||||
## Incremental backups
|
||||
|
||||
Pass a number to `zfsbk.sh` and it will create incremental snapshots:
|
||||
|
||||
# 1. make full replication if this is the first snap in group
|
||||
# 2. else make incremental replication wrt latest snap in group
|
||||
# 3. reset the snap group after 1+9 steps have been made
|
||||
/usr/local/sbin/zfsbk.sh mybk 10
|
||||
|
||||
Incremental packages are named after their snapshot endpoints:
|
||||
|
||||
ls /backups
|
||||
zbk-mybk-20140318-140000--zbk-mybk-20140318-150000.dump
|
||||
|
||||
If the given integer is 1, `zfsbk.sh` sends full replication packages for every
|
||||
run.
|
||||
|
||||
|
||||
## Uploading backups remotely
|
||||
|
||||
`zfsbk.sh` can upload each replication package after generating it, at the end of the run.
|
||||
|
||||
Pass the destination coordinates with the `UPLOAD_PATH` environment variable.
|
||||
Currently, rsync:// and scp:// are supported:
|
||||
|
||||
# take snap, generate backup, upload it to remote server
|
||||
UPLOAD_PATH="rsync://user@backup.server.com::server12/" /usr/local/sbin/zfsbk.sh mybk 10
|
||||
|
||||
`zfsbk.sh` relies on `zfssnap.sh` to take the snapshot to backup. Therefore, you can exclude
|
||||
different datasets from its backup by passing the respective `EXCLUDES` or `EXTRA_EXCLUDES`
|
||||
variables:
|
||||
|
||||
# take selective backup
|
||||
EXTRA_EXCLUDES="/jails/test.dom.com" /usr/local/sbin/zfsbk.sh mybk 1
|
||||
Reference in New Issue
Block a user