rsync - что означает f +++++++++ в журналах rsync? - PullRequest
89 голосов
/ 20 декабря 2010

Я использую 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

Ответы [ 4 ]

159 голосов
/ 20 августа 2012

Давайте посмотрим, как работает 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

> е +++++++++

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

Типы файлов, которые заменяют X: f для файла, d для каталога, L для символической ссылки, D для устройства и 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).
  • o означает, что владелец другой и обновляется до значения отправителя (требуются привилегии --owner и super-user).
  • A g означает, что группа отличается и обновляется до значения отправителя (требуется --group и полномочия для установки группы).
  • Слот u зарезервирован для использования в будущем.
  • a означает, что информация ACL изменилась.
  • x означает, что информация расширенного атрибута изменилась.

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

77 голосов
/ 26 апреля 2016

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

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

С комбинацией --itemize-changesflag и флаг -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) флага я не видел в списке изменений каталога, ссылки и устройства.Стоит поэкспериментировать с вашей версией 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) для примеров последующей обработки захваченного вывода для изоляции новых файлов, дубликатов файлов (с одинаковым именем, одинаковым содержимым), столкновений файлов (с тем же именем, различным содержимым), а также сизменения в подкаталогах.

2 голосов
/ 18 января 2011

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

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

1 голос
/ 21 декабря 2010

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

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

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

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

Исправлена ​​ошибка, из-за которой мой ответ основывался на ответе Джоао

.
...