Инкрементный Backup при подключении USB HDD
Дано: 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. Для верности можно добавить например iSeria. Значения 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&” работать не будет. К скрипту мы вернемся чуть позже. Создадим пока заглушку и дадим права на выполнение.
Сейчас закончим с монтированием. Чтобы устройство автоматически смонтировалось добавим строчку в /etc/fstab--/usr/local/bin/usb-backup-- #!/bin/bash
Это при условии, что файловая система у нас на винте ext3. Далее можно тестить. Отключаем винт. Сохраняем все конфиги. Делаем /etc/init.d/udev restart Подключаем винт. Смотрим. Должно было смонтироваться в /media/backup. Теперь настроим sbackup. Он есть в репозитарии поставить можно при помощи apt-get install sbackup В конфиге /etc/sbackup.conf достаточно информации по настройке. Важно указать ту же target директорию, что и в скриптах ниже. Далее возвращаемся к скрипту /usr/local/bin/usb-backup У него есть одна особенность. Пока он не выполнится монтирование дальше не пойдет. Поэтому применяем обходной маневр.--/etc/fstab/-- ... /dev/backup /media/backup ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0
Запускаем второй скрипт в фоне. Он то и будет делать всю работу.--/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
Вуаля. Мы получили автоматические инкрементные бэкапы при подключении нашего винта.