Наконец-то я нашел время заняться свежеприехавшей железкой — USB винт на 500Gb. Этот пост может быть полезен всем, кто задумывался о надежном и удобном бэкапе данных, требующем минимальных затрат усилий.
Итак приступим.
Дано: USB HDD, laptop with Ubuntu 7.10, lots of useful data :)
Хочется: Автоматический инкрементный бэкап, при подключении конкретного USB HDD, при условии, что со времени последнего бэкапа прошло не менее N-минут.
Инструменты:
Итак приступим.
Дано: USB HDD, laptop with Ubuntu 7.10, lots of useful data :)
Хочется: Автоматический инкрементный бэкап, при подключении конкретного USB HDD, при условии, что со времени последнего бэкапа прошло не менее N-минут.
Инструменты:
- sbackup — отличная софтинка на питоне, работает посредством rdiff-backup, умеет писать в локальные папки и в SSH сессию. Архивирует данные. Сохраняет список установленных пакетов.
udev rules file — тут мы хитро определяем и монтируем наш диск
some bash scripts — проверяем, а нужно ли нам бэкапиться
Приступим:
Перво-наперво нам нужно заставить udev определять наш конкретный винт. Сделать это очень просто. Создаем файл
/etc/udev/rules.d/94-usb-backup.rules Номер 94 выбран как 95-hal.rules -1. Это важно, т.к. лучше свершить наши черные дела до того как HAL опознает устройство.
--/etc/udev/rules.d/94-usb-backup.rules-- SUBSYSTEM=="block", ENV{DEVTYPE}=="partition", SYSFS{idProduct}=="2339", SYSFS{idVendor}=="152d", NAME="backup", RUN+="/usr/local/bin/usb-backup"
Далее нужно определиться по каким параметрам будем распознавать устройство. Если нужно бэкапиться только на конкретный определенный винт, то выбираем максимально уникальную совокупность параметров.Мне хватило пары idProduct и idVendor. Для верности можно добавить например iSerial (спасибо small_jam и spiritedflow за замечания). Значения idProduct и idVendor нужно узнавать для каждого конкретного устройства при помощи команды
$ lsusb –v
И получим что то в этом роде
... Bus 005 Device 089: ID 152d:2339 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x152d idProduct 0x2339 bcdDevice 1.00 iManufacturer 1 JMicron iProduct 2 USB to ATA/ATAPI Bridge iSerial 5 901EFFFFFFFF bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 ...
NAME=«backup» означает, что монтироваться будет наш винт в /dev/backup
RUN+="/usr/local/bin/usb-backup" — указываем какой скрипт выполнять при подключении. Важно! Тут пишем именно имя скрипта, а не команду, например если написать RUN+="/usr/local/bin/usb-backup&" работать не будет.
К скрипту мы вернемся чуть позже. Создадим пока заглушку и дадим права на выполнение.
--/usr/local/bin/usb-backup-- #!/bin/bash
Сейчас закончим с монтированием.
Чтобы устройство автоматически смонтировалось добавим строчку в /etc/fstab
--/etc/fstab/-- ... /dev/backup /media/backup ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0
Это при условии, что файловая система у нас на винте ext3.
Далее можно тестить. Отключаем винт. Сохраняем все конфиги. Делаем /etc/init.d/udev restart
Подключаем винт. Смотрим. Должно было смонтироваться в /media/backup.
Теперь настроим sbackup. Он есть в репозитарии поставить можно при помощи apt-get install sbackup
В конфиге /etc/sbackup.conf достаточно информации по настройке. Важно указать ту же target директорию, что и в скриптах ниже.
Далее возвращаемся к скрипту /usr/local/bin/usb-backup
У него есть одна особенность. Пока он не выполнится монтирование дальше не пойдет. Поэтому применяем обходной маневр.
--/usr/local/bin/usb-backup-- #!/bin/bash /usr/local/bin/usb-backup-script &
Запускаем второй скрипт в фоне. Он то и будет делать всю работу.
--/usr/local/bin/usb-backup-script-- #!/bin/bash BCPDIR=/media/backup/backup_storage/ #это директория с бекапами for i in `seq 1 10`; do if [ -e $BCPDIR ] # смотрим подмонтировалось ли? then # считаем файлы младше 180 минут не заходя в директории if [ ` find $BCPDIR -maxdepth 1 -mmin -180 | grep -v ^$BCPDIR$ | grep . -c` -eq 0 ]; then sbackupd # запускаем бэкап fi break # циклиться теперь не нужно fi sleep 1 # ждем секудну, пока подмонтируется (у меня обычно пара секунд) done
Вуаля. Мы получили автоматические инкрементные бэкапы при подключении нашего винта.