Rsync продолжает отключаться: сломанная труба


14

Я использую rsyncдля резервного копирования моего домашнего каталога. Это работало хорошо в течение долгого времени. Вот команда, которую я использую:

rsync \
    -pavz \
    --delete \
    --exclude 'mnt/' \
    --exclude '.cache/' \
    --exclude 'Videos/' \
    --exclude 'Music/' \
    --exclude 'Documents/virtualbox' \
    /home/"${USER}" "${server}":"${dir}" 2>> "${errorFile}"

Однако я переключил сервер, на который я rsyncвыполняю резервное копирование, и теперь запускается и работает в течение нескольких секунд (до нескольких минут), но затем останавливается с сообщением об ошибке

packet_write_wait: Connection to x.x.x.x: Broken pipe
rsync: [sender] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [sender=3.1.1]

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

Я использую kerberosдля аутентификации на удаленном сервере.

Я пробовал несколько комбинаций с ServerAliveInterval, ServerAliveCountMaxили ClientAliveIntervalпо моему ~/.ssh/config, но безрезультатно.

Возможно, на сервере работает что-то, что rsyncпо какой-то причине убивает команду, но я не знаю, как это расследовать. Есть идеи?


Может быть, я должен добавить, что я использую kerberosдля аутентификации на удаленном сервере.
pfnuesel

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

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

я вижу, что ошибка io заставляет задуматься, не заполнилась ли файловая система удаленной стороны?
Джефф Шаллер

1
@rubynorails Интересно. Кажется, это работает без проблем.
pfnuesel

Ответы:


6

Ваша проблема может быть (нехватка) памяти. Назад, когда 1 ГБ было большим для сервера, rsync потерпел бы неудачу для меня для больших наборов данных. Возможно, алгоритм улучшил объем памяти, но я не видел эту проблему в течение 8 лет или около того. Так что на самом деле, это внешний выстрел, но его стоит изучить. Попробуйте сначала меньшие наборы данных. Вы также можете попробовать - как форму проверки работоспособности - сделать tar-tar:

tar cf - $HOME | ssh ${server} tar xf -

Если это также не удается через несколько минут, это не память.


4

Я встречался с этим и rsyncв прошлом. Решение, которое исправило это для меня, состояло в том, чтобы запустить его из screenсеанса, что помогло поддерживать соединение с удаленным сервером.

screen -LS rsync
[execute your rsync command]
Ctrl-A+D to detach from the session

Вы можете проверить состояние, запустив screen -x rsync(или как вы решите назвать сеанс, если вы дадите ему имя, которое не требуется). Это повторно присоединит вашу текущую оболочку к этому сеансу. Просто не забудьте отсоединиться от него снова после того, как вы проверите состояние, чтобы он продолжал работать в фоновом режиме.

Вы также можете выполнить команду для запуска screenв фоновом режиме одним махом, выполнив [кто-то, пожалуйста, исправьте меня, если я ошибаюсь] screen -dm 'command'. Возможно, вы захотите, man screenпрежде чем пытаться последний.

РЕДАКТИРОВАТЬ:

Я редактирую свой ответ, потому что вы подтвердили, что он не screenоказывает никакой помощи в этом сценарии, но вы ответили на мой комментарий, предложив попробовать scpи посмотреть, какие результаты вы получите, на что вы ответили, что, как ни странно, все работало просто отлично.

Мой новый ответ таков: используйте scp- или sshtar) - вместоrsync

Конечно, scpне поддерживает огромное количество функций , как rsync, но вы на самом деле будете удивлены , чтобы обнаружить, сколько функций , которые он делает поддержку, которые почти идентичны , что и rsync.

Реальные сценарии для scpи другие альтернативы rsync:

Некоторое время назад мне было поручено создать сценарий оболочки, который будет извлекать журналы с наших производственных серверов и сохранять их локально на веб-сервере, чтобы разработчики могли обращаться к ним в целях устранения неполадок. После неудачной попытки заставить команду Unix установить rsyncна наших серверах, я нашел обходной путь, scpкоторый также сработал.

При этом я недавно изменил сценарий, чтобы все, что он использует, было sshи tar- GNU tar/ gtar, если быть точным. GNU tarподдерживает многие параметры, которые вы фактически найдете rsync, такие как --include, --excludeсохранение / сохранение атрибутов, сжатие и т. Д.

Теперь я выполняю это путем ssh-ing к удаленному серверу (через pubkey auth) и использую gtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]- это записывает всю информацию stdout, которая затем передается [локально], чтобы tar -xzfна удаленном производственном сервере не было внесено никаких изменений. и все файлы вытащены как есть на локальный сервер. Это отличная альтернатива rsyncв этом случае. Единственное, что важно, ни поддержка, tarни scpинкрементное резервное копирование, а также уровень проверки ошибок на уровне блоков rsync.

Полная команда, на которую я ссылаюсь при использовании , будет примерно такой (удаленный - это Solaris 10; локальный - это Debian, хотя sshи tarстоит):

cd /var/www/remotelogs
ssh -C user@remotehost "cd /path/to/remote/app.directories; gtar -czf - --include='*.log' --exclude='*.pid' --exlude='*core*' *" | tar -xz

В вашем сценарии это было бы наоборот - tar -cf -локально и по каналу к удаленному серверу ssh user@remotehost "tar -xf -"- есть другой ответ, который ссылается на этот тип поведения, но не вдавается в такие подробности.

