Я использую rsync с параметрами
-r for recursive
-l copy symlinks as symlinks
-t preserve modification time
-D preserve devices and specials
-v verbose
--prune-empty-dirs
Исходная файловая система - ext4, а конечная - XFS. Я скопировал несколько сотен папок размером от нескольких сотен гигабайт до нескольких ТБ, и все они находятся в пределах менее 1 ГБ. Однако эта конкретная папка имеет размер 264 ГБ в исходном коде, и после того, как я синхронизирую ее, она составляет 286 ГБ. Это огромная разница, и я не знаю, что в ней не так.
Если исходная файловая система ext4 имеет некоторые повреждения, возможно ли, что она не сообщает о правильном использовании диска? Я использую "дю-сч".
Я удалил все это и перезапустил 3 раза, и он дает те же результаты.
Столкнитесь с этой "проблемой" при использовании 'du -b -d0 source destination'
поскольку у меня был огромный список несоответствий, когда я углубился.
Проблема, казалось, в том, что du настаивает на сообщении об использовании диска каталогами и файлами, а мне нужен только размер файлов.
Таким образом, поскольку создание нескольких каталогов будет использовать больше байтов в одних файловых системах и меньше в других, вы получите разницу.
Решение состоит только в сравнении размеров реальных файлов, а не каталогов.
Следующая командная строка использует find для вывода только файлов в музыкальном каталоге, а затем использует du для подсчета количества байтов.
find music -type f -print0 |du --files0-from=- -cb
если кто-то опубликует сценарий sed, чтобы сделать то же самое, сделайте
Наиболее вероятная причина - жесткие ссылки. Rsync по умолчанию превращает 2 файла с жесткой связью в дубликаты файлов на целевой машине, занимая вдвое больше места на диске. Если вы хотите сохранить жесткие ссылки, добавьте -H/--hard-links
вариант.
Следующая наиболее вероятная проблема - разреженные файлы. Rsync по умолчанию не записывает какие-либо файлы как разреженные файлы, даже если они находятся в источнике (на самом деле он не может сказать). Если у вас есть разреженные файлы (чаще всего используемые как образы виртуальных машин и неполные загрузки p2p), то вы захотите использовать --sparse option
.
На странице часто задаваемых вопросов по rsync перечислены следующие причины: https://sanitarium.net/rsyncfaq/#differentsizes
Однако единственный способ узнать это - сравнить файлы.
Для небольшого количества файлов вы можете сделать diff -r /mnt/data /mnt/data-BACKUP
. Однако, если это остановится на полпути, его нельзя будет перезапустить с того места, где он остановился. Старые программы сравнения плохо обрабатывают двоичные файлы.
Для большого количества файлов рекомендую вычислять хеши всех файлов и искать отличия. Таким образом, если процесс остановится или прервется, вы сможете продолжить без особого труда.
См. Этот сценарий в качестве примера:
https://github.com/TomOnTime/tomutils/blob/master/bin/md5tree
md5tree /mnt/data >/var/tmp/list.orig
md5tree /mnt/data-BACKUP >/var/tmp/list.backup
# NOTE: For these next 2 lines TAB means press the TAB key.
sort -t'TAB' -k6 </var/tmp/list.backup >/var/tmp/list.backup.sorted
sort -t'TAB' -k6 </var/tmp/list.orig >/var/tmp/list.orig.sorted
diff /var/tmp/list.orig.sorted /var/tmp/list.backup.sorted
Одинаковы ли размеры блоков в обеих файловых системах?
Если вы действительно сомневаетесь в том, что файлы были повреждены, рассмотрите возможность использования параметра (медленно!) -C для rsync.