Title: Using rsnapshot for easy backups
Author: Solène
Date: 10 January 2020
Tags: openbsd
Description: 

## Introduction

rsnapshot is a handy tool to manage backups using rsync and hard links
on the
filesystem. rsnapshot will copy folders and files but it will skip
duplication
over backups using hard links for files which has not changed.

This kinda create snapshots of your folders you want to backup, only
using
rsync, it's very efficient and easy to use, and getting files from
backups is
really easy as they are stored as files under the rsnapshot backup.


## Installation

Installing rsnapshot is very easy, on most systems it will be in your
official
repository packages.

To install it on OpenBSD: `pkg_add rsnapshot` (as root)


## Configuration

Now you may want to configure it, in OpenBSD you will find a template
in
`/etc/rsnapshot.conf` that you can edit for your needs (you can make a
backup
of it first if you want to start over). As it's stated in big (as big
as it can
be displayed in a terminal) letters at the top of the configuration
sample
file, you will see that things must be separated by TABS and not
spaces. I've
made the mistakes more than once, don't forget using tabs.

I won't explain all options, but only the most importants.

The variable `snapshot_root` is where you want to store the backups.
Don't put
that directory in a directory you will backup (that will end into an
infinite
loop)

The variable `backup` is for telling rsnapshot what you want to backup
from
your system to which directory inside snapshot_root

Here are a few examples:

    backup        /home/solene/        myfiles/
    backup        /home/shera/Documents        shera_files/
    backup        /home/shera/Music        shera_files/
    backup        /etc/        etc/
    backup        /var/        var/        exclude=logs/*

**Be careful when using ending slashes to paths, it works the same as
with rsync**.
`/home/solene/` means that into target directory, it will contains the
content
of `/home/solene/` while `/home/solene` will copy the folder solene
within the
target directory, so you end up with
target_directory/solene/the_files_here.

The variables `retain` are very important, this will define how
rsnapshot keep
your data. In the example you will see alpha, beta, gamma but it could
be hour,
day, week or foo and bar. It's only a name that will be used by
rsnapshot to
name your backups and also that you will use to tell rsnapshot which
kind of
backup to do. Now, I must explain how rsnapshot actually work.


## How it work

Let's go for a straighforward configuration. We want a backup every
hour on the
last 24h, a backup every day for the past 7 days and 3 manuals backup
that we
start manually.

We will have this in our rsnapshot configuration

    retain        hourly        24
    retain        daily        7
    retain        manual        3


but how does rsnapshot know how to do what? The answer is that it
doesn't.

In root user crontab, you will have to add something like this:

    # run rsnapshot every hour at 0 minutes
    0 * * * * rsnapshot hourly

    # run rsnapshot every day at 4 hours 0 minutes
    0 4 * * * rsnapshot daily

and then, when you want to do a manual backup, just start `rsnapshot
manual`

Every time you run rsnapshot for a "kind" of backup, the last version
will be
named in the rsnapshoot root directory like hourly.0 and every backups
will be
shifted by one. The directory getting a number higher than the number
in the
`retain` line will be deleted.


## New to crontab?

If you never used crontab, I will share two important things to know
about it.

Use MAILTO="" if you don't want to receive every output generated from
scripts
started by cron.

Use a PATH containing /usr/local/bin/ in it because in the default cron
PATH it
is not present. Instead of setting PATH you can also using full binary
paths
into the crontab, like /usr/local/bin/rsnapshot daily

You can edit the current user crontab with the command `crontab -e`.

Your crontab may then look like:

   
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/l
ocal/sbin
    MAILTO=""
    # comments are allowed in crontab
    # run rsnapshot every hour at 0 minutes
    0 * * * * rsnapshot hourly
    # run rsnapshot every day at 4 hours 0 minutes
    0 4 * * * rsnapshot daily