Есть несколько других опций, которые я включил, чтобы ускорить процесс. Я неуклонно рассчитывал все, чтобы время выполнения было как можно меньше. Можно подумать, что использовать сжатие с помощью tarбудет бессмысленно, но на самом деле это немного ускоряет процесс, также как и использование -Cфлага sshдля включения sshсжатия. Я могу обновить этот пост позже, чтобы включить точную команду, которую я использую (которая очень похожа на ту, которую я опубликовал), но сейчас я не чувствую желания подключаться к VPN, поскольку на этой неделе я в отпуске.

В Solaris 10 я также использую -c blowfish, потому что это самый быстрый шифр для аутентификации, а также помогает ускорить процесс, но наш Solaris 11 либо не поддерживает его, либо этот набор шифров отключен.

Кроме того, если вы решите использовать параметр ssh/ tar, было бы неплохо реализовать мое первоначальное решение, screenесли вы делаете резервное копирование, которое займет некоторое время. Если нет, убедитесь, что ваши настройки keepalive / timeout настроены ssh_configправильно, иначе этот метод также может привести к поломке канала.

Даже если вы согласитесь scp, я всегда считаю, что это лучший метод для использования screenили tmuxпри выполнении операций такого рода, на всякий случай . Много раз я не следую своему собственному совету и не могу этого сделать, но действительно полезно использовать один из этих инструментов, чтобы гарантировать, что удаленное задание не испортится из-за того, что ваш активный сеанс оболочки каким-то образом отключился.

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


1
Я пробовал с screen, результат тот же.
pfnuesel

@pfnuesel - по крайней мере, приятно знать, что вы можете исключить это.
Rubynorails

3

У меня была такая же проблема на OSX El Capitan, и я исправил ее, обновив до rsync v3.11. Проблема произошла для меня на v2.6.9.


Я бегу rsync 3.1.1.
pfnuesel

Возможно, вы захотите убедиться, что на вашем маршрутизаторе не включена защита от переполнения пакетов (или любая другая подобная защита). Вы подключаетесь через какой-либо VPN?
Бруно

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

2

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

Вы тоже пытались использовать демон rsync?

Находятся ли ваши серверы в одной сети или между ними установлен межсетевой экран / маршрутизатор?

Вы можете попробовать установить сеанс netcat между серверами, это простой способ попробовать, если у вас есть какие-либо проблемы с соединением между вашими серверами.

На первом сервере:

nc -lk <port-number>

И на клиенте

nc <server> <port-number>

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


К сожалению, у меня нет корневого доступа на сервере. Это означает, что я не могу запустить демон rsync или сеанс netcat.
pfnuesel

@pfnusel вы можете запускать netcatна любом порту> 1024 без необходимости привилегий root
roaima

1

У вас есть что-то на удаленном сервере, который пишет в стандартный вывод . Это может быть в вашем .profileили .bash_profile. Это может быть что-то менее очевидное, как sttyили mesg. Если вы сомневаетесь, скопируйте стенограмму в свой вопрос о входе на сервер (обязательно отредактируйте имя хоста).


Я не понимаю Ни то, что идет не так, ни то, что я должен делать, чтобы выяснить, что пишет на stdout.
pfnuesel

@pfnuesel Если вы скопируете стенограмму входа в систему и разместите ее здесь, кто-то может увидеть, что случилось. Лучше, оставьте свой .profileили .bash_profileдля обзора. Вы ищете такие вещи, как mesgилиstty
roaima

Там нет mesgили sttyв любом из моих точечных файлов.
pfnuesel

@pfnuesel что-нибудь еще, что пишет в терминал во время входа в систему?
Ройма

Нет, но даже если я добавлю что-то, что пишет в стандартный вывод. Это ничего не меняет.
pfnuesel

1

единственный раз, когда у меня возникла такая проблема с rsync, я отследил ее до свободного порта Ethernet на другой машине, у которой был тот же IP-адрес, что и у моего целевого сервера. Если rsync ненадежен, это почти наверняка проблема с сетью или (в моем случае) проблема конфигурации


1

Я сталкивался с подобной проблемой при запуске rsyncили копировании больших файлов с рабочего стола Linux на Linux NAS с низким энергопотреблением на базе ARM через гигабитную кабельную сеть ( вручную или с помощью Gnome Nautilus cp, scpили в Gnome Nautilus) (нет kerberosв моей настройке). Диски NAS используются совместно sambaи монтируются на клиенте с помощью cifs. Решением для меня было смонтировать файловую систему NAS с клиента без кэширования (см. Также страницы руководства mount.cifs ):

sudo mount -t cifs //server.lan/somedir /mnt/somedir/ -o cache=none

Кроме того , при установке диска NAS на клиенте с помощью gvfsв nautilusэтой проблеме не будет сохраняться при копировании больших файлов (но не работает в сочетании с rsyncхотя).

Запись Linux в сетевую файловую систему одновременно с чтением с локального диска дополнительно объясняет причину возникновения этой проблемы.


0

Просто обновите ваши версии rsync, чтобы они были одинаковыми как на отправляющем, так и на принимающем ПК. Смотрите мой ответ здесь: /server/883487/unable-to-rsync-due-to-broken-pipe/988794#988794 .


1
Почему отрицательный голос? Может быть, это комментарий, а не ответ? Кто-нибудь? Кто-нибудь?
Габриэль Стейплз

1
Я больше не могу воспроизвести проблему, поскольку у меня больше нет доступа к этому серверу. Но это разумный ответ и не заслуживает отрицательного ответа.
pfnuesel
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.