Linux: кріплення CIFS / Samba висить кілька хвилин


26

У мене невелика локальна мережа, в якій є коробка Gentoo та вікно Windows. Я монтую папку, що виникає у вікні Windows, на поле Gentoo з такою командою, як:

mount -t cifs -o username=WindowsUsername,password=thepassword,uid=pistos //192.168.0.103/Users /mnt/windowsbox

Більшість часу все просто працює, і я можу читати і писати без проблем. Однак кожні кілька тижнів або близько того, здається, що з'єднання або точка монтажу перестають зависати або зависати, так що будь-який процес, який намагається отримати доступ до точки монтажу, застрягає в стані D (диск або очікування вводу / виводу). Ці процеси стають непроникними для сигналів TERM і KILL. Відключення та підключення вікна Windows від мережі не допомагає. Заморожений стан триває 5+ хвилин. Це насправді засмучує і перешкоджає нормальній роботі, тому що воно зависає діалогами, lsкомандами Save As та Save. Якщо я випускаю a umountна точку монтажу, він також зависає, або повідомляє, що використовується точка монтування. Врешті-решт мертвий стан вирішується сам, і точка монтажу стає відключеною, або це стає можливим umountбез затримки.

Я здогадуюсь, що це відбувається, коли з'єднання / кріплення не працює, або коли машина Windows не працює. Я не дуже впевнений.

Чому це відбувається, і що я можу зробити, щоб це запобігти? Або як я можу успішно вбити ці процеси D-стану за власним бажанням?

Можливо, пов’язані з цим: кріплення CIFS зависають при прочитанні


1
Чи використовуються між двома машинами брандмауери?
Schrute

@Schrute: Я припускаю, що за замовчуванням є Linux (iptables?), А Windows працює. Ви думаєте, що міжмережеві стіни призупиняють з'єднання? Я ніколи не чув про таке.
Пістос

Я думаю, це може бути проблемою вікна linux. Я бачив подібну проблему - не з cifs та Windows - а з встановленою часткою nfs. Збереження було неможливим - я думаю, через деякий процес зависання під час доступу до неіснуючого сервера nfs. Зазвичай це відбувається, коли сервер зазнав аварії.
cornelinux

1
Моя порада - встановити мережу захоплення кільцевим буфером на машині Linux (тобто tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap хост 192.168.0.103 - я б також запустив під екраном, щоб запобігти завершенню процесу при відключенні). Коли проблема виникає, зупиніть трасування через кілька секунд, і ви повинні принаймні мати змогу визначити, яка сторона викликає проблему при перегляді тракту пакету (тобто сервер припиняє відповідати, сеанс відключається тощо).
GeekyDeaks

1
@Pistos - Wireshark - твій друг! Сліди можуть виглядати заплутано, але проводка буде декодувати кадри на допомогу. Спочатку ви хочете усунути основи, як-от сервер чи клієнт, які припиняють сеанс (FIN-пакети), а потім перейти до інших, як-от сервер перестає реагувати і т. Д. Якщо у вас є час, на CIFS у 2013 році з’явилося відео з акули ( youtube.com/watch ? v = XbvFXSPig-w ), але це досить довго :)
GeekyDeaks

Відповіді:


11

Не впевнений, чому проблема виникає, але як вирішення проблеми ви намагалися щомісяця ставити щось на кшталт touch /mnt/windowsbox/keepalive.txtабо echo "I am still alive." >/mnt/windowsbox/keepalive.txtзапускатись через cron? Таким чином зв’язок повинен залишатися активним.


Гарна ідея. Я поставив це на місце і побачу, що станеться.
Пістос

2
Це, здається, вирішило проблему, я мушу зазначити.
Пістос

Чудово це чути!
Janne Pikkarainen

1
Відповідно до відповіді @ Пата, можна було коментувати це від серцебиття щохвилини до серцебиття кожні 5 хвилин (300 секунд), що було б */5 * * * *у розкладі crontab
woodvi

Я зараз це використовую. Протягом 3-х днів у мене були три окремі машини Ubuntu Server 16 LTS (дві фізичні, одна VM), через кілька годин перезавантаження, відмовилися від SMB-з'єднань. При запуску підключення SMB монтується без проблем, але воно з часом стає невідповідним.
користувач38537


0

Іншою можливою відповіддю було запропоновано регулярно писати у файл на горі через cron. Я б запропонував замість цього використовувати програму smbclient для підключення до спільного доступу та відключення.

Я написав такий сценарій bash, щоб досягти цього:

#!/bin/bash

su usernamehere -c "smbclient \\\\\\\\\\\\\\\\servernamehere\\\\\\\\sharenamehere passwordhere -c exit" >/dev/null 2>&1

Ця команда встановлює нове підключення до спільного доступу, а потім запускає команду вихід, негайно вимикаючи з'єднання, щойно встановлене в командному рядку. Перед іменем сервера повинно бути 8 косої риски і 4 перед ім'ям спільного доступу, оскільки слід виконувати зворотні косої риски, а також уникнути значень, що знаходяться в дворядковому рядку. Можливо, є розумніший спосіб зробити це, але це, здається, працює.

Можливо, є спосіб зробити це ще більш надійним, змусивши його тримати з'єднання відкритим протягом декількох хвилин, але це трохи не в моїй лізі.


Цікава пропозиція. Я б сказав, якби я не мав успіху в іншому рішенні.
Пістос

Я не бачу, як це було б корисно? Рішенням Жанни було б зберегти зв’язок клієнта cifs живим, тоді як це створило б новий, неспоріднений зв’язок із smbclient - так як це допоможе?
грипго

1
FYI, smbclient підтримує косі нахили вперед, якщо ви хочете використовувати їх замість нахилів, тому //servername/sharnameв місцях, де вам потрібно багато втечі, простіше.
Стів Фрідль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.