Pull to refresh

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

Reading time 3 min
Views 5.2K
Наконец-то я нашел время заняться свежеприехавшей железкой — USB винт на 500Gb. Этот пост может быть полезен всем, кто задумывался о надежном и удобном бэкапе данных, требующем минимальных затрат усилий.
Итак приступим.


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

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

Инструменты:

  1. 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
    

    Вуаля. Мы получили автоматические инкрементные бэкапы при подключении нашего винта.
Tags:
Hubs:
+37
Comments 36
Comments Comments 36

Articles