Последнее время стали популярны посты на тему бекапа. Продолжу и я эстафету под девизом «Много бекапов хороших и разных».

Статья 1 и статья 2, натолкнувшие меня на эту идею.

Сам я давно пользуюсь rsnapshot для бекапа серверов, да и не только. Для тех, кто не в курсе, что оно такое — это базирующаяся на rsync утилита на Perl для создания резервных копий. Особенностью является ориентация на создание полных снапшотов файлов��й системы через заданный интервал времени, для экономии места на диске, не изменившиеся с момента первого бэкапа файлы линкуются как hard link.

Я работаю на Ubuntu 11.10 на ноутбуке и потому статья будет описывать метод бекапа этого самого ноутбука на внешний USB HDD, который не постоянно подключен, а подключается лишь периодически. В момент подключения и будет запускаться скрипт для бекапирования системы.

Итак, начнем. Для начала подготовим внешний винт для создания на нем бекапов. Запускаем

$ sudo tail -f /var/log/syslog | grep "[sd"

и подключаем винт по USB. Главное — понять каким устройством подключился наш диск, в моем случае — sdb. На этом винте можно использовать любую линуксовую файловую систему. Я использую по старой привычке ext3:

$ sudo umount /dev/sdb1
$ sudo mkfs.ext3 /dev/sdb1
$ sudo lsusb -v


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

Bus 001 Device 004: ID 04fc:0c25 Sunplus Technology Co., Ltd SATALink SPIF225A
Device Descriptor:

idVendor 0xYYYY Sunplus Technology Co., Ltd
idProduct 0xXXXX SATALink SPIF225A
...


Эти «XXXX» и «YYYY» нам надо где-то записать или запомнить. Теперь винт можно отключить, пока мы подготовим конфиги rsnapshot для работы. Для начала устанвливаем его:

$ sudo apt-get install rsnapshot

Теперь настраиваем конфиг:

$ sudo nano /etc/rsnapshot.conf

Меняем snapshot_root на /media/backup и указываем количество бекапов в строке daily. Что мы хотим бекапить, указываем строками вида:

backup /home/user/Sync localhost/
backup /home/user/Картинки localhost/
backup /home/user/Картинки_RAW localhost/
backup /home/user/Видео localhost/


Если необходимо на этот же винт бекапить и данные с удаленных серверов, то рекомендую ознакомиться со статьей Kolger. Мне это не требуется, и я этого у себя не настраивал.

Остается автоматизировать запуск rsnapshot при подключении HDD.

Создаем файл /etc/udev/rules.d/94-usb-backup.rules с содержимым:

--/etc/udev/rules.d/94-usb-backup.rules--
SUBSYSTEM=="block", ENV{DEVTYPE}=="partition", SYSFS{idProduct}=="XXXX", SYSFS{idVendor}=="YYYY", SYMLINK+="backup", RUN+="/usr/local/bin/usb-backup.sh"


Вот тут нам и нужны те цифро-буквы «XXXX» и «YYYY». Вписываем то, что соответствует нашему HDD и рестартуем udev:

$ sudo service udev restart

Более подробно настройка udev рассмотрена по этой ссылке.

Осталось подготовить скрипт /user/local/bin/usb-backup.sh:

#!/bin/bash

export XAUTHORITY=/home/user/.Xauthority
export DISPLAY=:0.0
timeout=5000

notify-send -i /usr/share/pixmaps/usbhdd.png -t $timeout Backup "Found backup device"

### Монтируем устройство
mkdir /media/backup
mount -t ext3 /dev/backup /media/backup
chmod 777 /media/backup

### Проверяем на наличие свежего бекапа
DATE=`date +%Y-%m-%d`
OLDDATE=`ls -l --time-style=+%Y-%m-%d /media/backup | grep daily.0 | awk '{print $6}'`

if [[ "$DATE" == "$OLDDATE" ]]; then
    notify-send -t $timeout -i /usr/share/pixmaps/usbhdd.png Backup "Backup alredy exists. Exiting." 

### Размонтируем устройство и выходим
    umount /media/backup
    rmdir /media/backup
    exit 1;
fi

### Создаем бекап
rsnapshot daily

### Unmounting device
umount /media/backup
rmdir /media/backup

notify-send -i /usr/share/pixmaps/usbhdd.png -t $timeout Backup "Backup finished"
exit 0


В первой строке скрипта «user» исправьте на свой логин в системе. Так же можно положить свою иконку на место /usr/share/pixmaps/usbhdd.png для более красивого сообщения.

При подключении устройства скрипт проверяет наличие сегодняшнего бекапа и если он есть, то просто выходит. Если его нет — создается новый снепшот указанных данных.

Надеюсь кому-то это будет полезно.