Rsync --dry-run не показывает правильные отправленные байты

Самый портативный инструмент для того, что вы пытаетесь сделать, - это df . Не возитесь с / sys , что не гарантируется ни в одной системе, отличной от Linux. И не изобретайте велосипед. Именно для этого и предназначен df , и почему он указан в POSIX.

Конечно, все не так просто, и существуют различные реализации df , некоторые из которых имеют разные форматы. Однако добрые люди, которые пишут спецификации POSIX, по своей безграничной мудрости включили следующую опцию в спецификацию df :

 -P
    Produce output in the format described in the STDOUT section.

Итак, если вы всегда используете df -P ], который должен быть настолько портативным, насколько это возможно.При использовании этого флага любая POSIX-совместимая версия df (которая должна быть их всеми или как можно более близкими) будет производить вывод в соответствии со спецификацией ниже (взятой из POSIX df страница ):

Если указаны обе опции -k и -P, должна быть записана следующая строка заголовка (в локали POSIX):

«Файловая система 1024 -blocks Используемая доступная емкость, смонтированная на \ n "

Если параметр -P указан без параметра -k, должна быть записана следующая строка заголовка (в локали POSIX):

" Файловая система Используемая доступная емкость объемом 512 блоков, установленная на \ n "

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

Остающийся вывод с -P должен состоять из одной строки информации для каждой указанной файловой системы. Эти строки должны быть отформатированы как следующим образом:

"% s% d% d% d% d %%% s \ n",,, ,,,

В следующем списке все величины, выраженные в единицах размером 512 байт (1024 байта, если указан параметр -k), должны быть округлены до следующей единицы большего размера. Поля:

Имя файловой системы в формате, определяемом реализацией. Общий размер файловой системы в единицах по 512 байт. Точное значение этого рисунка определяется реализацией, но должно включать,, плюс любое пространство, зарезервированное системой, обычно не доступное для пользователя . Общий объем пространства, выделенного для существующих файлов в файловой системе, в единицах по 512 байт.Общий объем пространства, доступного в файловой системе для создания новых файлов непривилегированными пользователями, в единицах по 512 байт. Когда это число меньше или равно нулю, невозможно создать какие-либо новые файлы в файловой системе без предварительного удаления других, если только процесс не имеет соответствующих привилегии. Написанная цифра может быть меньше нуля . Процент обычно доступного пространства, который в настоящее время выделяется для всех файлов в файловой системе. Это должно быть вычислено с использованием дроби: / (+)

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

Каталог, ниже которого отображается иерархия файловой системы .

Вероятно, вам также следует использовать флаг -k , чтобы всегда выводить результаты в виде 1024-байтовых единиц вместо 512. Также вы можете установить LC_ALL = POSIX , чтобы убедитесь, что языковой стандарт не повлияет на вывод. Собирая все это вместе, получаем:

Объединяя это с ультрапортативным awk , вы можете сделать:

totalSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $2}')
usedSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $3}')
availableSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $4}')

2
15.05.2016, 15:03
1 ответ

В режиме - пробного запуска , rsync определяет, какие файлы необходимо передать, но на самом деле не передает их данные - потому что это, естественно, бесполезно . Это означает, что он не выполняет дельта-сопоставление - потому что это часть логики передачи данных.

Причина, по которой цифры отражают это ... ну ... код показывает фактическую статистику, а не некоторую "потенциальную" статистику.

Вот разница между rsync -avvv --log-file = rsync.log --no-all-file --stats doc doc2 для папки doc в ] rsync исходное дерево, между - пробным прогоном и нормальной синхронизацией (с удаленными отметками времени, различиями PID и статистикой кучи):

 delta-transmission enabled
 recv_generator(doc,1)
 recv_generator(doc,2)
+set modtime of doc to (1463404939) Mon May 16 16:22:19 2016
 recv_generator(doc/README-SGML,3)
 recv_generator(doc/profile.txt,4)
 recv_generator(doc/rsync.sgml,5)
 send_files(2, doc)
 cd+++++++++ doc/
 send_files(3, doc/README-SGML)
+send_files mapped doc/README-SGML of size 672
+calling match_sums doc/README-SGML
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/README-SGML
+sender finished doc/README-SGML
 send_files(4, doc/profile.txt)
+send_files mapped doc/profile.txt of size 1935
+calling match_sums doc/profile.txt
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/profile.txt
+sender finished doc/profile.txt
 send_files(5, doc/rsync.sgml)
