Я хочу сделать инкрементные резервные копии на машине 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:
Параметр rsync '--link-dest' создает жесткие ссылки для файлов, которые не изменяются. Это несколько сбивает с толку при попытке определить, работает ли ваш сценарий должным образом, потому что, если бы вы должны были проверить размер всех файлов в каталоге резервного копирования (например, используя du -sh [directory]
или проверив свойства в графическом интерфейсе), он будет иметь тот же размер, что и ваш исходный каталог, независимо от того, сколько из этих файлов на самом деле являются жесткими ссылками и, следовательно, не занимают дополнительного места.
Проверьте место на диске, используя либо df
или с помощью инструментов графического интерфейса, которые проверяют фактическое дисковое пространство. Затем запустите сценарий резервного копирования и проверьте еще раз - если файлы не изменились, использование диска не должно измениться вообще (ну, хорошо, немного - это занимает небольшой объем места для самой жесткой ссылки); если файлы изменились, использование диска увеличится на только какие файлы менялись.
В любом случае в выводе rsync будут перечислены файлы, которые он проверяет, независимо от того, копирует ли он их на самом деле или нет. Посмотрите в конце на значение «ускорения» - если это число меньше 1, это означает, что у вас есть по крайней мере несколько жестких ссылок, поскольку оно представляет собой процентное отличие от оценок rsync, которые потребовались бы для копирования всех файлы.