Я пытаюсь настроить сценарий резервного копирования на Ubuntu. Каждый день я хочу скопировать локальный исходный каталог в резервный каталог на удаленном сервере с уникальным именем и датой. (например, backup-jan1 /, backup-jan2 / и т. д.) Он должен хранить зеркало самого раннего состояния и использовать файлы различий для воссоздания новых точек резервного копирования.
Это довольно просто с rsync. Я уже настроил скрипт, который сделает резервную копию, назовет каталог резервной копии с текущим днем и создаст символическую ссылку на самую последнюю резервную копию (IP был отредактирован):
date=`date "+%m%d"`
rsync -ave ssh /srv root@150.69.32.8:/backup/backup-$date/
ssh root@150.69.32.8 rm -rf /backup/current
ssh root@150.69.32.8 ln -s backup-$date/ /backup/current
Однако вот сложная часть: Я не хочу, чтобы он копировал файлы, которые не изменились. Таким образом, если какие-либо файлы изменились с момента последнего ежедневного резервного копирования, он скопирует их, как обычно. В противном случае, он создаст символическую ссылку на неизмененные ранее скопированные файлы из их первого каталога резервных копий в новую резервную копию. (Вроде как мерзавец)
Так, например, я запускаю резервное копирование 1 января. Каталог backup-jan1 / будет содержать все исходные файлы резервных копий. На следующий день резервная копия от 2 января должна скопировать только файлы, измененные за эти 24 часа. Для всех остальных файлов будут созданы символические ссылки из файлов резервных копий 1 января. 3 января я добавил один файл и удалил другой. Если файл удален, он не должен иметь символическую ссылку.
Пример структуры каталога / файла:
backup-jan1/ (initial backup)
file_a
file_b
backup-jan2/ (no changes)
file_a (symlink to ../backup-jan1/file_a)
file_b (symlink to ../backup-jan1/file_b)
backup-jan3/ (removed file_a symlink and added file_c)
file_b (symlink to ../backup-jan1/file_b)
file_c
...
Я попытался найти эту функциональность с контролем версий в rsync и rsnapshot, но пока не нашел. Может ли кто-нибудь предложить такую стратегию резервного копирования?
Кажется, вы ищете --link-dest
функциональность, которая является частью rsync. Кажется, вы описываете именно то, как грязный работает.
Параметр link-dest создает жесткие ссылки из целевого пути на другую копию структуры.
С помощью dirvish вы выполняете начальное резервное копирование, которое просто использует rsync.
После этого каждая дополнительная резервная копия жестко привязана к предыдущей успешной резервной копии. Это означает отсутствие дублирования файлов. Вы можете получить прямой доступ к любой отдельной резервной копии из хранилища, и каждая резервная копия является полной и полной резервной копией. Вы можете удалить предыдущие резервные копии в любое время.
Вот сценарий, который вы можете использовать для демонстрации.
# create test area
mkdir -p /tmp/backuptest/{source,dest1,dest2,dest3}
for a in `seq 10` ; do dd if=/dev/urandom of=/tmp/backuptest/source/file$a bs=1M count=1; done
# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
# initial backup
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest1/
# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
# make chagnes
rm /tmp/backuptest/source/file[2-4]
cat /tmp/backuptest/source/file[6-7] >/tmp/backuptest/source/file11
# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest2/ --link-dest=/tmp/backuptest/dest1/
# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
# make changes
rm /tmp/backuptest/source/file5
cat /tmp/backuptest/source/file[5-7] >/tmp/backuptest/source/file12
# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest3/ --link-dest=/tmp/backuptest/dest2/
# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
# remove dest1
rm -r /tmp/backuptest/dest1/
# see your dest2, and dest3 are still complete backups for the state at those times.
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
Вы можете использовать «cp» с опцией «-l» для копирования как жестких ссылок. Если все ваши источник и место назначения находятся в одной файловой системе, это будет очень быстро.
Итак, ваш исходный каталог - «backup-jan1», а следующий - «backup-jan2». В этом случае выполните:
cp -al backup-jan1 backup-jan2
Затем запустите rsync для резервного копирования-jan2. Когда rsync обнаруживает измененный файл, он разрывает связь с исходным файлом в backup-jan1 и создает новый файл (с тем же именем) в backup-jan2.
На следующий день вы сделаете:
cp -al backup-jan2 backup-jan3
с вашим rsync для резервного копирования-jan3. Опять же, новые файлы в резервной копии приведут к отключению резервной копии-jan3 и т. Д.
В этом случае, если у вас есть 3 файла в резервной копии-jan1, при этом file1 остается неизменным в течение всех трех дней, file2 изменяется только на jan2, а file3 меняется каждый день, тогда у вас будет file1 как один и тот же жестко связанный для всех три каталога, file2 как два файла (один в backup-jan1 и один в backup-jan2 и backup-jan3, которые жестко связаны), и file3 как три файла в каждом каталоге.