+send_files mapped doc/rsync.sgml of size 11843
+calling match_sums doc/rsync.sgml
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/rsync.sgml
+sender finished doc/rsync.sgml
 recv_files(1) starting
 recv_files(doc)
 recv_files(doc/README-SGML)
+got file_sum
+set modtime of doc/.README-SGML.hkH0u5 to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.README-SGML.hkH0u5 to doc/README-SGML
 recv_files(doc/profile.txt)
+got file_sum
+set modtime of doc/.profile.txt.Wdf4x9 to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.profile.txt.Wdf4x9 to doc/profile.txt
 recv_files(doc/rsync.sgml)
+got file_sum
+set modtime of doc/.rsync.sgml.JSte5H to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.rsync.sgml.JSte5H to doc/rsync.sgml
 generate_files phase=1
+set modtime of doc to (1463404939) Mon May 16 16:22:19 2016
 send_files phase=1
 recv_files phase=1
 generate_files phase=2
 send_files phase=2
 send files finished
-total: matches=0  hash_hits=0  false_alarms=0 data=0
+total: matches=0  hash_hits=0  false_alarms=0 data=14450
 Number of files: 4 (reg: 3, dir: 1)
 Number of created files: 4 (reg: 3, dir: 1)
 Number of deleted files: 0
 Number of regular files transferred: 3
 Total file size: 14,450 bytes
 Total transferred file size: 14,450 bytes
-Literal data: 0 bytes
+Literal data: 14,450 bytes
 Matched data: 0 bytes
 File list size: 0
 File list generation time: 0.001 seconds
 File list transfer time: 0.000 seconds
-Total bytes sent: 153
-Total bytes received: 793
-sent 153 bytes  received 793 bytes  378.40 bytes/sec
-total size is 14,450  speedup is 15.27 (DRY RUN)
-[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0) (DRY RUN)
+Total bytes sent: 14,723
+Total bytes received: 1,435
+sent 14,723 bytes  received 1,435 bytes  4,616.57 bytes/sec
+total size is 14,450  speedup is 0.89
+[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0)

Ниже приводится разница между начальным пробным прогоном и пробный запуск после того, как я 1) сделал настоящую синхронизацию, 2) отредактировал один файл, rsync.sgml . Это показывает, что дельта-сопоставление не выполняется при пробном прогоне:

 received 3 names
 recv_file_list done
 get_local_name count=4 doc2
-created directory doc2
 delta-transmission enabled
 recv_generator(doc,1)
 recv_generator(doc,2)
 recv_generator(doc/README-SGML,3)
+doc/README-SGML is uptodate
 recv_generator(doc/profile.txt,4)
+doc/profile.txt is uptodate
 recv_generator(doc/rsync.sgml,5)
 send_files(2, doc)
<...>
 Number of files: 4 (reg: 3, dir: 1)
-Number of created files: 4 (reg: 3, dir: 1)
+Number of created files: 0
 Number of deleted files: 0
-Number of regular files transferred: 3
-Total file size: 14,450 bytes
-Total transferred file size: 14,450 bytes
+Number of regular files transferred: 1
+Total file size: 14,476 bytes
+Total transferred file size: 11,869 bytes
 Literal data: 0 bytes
 Matched data: 0 bytes
 File list size: 0
-File list generation time: 0.010 seconds
+File list generation time: 0.001 seconds
 File list transfer time: 0.000 seconds
-Total bytes sent: 153
-Total bytes received: 793
-sent 153 bytes  received 793 bytes  1,892.00 bytes/sec
-total size is 14,450  speedup is 15.27 (DRY RUN)
+Total bytes sent: 157
+Total bytes received: 830
+sent 157 bytes  received 830 bytes  658.00 bytes/sec
+total size is 14,476  speedup is 14.67 (DRY RUN)
 [sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0) (DRY RUN)

Теперь по поводу вашей задачи - проверить, достаточно ли места в месте назначения для реальной синхронизации.

Как видно из сравнения,

  • файлы копируются один за другим,
  • каждый файл записывается под временное имя, а затем перемещается поверх исходного

Итак, объем необходимого места место назначения:

  • сумма (max (existing_size, new_size) для всех файлов, которые будут синхронизированы) + max ((new_size) для всех файлов, которые будут синхронизированы)

Первый член - сценарий наихудшего случая для количества «окончательные» данные в любой момент, вторая - это место для временной копии.

Каждый размер файла может быть увеличен до кратного размера единицы хранения, чтобы учесть потраченное впустую пространство (если это применимо для целевой FS и общий ожидаемый объем достаточно высок, чтобы иметь значение).

2
27.01.2020, 22:11

Теги

Похожие вопросы