Что означает f +++++++++ в журналах rsync?

117

Я использую rsyncдля резервного копирования файлов моего сервера, и у меня есть два вопроса:

  1. В середине процесса мне нужно остановиться и начать rsyncснова.
    Начнется rsyncс того места, где остановился, или перезапустится сначала?

  2. В лог-файлах вижу "f+++++++++". Что это означает?

например:

2010/12/21 08:28:37 [4537] >f.st...... iddd/logs/website-production-access_log
2010/12/21 08:29:11 [4537] >f.st...... iddd/web/website/production/shared/log/production.log
2010/12/21 08:29:14 [4537] .d..t...... iddd/web/website/production/shared/sessions/
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.017a771cc19b18cd
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.01eade9d317ca79a
GodFather
источник

Ответы:

198

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

1 - Огромным преимуществом rsync является то, что после прерывания в следующий раз он продолжает работать плавно.

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

2 - Каждый символ представляет собой код, который можно перевести, если вы прочитаете раздел -i, --itemize-changesвman rsync

Расшифровка вашего примера файла журнала из вопроса:

> f.st ......

> - the item is received
f - it is a regular file
s - the file size is different
t - the time stamp is different

.d..t ......

. - the item is not being updated (though it might have attributes 
    that are being modified)
d - it is a directory
t - the time stamp is different

> f +++++++++

> - the item is received
f - a regular file
+++++++++ - this is a newly created item

Соответствующая часть справочной страницы rsync:

-i, --itemize-changes

Запрашивает простой подробный список изменений, которые вносятся в каждый файл, включая изменения атрибутов. Это в точности то же самое, что и указание --out-format = '% i% n% L'. Если вы повторите эту опцию, неизмененные файлы также будут выведены, но только если принимающий rsync имеет версию не ниже 2.6.7 (вы можете использовать -vv со старыми версиями rsync, но это также включает вывод других подробных сообщений- мудрецы).

Экранирование "% i" имеет загадочный вывод, состоящий из 11 букв. Общий формат похож на строку YXcstpoguax, где Y заменяется типом выполняемого обновления, X заменяется типом файла, а другие буквы представляют атрибуты, которые могут выводиться, если они изменяются.

Типы обновления, которые заменяют Y, следующие:

  • A <означает, что файл передается на удаленный хост (отправляется).
  • A >означает, что файл передается на локальный хост (получен).
  • A cозначает, что для элемента происходит локальное изменение / создание (например, создание каталога или изменение символической ссылки и т. Д.).
  • А hозначает , что элемент является жесткой ссылкой на другой элемент (требуется --hard-ссылки).
  • Значок .означает, что элемент не обновляется (хотя у него могут быть изменяемые атрибуты).
  • A *означает, что остальная часть области вывода содержит сообщение (например, «удаление»).

Типы файлов, которые заменяют X: fдля файла, a dдля каталога, an Lдля символической ссылки, a Dдля устройства и a Sдля специального файла (например, именованных сокетов и fifos).

Остальные буквы в приведенной выше строке - это фактические буквы, которые будут выводиться, если соответствующий атрибут для элемента обновляется, или "." без изменений. Три исключения из этого: (1) вновь созданный элемент заменяет каждую букву на «+», (2) идентичный элемент заменяет точки пробелами и (3) неизвестный атрибут заменяет каждую букву на «?» (это может произойти при разговоре со старым rsync).

Атрибут, связанный с каждой буквой, выглядит следующим образом:

  • A cозначает, что либо у обычного файла другая контрольная сумма (требуется --checksum), либо что символическая ссылка, устройство или специальный файл имеют измененное значение. Обратите внимание, что если вы отправляете файлы в rsync до версии 3.0.1, этот флаг изменения будет присутствовать только для обычных файлов с разной контрольной суммой.
  • A sозначает, что размер обычного файла отличается и будет обновляться при передаче файла.
  • A tозначает, что время модификации другое и обновляется до значения отправителя (требуется --times). Альтернативное значение T означает, что время модификации будет установлено равным времени передачи, что происходит, когда файл / символическая ссылка / устройство обновляется без --times и когда символическая ссылка изменяется и получатель не может установить свое время. (Примечание: при использовании клиента rsync 3.0.0 вы можете увидеть флаг s в сочетании с t вместо правильного флага T для этого сбоя установки времени.)
  • A pозначает, что разрешения различны и обновляются до значения отправителя (требуется --perms).
  • An oозначает , что владелец отличается и обновляется на значение отправителя (требует --owner и привилегии супер-пользователя).
  • A gозначает, что группа отличается и обновляется до значения отправителя (требуется --group и полномочия для установки группы).
  • uСлот зарезервирован для использования в будущем.
  • Это aозначает, что информация ACL изменилась.
  • Значок xозначает, что изменилась расширенная информация об атрибутах.

