URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8977
[ Назад ]

Исходное сообщение
"Синхронизация содержимого каталогов на баш"

Отправлено PavelR , 23-Дек-10 16:51 

Подскажите, как в скрипте на bash реализовать следующее:

Есть два дерева файлов.

В совпадающих подкаталогах дерева могут быть файлы, являющиеся друг другу хардлинками.

Необходимо, чтобы целевое дерево стало идентичным исходному ( были созданы недостающие каталоги, удалены лишние каталоги и их содержимое. Если в совпадающих подкаталогах есть файлы с совпадающими именами, то необходимо сравнить inode файлов, если они не равны, удалить несовпавший файл и сделать хардлинк.

В результате выполнения процедуры должны получить идентичные деревья каталогов,
аналогичные тому, что получается в результате

cp -lR /data/source/* "/data/target"

После чего на них натравится rsync с ключом --delete.

Задумка состоит в том, чтобы не удалять "лишние" (устаревшие) бэкапные копии, а готовить из них новую структуру каталогов для проведения rsync "завтра", экономя на операциях создания / удаления при _огромном_ количестве сравнительно редкоменяющихся файлов.

----------

В качестве альтернативы, можно рассмотреть вариант проведения этой операции на Perl.

---

//В конечном счете планируется реализовать "внятную" систему бэкапа, которая возьмет в себя лучшие фичи систем Dirvish и Bontmia, и сможет rsync-ом бэкапить lvm-тома как девайсы, lvm-тома как файловые системы, просто файловые системы, БД MySQL (методами mysqldump/lvm-snapshot-as-device/lvm-snapshot-as-files) / Postgresql.
В сочетании с разными плюшками хранилищ с дедупликацией - может получиться очень даже и прилично =)
Всем заинтересованным в системе бэкапа предлагаю поучаствовать. Две+ головы - однозначно лучше.


Содержание

Сообщения в этом обсуждении
"Синхронизация содержимого каталогов на баш"
Отправлено ACCA , 25-Дек-10 05:24 
> Задумка состоит в том, чтобы не удалять "лишние" (устаревшие) бэкапные копии, а
> готовить из них новую структуру каталогов для проведения rsync "завтра", экономя

1. Копируешь snapshot:


cp -al <previous snapshot> <new snapshot>

2. Проходишься по новой копии:

rsync -aEAX –delete-excluded –delete –chmod=Fa-w,D+w <current directory> <new snapshot>

Вообще там ещё пару телодвижений нужно сделать, чтобы было как в BackInTime: http://unspecified.wordpress.com/2010/05/19/how-backintime-w.../


"Синхронизация содержимого каталогов на баш"
Отправлено PavelR , 25-Дек-10 09:02 
>[оверквотинг удален]
>
 
> cp -al <previous snapshot> <new snapshot>
>

> 2. Проходишься по новой копии:
>
 
> rsync -aEAX –delete-excluded –delete –chmod=Fa-w,D+w <current directory>
> <new snapshot>
>

> Вообще там ещё пару телодвижений нужно сделать, чтобы было как в BackInTime:
> http://unspecified.wordpress.com/2010/05/19/how-backintime-w.../

ну копировать не надо, он уже будет существовать, этот каталог.

Блин, а rsync для этих целей я заюзать и не догадался.... Совсем не в ту сторону смотрел :-)
А решение-то на поверхности... Вот жеж...


"Синхронизация содержимого каталогов на баш"
Отправлено ACCA , 26-Дек-10 05:31 
> ну копировать не надо, он уже будет существовать, этот каталог.

Это не копирование, это создание хардлинков. Если будет существовать - нужно удалить. Ещё раз про алгоритм:

- создать хардлинки (cp -al)
- удалить линк на старую копию и сделать новую копию для новых файлов (rsync)

Подозреваю, что --link-dest есть не во всякой версии rsync.


"Синхронизация содержимого каталогов на баш"
Отправлено PavelR , 26-Дек-10 07:42 
>> ну копировать не надо, он уже будет существовать, этот каталог.
> Это не копирование, это создание хардлинков. Если будет существовать - нужно удалить.

Сам же пишешь "1. Копируешь snapshot: cp -al". Я прекрасно понимаю, что каталоги создаются, а файлы хардлинкуются.  Использую "терминологию исходного сообщения".
--
Ну когда-нибудь кто-нибудь начнет внимательно читать, то что пишут в задаваемый вопрос, и пытаться это хоть чуть-чуть обдумать ????

> Задумка состоит в том, чтобы не удалять "лишние" (устаревшие) бэкапные копии, а
> готовить из них новую структуру каталогов для проведения rsync "завтра", экономя
> время/операции записи

Так что я в курсе про
> - создать хардлинки (cp -al)
> - удалить линк на старую копию и сделать новую копию для новых
> файлов (rsync)
> Подозреваю, что --link-dest есть не во всякой версии rsync.

Надо будет проверить, и хотя мне один фиг надо будет делать собственный пакет с собственным rsync из-за --read-devices или как он там называется, для синхронизации содержимого блочного устройства в файл, но в любом случае, хочется достичь максимальной переносимости/работоспособности в любых окружениях.