Назад | Перейти на главную страницу

Делайте инкрементные резервные копии из Linux

Я хочу сделать инкрементные резервные копии на машине Linux следующим образом:

BACKUP1                BACKUP2
|                      |
|                      |
|--- file1             |--- file1 (symlink to file1 in backup1 because it hasn't changed)
|                      |
|                      |
|--- file2             |--- file2 (is copied again because it has changed)
|                      |
|                      |
|--- file3             |--- file 3 (same as file1, a symlink)

Есть какой-нибудь простой способ сделать это? Я использовал этот сценарий:

#!/bin/sh

date=`date "+%Y-%m-%dT%H:%M:%S"`
rsync -aP --link-dest=~/Backups/current ~/Documents ~/Backups/back-$date
rm -f ~/Backups/current
ln -s back-$date ~/Backups/current

Но это просто копирует все заново. Спасибо

Я использую для этого самописный сценарий bash с использованием rsync и cpio: http://pastebin.com/uRdH2uQf

Итак, первое, что я сделал, - это создал структуру каталогов. Я работаю так: создаю резервную копию каждый день, на 7-й день (воскресенье) я беру последнюю резервную копию (предыдущая неделя, воскресенье) и помещаю ее еженедельно. Каждые 4 недели я делаю ежемесячную резервную копию.

Все эти резервные копии являются инкрементными и основаны на 1 полной резервной копии.

моя структура каталогов основана в / mnt / backups и выглядит так:

--- SERVER1
   |--- daily
        |  --- 0
        |  --- 1
        |  --- 2
        |  --- 3
        |  --- 4
        |  --- 5
        |  --- 6
    |--- weekly
        |--- 0
        |--- 1
        |--- 2
        |--- 3
    |--- monthly
        |  --- 0
        |  --- 1
        |  --- 10
        |  --- 2
        |  --- 3
        |  --- 4
        |  --- 5
        |  --- 6
        |  --- 7
        |  --- 8
        |  --- 9

Я также использую скрипт для быстрого создания этой структуры: http://pastebin.com/LyFLBZGx

Итак, все мои скрипты находятся в / root / backup_tools. Сценарий backup.sh помещается в crontab и запускается каждый день. У меня есть обмен ключами с моего резервного сервера на все мои серверы, которые мне нужны для резервного копирования. В моем каталоге инструментов я помещаю свои файлы исключения (папки / файлы, которые я не хочу создавать) в этом формате:

rsync.exclude.server1

Эти файлы содержат директории, запрещающие резервное копирование:

/proc
/sys
/tmp

Я также использую свой файл /.ssh/config для добавления хостов (например, server1.example.com определяется как server1 с ssh-портом xxxx и именем пользователя foo). Это значительно упрощает добавление серверов для резервного копирования в первой строке сценария.

Host server1
        User root
        Port 31337
        Hostname server1.example.com

Сценарий проверит правило SERVERS = "" и для каждого сервера, определенного там (разделенного пространством), он запустит инкрементное резервное копирование (и исключая все каталоги в исключенных файлах).

Он будет использовать cpio для вращения каталогов (cpio позволяет копировать со ссылкой на фактический блок на диске, поэтому файл будет дважды отображаться на вашем жестком диске и использовать пространство только один раз. Это тоже не символическая ссылка, потому что при удалении исходного файла дубликат все равно будет доступен для чтения)

Надеюсь, это было несколько ясно. Скрипт bash не идеален, но он выполняет свою работу. Я использую его для резервного копирования 4 серверов каждую ночь. У меня есть резервные копии на пару месяцев, и они не большие. Это действительно экономия места.

Вы действительно хотите сделать это с помощью жестких ссылок. Лучший инструмент для создания таких резервных копий на машинах с Linux - это rsnapshot. Оно делает именно то, что вы описываете, и его довольно просто настроить.

В вашем примере вы упоминаете символические ссылки, однако rsync имеет дело с жесткими ссылками. Вы упоминаете в комментариях, что не знаете, что такое ссылки, поэтому версия Reader's Digest:

  • Символическая ссылка похожа на «ярлык» в Windows - она ​​просто говорит вам, что «нужный файл находится там».
  • Жесткая ссылка не имеет прямого отношения к Windows - по крайней мере, не часто используется. Жесткая ссылка - это буквально еще одна «точка входа» в тот же файл; файловой системе он кажется точной копией связанного файла, однако на физическом диске есть только один копия файла независимо от количества жестких ссылок.

Параметр rsync '--link-dest' создает жесткие ссылки для файлов, которые не изменяются. Это несколько сбивает с толку при попытке определить, работает ли ваш сценарий должным образом, потому что, если бы вы должны были проверить размер всех файлов в каталоге резервного копирования (например, используя du -sh [directory] или проверив свойства в графическом интерфейсе), он будет иметь тот же размер, что и ваш исходный каталог, независимо от того, сколько из этих файлов на самом деле являются жесткими ссылками и, следовательно, не занимают дополнительного места.

Проверьте место на диске, используя либо df или с помощью инструментов графического интерфейса, которые проверяют фактическое дисковое пространство. Затем запустите сценарий резервного копирования и проверьте еще раз - если файлы не изменились, использование диска не должно измениться вообще (ну, хорошо, немного - это занимает небольшой объем места для самой жесткой ссылки); если файлы изменились, использование диска увеличится на только какие файлы менялись.

В любом случае в выводе rsync будут перечислены файлы, которые он проверяет, независимо от того, копирует ли он их на самом деле или нет. Посмотрите в конце на значение «ускорения» - если это число меньше 1, это означает, что у вас есть по крайней мере несколько жестких ссылок, поскольку оно представляет собой процентное отличие от оценок rsync, которые потребовались бы для копирования всех файлы.