Возможен еще один вывод: при удалении файлов "% i" будет выводить строку "* deleting" для каждого удаляемого элемента (при условии, что вы разговариваете с достаточно свежим rsync, чтобы он регистрировал удаления, а не выводил их как подробное сообщение).

мит
источник
Этот пост / ответ сейчас очень старый, но мне пришлось написать об этом комментарий. Это один из лучших ответов, которые я когда-либо видел о rsync. Thanks mit
Хорхе
102

Некоторое время назад мне нужно было понять rsyncвывод сценария, который я писал. В процессе написания этого сценария я поискал в Google и пришел к тому, что @mit написал выше . Я использовал эту информацию, а также документацию из других источников, чтобы создать свой собственный учебник по битовым флагам и о том, как получить rsyncвыходные битовые флаги для всех действий (по умолчанию этого не происходит).

Я публикую эту информацию здесь в надежде, что она поможет другим, кто (как и я) наткнуться на эту страницу через поиск и нуждается в более подробном объяснении rsync.

При комбинации --itemize-changesфлага и с -vvvфлагом, rsyncдает подробный вывод всех изменений файловой системы , которые были определены в исходном каталоге, по сравнению с целевым каталогом. Битовые флаги, созданные с rsyncпомощью, затем можно декодировать, чтобы определить, что изменилось. Чтобы расшифровать значение каждого бита, используйте следующую таблицу.

Объяснение каждой битовой позиции и значения в rsyncвыводе:

YXcstpoguax  path/to/file
|||||||||||
||||||||||╰- x: The extended attribute information changed
|||||||||╰-- a: The ACL information changed
||||||||╰--- u: The u slot is reserved for future use
|||||||╰---- g: Group is different
||||||╰----- o: Owner is different
|||||╰------ p: Permission are different
||||╰------- t: Modification time is different
|||╰-------- s: Size is different
||╰--------- c: Different checksum (for regular files), or
||              changed value (for symlinks, devices, and special files)
|╰---------- the file type:
|            f: for a file,
|            d: for a directory,
|            L: for a symlink,
|            D: for a device,
|            S: for a special file (e.g. named sockets and fifos)
╰----------- the type of update being done::
             <: file is being transferred to the remote host (sent)
             >: file is being transferred to the local host (received)
             c: local change/creation for the item, such as:
                - the creation of a directory
                - the changing of a symlink,
                - etc.
             h: the item is a hard link to another item (requires 
                --hard-links).
             .: the item is not being updated (though it might have
                attributes that are being modified)
             *: means that the rest of the itemized-output area contains
                a message (e.g. "deleting")

Некоторые примеры вывода rsync для различных сценариев:

>f+++++++++ some/dir/new-file.txt
.f....og..x some/dir/existing-file-with-changed-owner-and-group.txt
.f........x some/dir/existing-file-with-changed-unnamed-attribute.txt
>f...p....x some/dir/existing-file-with-changed-permissions.txt
>f..t..g..x some/dir/existing-file-with-changed-time-and-group.txt
>f.s......x some/dir/existing-file-with-changed-size.txt
>f.st.....x some/dir/existing-file-with-changed-size-and-time-stamp.txt 
cd+++++++++ some/dir/new-directory/
.d....og... some/dir/existing-directory-with-changed-owner-and-group/
.d..t...... some/dir/existing-directory-with-different-time-stamp/

rsyncВывод захвата (сфокусированный на битовых флагах):

