7

Я использую rsync для синхронизации двух папок

rsync -arzv --times --delete-after --relative -e ssh user@host:path/./media/ ~/path/

и это говорит, что все хорошо, но место назначения сообщает:

$ du -s path/media/
18335196    site_media/media/

и источник сообщает:

$ du -s path/media/
18473500        site_media/media/

Когда я углубляюсь в проблему, все файлы имеют одинаковый размер, но каталоги различаются по размеру. Зачем? Обе виртуальные машины работают под управлением Ubuntu, источник - 11.04, а пункт назначения - 12.04 LTS.

Я понимаю, почему они не складываются в одинаковые числа, я хотел бы понять, почему папки сообщают о разных размерах.

4 ответа4

4

Так как это две разные виртуальные машины, работающие под разными основными версиями Ubuntu, я подозреваю, что причиной является размер блока файловой системы. du сообщает, какая часть диска используется, а не сумма размеров файлов. Тонкое, но важное различие.

Если у вас есть файл размером 1 байт, а размер блока составляет 1 КБ, тогда du сообщит об использовании 1 КБ. Если размер блока составляет 4 КБ, он сообщит об использовании 4 КБ. Если этот файл имеет размер 1025B, то он сообщает о 2KB, используемых для размера блока 1KB, и 4KB для 4KB. И если файл имеет размер 4097 ББ, то он будет представлен как 5 КБ для блока размером 1 КБ и 8 КБ для блока размером 4 КБ.

Эта последовательность демонстрирует это поведение:

$ touch foo ; du -h foo
  0B    foo
$ echo -n 1 > foo ; du -h foo
4.0K    foo

Используйте эту команду, чтобы показать размер блока вашей файловой системы:

tune2fs -l /dev/sda1 | grep -i 'block size'

(Очевидно, замените /dev/sda1 на соответствующее блочное устройство.)

Если все по-другому, это ваше несоответствие.

Лучший способ проверить точность rsync - это хэшировать ваши файлы и сравнивать. Вот пример:

find path/media -exec openssl sha1 {} + | sort > ~/hashes

Затем diff файлы hashes .

2

Есть много источников различий при использовании du . Проверьте man для справки. Я столкнулся с такой проблемой на AIX тоже. В руководстве есть опция --apparent-size , которая хорошо описывает эти различия. Также обратите внимание на размер блока, для которого размер рассчитывается по du (по умолчанию 1024 байта, но может варьироваться в зависимости от системы). Вам придется справиться с этим с помощью команды, которая показывает точный размер файлов (ls или find), что я и использовал для решения этой проблемы.

1

Другая возможность заключается в том, что флаг rsync --archive не сохраняет жесткие ссылки по умолчанию. Если вы используете жесткие ссылки, то это может быть вашей проблемой.

0

Скорее всего, вы добавляете и удаляете файлы в своих каталогах в течение длительного времени. Пространство из несвязанных файлов в каталоге используется повторно, но, возможно, будущие дополнения не смогут использовать это свободное пространство напрямую.

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

Если вы выполните очень сложную калибровку каталогов, вы сможете уменьшить размеры каталогов в источнике; это будет выглядеть примерно так:

mkdir foo
mv media/* foo
rmdir media
mv foo media

Обратите внимание, что это не сэкономит места на диске достаточно, чтобы оно того стоило. Это просто забавная игрушка, если что ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .