Rsnapshot

Updated 29 April 2019

Introduction

Rsnapshot is a backup utility, written in Perl and Rsync-based. It makes periodic backup of filesystems easier. Для дедупликации данных Rsnapshot использует жёсткие ссылки. Резервное копирование - необходимая задача системного администрирования, так как всегда есть риск потери данных: выход из строя жёсткого диска, случайное удаление данные, вредоносное программное обеспечение, сбой файловой системы.

Rsnapshot allows you to make several levels of snapshots (alpha, beta, gamma, etc.) and assign any names to them, as well as rotate them, removing obsolete ones. В руководстве используется 6 alpha, 7 beta и 4 gamma копии.

Для подготовки резервной копии используется команда rsnapshot sync, при выполнении которой все указанные данные помещаются в директорию .sync в пути хранения резервных копий.

To put a snapshot at the alpha level, use the rsnapshot alpha command. At first start, the '.sync' directorysync будет переименован в alpha.0. При втором запуске alpha.0 будет переименована в alpha.1, а текущая копия будет снова сохранена в alpha.0. Таким образом, в alpha.0 всегда будет находиться самая свежая копия. Subsequent snapshots will also be renamed and stored until their number reaches six - in this case, a copy of alpha.5 will be deleted and replaced with alpha.4.

To visualize creation of a snapshot, see the diagram below:

              +---------------------------+
              |           .sync           |
              +---------------------------+
                            |
                -------------
                |
                ∇          -->
              +---+---+---+---+---+---+---+
alpha-уровень | 0 | 1 | 2 | 3 | 4 | 5 | - |
              +---+---+---+---+---+---+---+
                                    |
                ---------------------
                |
                ∇            -->
              +---+---+---+---+---+---+---+---+
beta-уровень  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - |
              +---+---+---+---+---+---+---+---+
                                        |
                -------------------------
                |
                ∇      -->
              +---+---+---+---+---+
gamma-уровень | 0 | 1 | 2 | 3 | - |
              +---+---+---+---+---+

The beta snapshot is created from the oldest copy of the alpha level (alpha.5) with the rsnapshot beta command.

Иными словами, alpha.0 получается из файловой системы, alpha.1 из alpha.0, beta.0 из последней alpla (alpha.5), beta.1 из beta.0, gamma.0 из последней beta (beta.6).

Important

Если на момент выполнения rsnapshot beta копии alpha.5 ещё не существует, но есть alpha.4, копия beta.0 сделана не будет. Nonetheless, the other beta snapshots will be rotated. Поэтому не следует запускать следующие уровни чаще предыдущих.

Installation

Установите программу, выполнив:

emerge -a app-backup/rsnapshot

Configuration

Выполните базовые настройки, изменив при необходимости путь хранения резервных копий, количество и уровни резервных копий:

/etc/rsnapshot.conf

# path to the local directory where snapshots will be stored
snapshot_root   /var/calculate/snapshots

# уровни и количество снимков резервных копий:
retain  alpha   6
retain  beta    7
retain  gamma   4

Important

Note that fields are Tab -spaced!

Сверьте список список путей, исключаемых из резервной копии:

