Инкрементный Backup при подключении USB HDD

Дано: USB HDD, laptop with Ubuntu 7.10, lots of useful data :)

Хочется: Автоматический инкрементный бэкап, при подключении конкретного USB HDD, при условии, что со времени последнего бэкапа прошло не менее N-минут. Инструменты:

  1. sbackup - отличная софтинка на питоне, работает посредством rdiff-backup, умеет писать в локальные папки и в SSH сессию. Архивирует данные. Сохраняет список установленных пакетов.
  2. udev rules file - тут мы хитро определяем и монтируем наш диск
  3. 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&” работать не будет. К скрипту мы вернемся чуть позже. Создадим пока заглушку и дадим права на выполнение.
--/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
Вуаля. Мы получили автоматические инкрементные бэкапы при подключении нашего винта.