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 змушує мене замислитися, чи заповнена файлова система віддалених сторін?
Jeff Schaller

1
@rubynorails Цікаво. Це, здається, працює без проблем.
pfnuesel

Відповіді:


6

Вашою проблемою може бути (відсутність) пам'яті. Коли колись 1 ГБ для сервера було великим, для великих наборів даних rsync не вдасться. Можливо, алгоритм покращився, об'єм пам'яті збільшився, але я не бачив цієї проблеми протягом 8 років. Тож справді, це зовнішній вистріл, але його варто вивчити. Спробуйте спочатку менші набори даних Ви також можете спробувати - як бланк для перевірки стану здоров'я - зробити смола:

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досягаю шляхом приєднання до віддаленого сервера (через pubkey auth) та використання gtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]- це записує всю інформацію до того stdout, що потім [локально] передається, щоб tar -xzfна віддаленому сервері виробництва не було внесено змін , і всі файли, переведені як є на локальний сервер. Це чудова альтернатива rsyncв цьому випадку. Єдине, що важливо, tarані scpпідтримка - це додаткові резервні копії та рівень перевірки помилок на рівні блоку rsync.

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

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якщо ви робите резервну копію, яка займе деякий час. Якщо ні, то переконайтеся, що ваші налаштування збереження / тайм-аут у вашому режимі 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

У вас є щось на віддаленому сервері, що пише в stdout . Це може бути у вашому .profileабо .bash_profile. Це може бути щось менш очевидне, як sttyабо mesg. Якщо ви сумніваєтесь, скопіюйте стенограму у своє запитання про вхід на сервер (відредагуйте ім'я хоста всіма способами).


Я не розумію. Ні те, що йде не так, ні те, що я повинен зробити, щоб з’ясувати, що пише на stdout.
pfnuesel

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

Там немає mesgні sttyв одному з моїх складають приховані.
pfnuesel

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

Ні, але навіть якщо я додаю щось, що пише в stdout. Це нічого не змінює.
pfnuesel

1

Єдиний раз, коли у мене виникла така проблема з rsync, я відстежив її до запасного порту Ethernet на іншій машині, яка мала ту саму IP-адресу, що і мій цільовий сервер. Якщо rsync лускатий, це майже напевно проблема з надійністю мережі або (у моєму випадку) конфігурацією.


1

Я зіткнувся з аналогічною проблемою при запуску rsyncабо вручну (або cp, scpабо в Gnome Nautilus) копіювання великих файлів з робочого столу Linux на малопотужних ARM на базі Linux NAS через гігабітний телеграфував мережі (Не kerberosв моїй установці). NAS-накопичувачі спільно використовуються sambaта встановлюються на клієнті за допомогою cifs. Для мене рішенням було встановити файлову систему NAS від клієнта без кешування (див. Також man.cifs man pages):

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.