/etc/rsnapshot.d/rsnapshot.filter
- /dev/*
- /lost+found
- /tmp/*
- /usr/portage/*
- /var/lib/layman/*
- /lxc/*/snaps
- /lxc/*/rootfs/dev/*
- /lxc/*/rootfs/tmp/*
- /lxc/*/rootfs/usr/portage/*
- /lxc/*/rootfs/var/lib/layman/*
- /lxc/*/rootfs/var/log/*
- /lxc/**/calculate/packages
- /lxc/**/remote/distfiles
- /packages
- /remote/distfiles
- /snapshots/*
- /var/calculate/snapshots/*

Local snapshots

Path configuration

В примере ниже описаны пути резервного копирования (корень файлововой системы и /var/calculate) для текущей машины, используя параметр backup:

/etc/rsnapshot.d/localhost.conf

backup  /               localhost/rootfs/
backup  /var/calculate  localhost/calculate

Теперь в директории хранения будет созданы пути localhost/rootfs и localhost/calculate для хранения корня файловой системы и директории /var/calculate соответственно.

Creating a snapshot

To prepare the data to be backuped, run:

rsnapshot sync

Выполнение этой команды при необходимости может быть прервано или повторено несколько раз. После того, как синхронизация завершилась, выполните ротацию alpha-уровня:

rsnapshot alpha

Running again rsnaphost sync will prepare a new backup. После чего вызов rsnapshot alpha выполнит ротацию и переместит синхронизированные данные на уровень alpha0.

Когда количество alpha-снимков заполнит весь уровень, появится возможность не удалять самый старый снимок, а перевести его на уровень beta. To do this, run rsnapshot beta before running rsnapshot alpha.

              +---+---+---+---+---+---+
alpha-уровень | 0 | 1 | 2 | 3 | 4 | 5 |
              +---+---+---+---+---+---+
                        alpha.6     |
                ---------------------
                |
                ∇
              +---+---+---+---+---+---+---+---+
beta-уровень  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - |
              +---+---+---+---+---+---+---+---+

Выполнение этих команд в обратном порядке приведёт к тому, что сначала будет удалена последняя копия alpha, затем будет сформирован alpha-уровень из 6 элементов, а после этого последний элемент будет переведён на уровень beta, что уменьшит очередь alpha на 1.

              +---+---+---+---+---+---+ +---+
alpha-уровень | 0 | 1 | 2 | 3 | 4 |   | | 6 |
              +---+---+---+---+---+---+ +---+
                        alpha.5     |
                ---------------------
                |
                ∇
              +---+---+---+---+---+---+---+---+
beta-уровень  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - |
              +---+---+---+---+---+---+---+---+

Scheduling snapshots

Add a daily .sync snapshotting procedure to cron. Синхронизация может быть долгой, поэтому запланируйте достаточное время для её выполнения (12 часов). Добавьте ежедневное создание копий alpha, beta каждую субботу и gamma первого числа каждого месяца.

Important

Before you create an alpha copy, you must create a beta, and a gamma one before you create a beta.

As deleting an obsolete copy can take some time, a pause (1 hour) should be added between rotations.

/etc/cron.d/rsnapshot

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

# run rsnapshot
0 0 * * *   root    /usr/bin/rsnapshot sync &>/dev/null
0 10 1 * *  root    /usr/bin/rsnapshot gamma &>/dev/null
0 11 * * 6  root    /usr/bin/rsnapshot beta &>/dev/null
0 12 * * *  root    /usr/bin/rsnapshot alpha &>/dev/null

Setting up snapshots for a remote node

Backup server configuration

Generate a ssh key for password-less access to the distant host on the backup server:

ssh-keygen -b 4096 -f /root/.ssh/backup.key

Add the key to be used for all clients:

/etc/rsnapshot.conf

rsync_long_args     --delete --numeric-ids --delete-excluded --rsh="ssh -i /root/.ssh/backup.key

Укажите ресурсы, для которых будет создаваться резервная копия:

/etc/rsnapshot.d/example.conf

backup  example.org::rootfs     example/rootfs/
backup  example.org::calculate  example/calculate/

где:

  • where example.org is the network name of the host,
  • rootfs, calculate - название ресурсов, которые будут описаны в конфигурационном файле rsyncd-клиента

Client configuration

Create a file on the remote computer to be snapshot, containing the description of the directories to be synchronized. Assign new names to them, rootfs and calculate:

/etc/rsyncd-backup.conf

uid = root
gid = root
read only = true

[rootfs]
    path = /

[calculate]
    path = /var/calculate

Copy the previously generated server public key to the remote host, adding rsync at the beginning of the line:

command="rsync --config=/etc/rsyncd-backup.conf --server --daemon .",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

You should obtain something like that:

/root/.ssh/authorized_keys

command="rsync --config=/etc/rsyncd-backup.conf --server --daemon .",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCohMEmkUVd72YI+gRXyCSL2YWQGg3tmy1SiKJ4i3enTpVf7oY+SDSk/WDJUkBisOh1VGWbtylCqez6K4/rkIxtQmog/L6KmnVEv/MKPXCfRb0SletaLLRhoLB9yjPJltzS+q/983yBIJKYO9jBJQbDYYdqPIuGidQ6xjX+OuJoCL/akKoaQxBm+92k+hp9Yi7RxGX12Y0WMD6XCZEZcktjGX/FyzIaRV9Ikt+0uHRZBo9lwEtEWEXY3coYauBr9A9XbtXPy4sGDXJsePKi7lxGi880IVgZgABMgPo9B8hVPVBplvKa5tUaj5C7s+lrZ0VI3Nr7i3c4cVwSnOcFlg9Z root@backup

Distributing nodes to different snapshot repositories

Если среди машин, для которых делаются резервные копии, есть такие, доступ к которым происходит по низкоскоростному каналу, то есть смысл разделить хранилище резервных копий на несколько.

Create an rsnapshot configuration file for local computers:

/etc/rsnapshot.local.conf

include_conf    `/bin/cat /etc/rsnapshot.conf`
snapshot_root   /var/calculate/snapshots/local
lockfile        /var/run/rsnapshot.local.pid
include_conf    `/bin/cat /etc/rsnapshot.d/local.*.zone`
include_conf    `/bin/cat /etc/rsnapshot.d/localhost.zone`

Important

Note that fields are Tab -spaced!

These settings refer to the common ones described in / etc / rsnapshot.conf , and replace the values for the lock file and the root of the snapshot storage volume. Из /etc/rsnapshot.d будут взяты все zone-файлы начинающиеся на local и localhost.zone.

Create a rsnapshot config file for remote hosts:

/etc/rsnapshot.remote.conf

include_conf    `/bin/cat /etc/rsnapshot.conf`
snapshot_root   /var/calculate/snapshots/remote
lockfile        /var/run/rsnapshot.remote.pid
include_conf    `/bin/cat /etc/rsnapshot.d/remote.*.zone`

В отличие от предыдущего файла настроек для резервных копий берутся только zone-файлы, начинающиеся на remote.

Local snapshots will be saved at /var/calculate/snapshots/local, and remote snapshots at /var/calculate/snapshots/remote

Укажите ресурсы, для которых будет создаваться резервная копия:

/etc/rsnapshot.conf.d/local.example.org.zone

backup  example.org::rootfs     example.org/rootfs/
backup  example.org::calculate  example.org/calculate/

/etc/rsnapshot.conf.d/remote.example.org.zone

backup  remote.example.org::rootfs      remote.example.org/rootfs/
backup  remote.example.org::calculate   remote.example.org/calculate/