Вы пишете первую программу на первой строке.
Вы пишете вторую программу на второй строке.
И Вы повторяетесь.
Я не использовал для этого никаких специализированных программ, но это довольно легко организовать и точно настроить с помощью комбинации cron, bash, tar (инкрементные дампы) и/или rsync. На мой взгляд, есть два оптимальных решения, и я использую оба или одно из них в зависимости от контекста. Я думаю, что первое решение будет более подходящим для вас, но я опишу оба здесь.
Инкрементные tar-архивы
Ядром этого решения является сценарий, который может выглядеть примерно так:
#!/bin/bash
# You will need to set the variables $EXCLUDE, $DATA and $BACKUPS
# as environment variables, in ~/.bashrc or somewhere.
OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE"
for d in `ls $DATA`; do
SNAPSHOT=$BACKUPS/$d.snar
if [ $1 == full ]; then
echo "Archiving $d (full)..."
rm -rvf $SNAPSHOT
ARCHIVE=$DATA/$d.`date --iso-8601`.full.tar.bz2
tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
fi
if [ $1 == increment ]; then
echo "Archiving data/$d (increment)..."
ARCHIVE=$DATA/$d.`date --iso-8601`.tar.bz2
tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
fi
done
Здесь предполагается, что в $DATA
есть подкаталоги, и резервное копирование каждого из них производится в отдельный архив. Если ваша настройка отличается, настройте сценарий.
Вы можете запланировать резервное копирование в crontab следующим образом:
# m h dom mon dow command
44 1 1 */2 * ~/bin/backup_data full > ~/backups/data/logs/`date --iso-8601`.full.log 2>&1
44 5 * * * ~/bin/backup_data increment > ~/backups/data/logs/`date --iso-8601`.log 2>&1
Как видите, в данном случае полная резервная копия создается раз в два месяца, а инкрементные резервные копии, начиная с этого полного дампа, создаются каждый день. Проблемы с инкрементными архивами в tar начинаются, когда вы теряете один файл или даже изменяете временную метку. Поэтому разумно время от времени создавать полный дамп.
Что касается синхронизации между машинами и удаления старых файлов, вам следует отделить эту задачу от самого резервного копирования, поскольку они действительно ортогональны. Конечно, для синхронизации используйте rsync, без опции --delete
, чтобы не потерять данные на большом внешнем диске. Поэтому ваша команда для этого может быть такой:
rsync -av /backups/data /mnt/external
если внешний диск смонтирован на ноутбуке. В противном случае вам нужно будет сделать это по сети следующим образом:
rsync -av /backups/data user@external:/backups/data
Если вы хотите очистить архивы старше 90 дней с вашего ноутбука, вы можете сделать это следующим образом:
find /path/to/files -type f -mtime +90 -delete
Опять же, внесите эти вещи в ваш кронтаб.
Инкрементное резервное копирование с помощью rsync
Вы можете использовать только rsync для инкрементного резервного копирования. Мне особенно нравится использовать для этого снимки с временной меткой и жесткие ссылки, и это всего лишь одна команда. Вот пример, близкий к тому, что я обычно использую:
rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/`date --iso-8601 -d "one day ago"` /data/ /backups/data/`date --iso-8601`/
который в основном создает жесткие ссылки на снимок предыдущего дня (тот, который задан --link-dest
) для файлов, которые не изменились. Если вы будете работать нерегулярно, вы можете использовать символическую ссылку, указывающую на последний снимок, и обновлять эту ссылку после резервного копирования, например, так:
rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/`date --iso-8601`/ && rm -rvf /backups/data/last && ln -vs /backups/data/`date --iso-8601`/ /backups/data/last
Кроме того, вам нужно будет организовать синхронизацию с внешним диском и удалить старые снимки. В целом это делается так же, как и в первом решении, которое я описал выше. Однако при rsyncing моментальных снимков между машинами обязательно используйте опции -H
, чтобы сохранить жесткие ссылки.
Резюме
По сравнению с решением, использующим tar
, второй вариант, на мой взгляд, несколько проще в управлении и имеет все файлы доступными в любое время. Использование архивов, с другой стороны, позволяет использовать сжатие, использует меньше inodes и имеет другие преимущества на несерверных машинах.
Опять же, по возможности делайте все это в crontab, чтобы не помнить об этом. Если ноутбук не включен постоянно, выберите время, когда он часто используется, и, возможно, делайте это несколько раз в день, чтобы хотя бы некоторые задания cron запускались. Еще лучше использовать что-то вроде anacron.
Вы также можете запустить сценарий резервного копирования вручную, и уточнить даты в именах файлов/каталогов, если вы хотите делать инкрементные копии более одного раза в день. Очевидно, вам нужно будет поиграть с этими решениями, чтобы они соответствовали вашему случаю использования.
Обновление: репозиторий с примером скрипта, который я использую: https://github.com/langner/backup.sh/blob/master/backup.sh