#rsync
Вопрос:
Я пытаюсь скопировать каталог, полный каталогов и небольших файлов, на новый сервер для переноса приложения. rsync всегда является моим основным инструментом для такого типа миграции, но на этот раз он работает не так, как ожидалось.
Каталог содержит 174 412 файлов и имеет размер 136 гр. Исходя из этого, я создал для них диск емкостью 256 г на новом сервере.
Проблема в том, что когда я синхронизировал файлы на новый сервер, в новом разделе не хватило места, прежде чем все файлы были скопированы.
Я провел несколько тестов с большим целевым диском на своей тестовой машине, и когда он закончится, общий размер нового диска составит 272 г
time sudo rsync -avh /mnt/dotcms/* /data2/
sent 291.61G bytes received 2.85M bytes 51.75M bytes/sec
total size is 291.52G speedup is 1.00
df -h /data2
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data2vg-data2lv 425G 272G 154G 64% /data2
Источник находится на NAS, а новая цель-файловая система XFS, поэтому сначала я подумал, что это может быть проблема с размером блока. Но затем я использовал команду cp, и она скопировала точно такой же размер.
time sudo cp -av /mnt/dotcms/* /data
df -h /data2
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data2vg-data2lv 425G 136G 290G 32% /data2
Почему rsync увеличивает используемое пространство?
Комментарии:
1. Добавьте опцию
--sparse
.2. @Cyrus разве это не отсрочит решение проблемы? Я бы предположил
-H
, что это тоже необходимо. Тим, попробуйfind /mnt/dotcms/. -type f -links 1 -ls
(GNUcp -av
сохраняет жесткие ссылки3. @jhnc: Чтобы сделать это как можно более правильным, многие варианты все еще отсутствуют. См.: Какие флаги использовать в rsync для достижения полной репликации?
4. @Cyrus определенно, но, вероятно, не причина этой конкретной проблемы.
Ответ №1:
Согласно документации, dotcms использует жесткие ссылки. Таким образом, вам нужно предоставить rsync -H
возможность сохранить их. Обратите внимание, что GNU cp -av
сохраняет жесткие ссылки, поэтому у него нет этой проблемы.
Другие параметры rsync, которые вы должны рассмотреть, включают:
-H
,--hard-links
: сохранение жестких ссылок-A
,--acls
: сохранение списков управления доступом (подразумевает —perms)-X
,--xattrs
: сохранение расширенных атрибутов-S
,--sparse
: превращает последовательности нулей в разреженные блоки--delete
: удаление посторонних файлов из файлов назначения
Это предполагает, что вы работаете от имени root и что в пункте назначения должны быть те же пользователи/группы, что и в источнике. Если пользователи и группы не совпадают, то использование альтернативной командной строки @Cyrus --numeric-id
может быть более подходящим.
Комментарии:
1. Я проверил с помощью just-sparse, и это не имело значения. Я повторю тест с дополнительными опциями-HAX. Обычно я использую —delete с дополнительными запусками, когда выполняю дельта-и окончательную синхронизацию. Копия занимает пару часов, поэтому я обновлю ее позже этим вечером.
2. Использование дополнительных опций выше решило проблему.
time sudo rsync -avh --sparse --hard-links --acls --xattrs /mnt/dotcms/* /data2/