В моих экспериментах, как --itemize-changesфлаг и-vvv флаг необходимы , чтобы получить rsyncна выход запись для всех изменений в файловой системе. Без -vvvфлага triple verbose ( ) я не видел в списке изменений каталогов, ссылок и устройств. Стоит поэкспериментировать с вашей версией rsync, чтобы убедиться, что она соблюдает и отмечает все, что вы ожидали.

Одним из удобных способов использования этого метода является добавление --dry-runфлага к команде и сбор списка изменений, определенного rsync, в переменную (без внесения каких-либо изменений), чтобы вы могли самостоятельно выполнить некоторую обработку списка. Что-то вроде следующего будет фиксировать вывод в переменной:

file_system_changes=$(rsync --archive --acls --xattrs \
    --checksum --dry-run \
    --itemize-changes -vvv \
    "/some/source-path/" \
    "/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')

В приведенном выше примере вывод (stdout) rsyncперенаправляется на grep(через stdin), поэтому мы можем изолировать только строки, содержащие битовые флаги.

Обработка захваченного вывода:

Затем содержимое переменной можно регистрировать для дальнейшего использования или сразу же перебирать для интересующих элементов. Я использую эту точную тактику в сценарии, который написал во время исследования rsync. Вы можете посмотреть в скрипте ( https://github.com/jmmitchell/movestough ) примеры пост-обработки захваченного вывода для изоляции новых файлов, дубликатов файлов (то же имя, то же содержимое), конфликтов файлов (то же имя, разные content), а также изменения в структуре подкаталогов.

Джон Марк Митчелл
источник
1
очень полезно! что такое -T в выводе журнала?
Pol Hallen
Пол, вы спрашиваете о флаге -T для rsync?
Джон Марк Митчелл
Pol, если я правильно понимаю ваш вопрос, t в журнале rsync означает, что два сравниваемых файла имеют разные временные метки. Это означает, что они были созданы или изменены в разное время.
Джон Марк Митчелл
3
Я считаю, что "T" в выводе означает, что время было обновлено до текущего времени, "<f..T ...... Rise.mp3". По крайней мере, это то, что я наблюдаю. "t" будет временем локального файла.
К. Келли
1
Я опаздываю на пару лет, но «t» и «T» объясняются на странице руководства: «t» означает, что время модификации отличается и обновляется до значения отправителя (требуется --times). Альтернативное значение T означает, что время модификации будет установлено равным времени передачи, что происходит, когда файл / символическая ссылка / устройство обновляется без --times и когда символическая ссылка изменяется и получатель не может установить свое время. (Примечание: при использовании клиента rsync 3.0.0 вы можете увидеть флаг s в сочетании с t вместо правильного флага T для этой ошибки установки времени.)
user187557
2

1) Wodin, это не совсем так. Если используется тег --partial или -P (такой же, как --partial --progress), rsync возобновляет прерванные передачи.

2) Точно, это обычный вывод для тега --itemize-changes.

Жоао Фигейредо
источник
2

1.) Он «перезапустит синхронизацию», но не будет передавать файлы с одинаковым размером и отметкой времени и т. Д. Сначала он создает список файлов для передачи, и на этом этапе он увидит, что он уже передал некоторые файлы. и пропустит их. Вы должны указать rsync, чтобы он сохранял отметки времени и т. Д. (Например, используя rsync -a ...)

Пока rsync передает файл, он будет называть его как-то вроде .filename.XYZABCвместо filename. Затем, когда он завершит передачу этого файла, он переименует его. Итак, если вы отключите rsync во время передачи большого файла, вам придется использовать параметр --partial, чтобы продолжить передачу, а не начинать с нуля.

2.) Я не знаю, что это такое. Вы можете вставить несколько примеров?

РЕДАКТИРОВАТЬ: согласно http://ubuntuforums.org/showthread.php?t=1342171 эти коды определены на странице руководства rsync в разделе для -i, --itemize-changesпараметра.

Исправлена ​​часть, если мой ответ основан на Жоао

Водин
источник
Я привел несколько примеров логов выше. Спасибо.
GodFather
Я обновил свой ответ. Коды объяснены на странице руководства.
Wodin