Linux : CIFS / Samba 마운트가 몇 분 동안 정지됨


26

젠투 박스와 윈도우 박스가있는 작은 로컬 네트워크가 있습니다. 다음과 같은 명령을 사용하여 Windows 상자에서 시작되는 공유를 Gentoo 상자에 마운트합니다.

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

대부분의 경우 모든 것이 제대로 작동하며 문제없이 읽고 쓸 수 있습니다. 그러나 몇 주 정도마다 연결 또는 탑재 지점이 작동하지 않거나 중단 된 것처럼 보이므로 탑재 지점에 액세스하려는 프로세스가 D 상태 (디스크 또는 I / O 대기)에 멈 춥니 다. 이러한 프로세스는 TERM 및 KILL 신호에 영향을받지 않습니다. 네트워크에서 Windows 상자를 분리했다가 다시 연결해도 도움이되지 않습니다. 얼어 붙은 상태는 5 분 이상 지속됩니다. 다른 이름으로 저장 대화 상자, ls명령 등을 고정시키기 때문에 정말 실망스럽고 정상적인 작업을 방해 umount합니다. 마운트 지점에서을 발행 하면 마운트 지점이 사용 중이거나 마운트 지점이 사용 중임을보고합니다. 결국 데드 상태가 자체적으로 해결되고 마운트 지점이 마운트 해제되거나 umount지연없이 가능합니다 .

내 생각에 이것은 연결 / 마운트가 유휴 상태이거나 Windows 컴퓨터가 유휴 상태 일 때 발생합니다. 나는 확실하지 않다.

왜 이런 일이 발생하며이를 방지하기 위해 어떻게해야합니까? 아니면 어떻게 이러한 D- 상태 프로세스를 마음대로 성공적으로 죽일 수 있습니까?

아마도 관련 : CIFS 마운트는 읽기에 응답하지 않습니다


1
두 시스템간에 방화벽 유형이 있습니까?
Schrute

@Schrute : Linux (iptables?)의 모든 기본값을 가정하고 Windows가 실행 중입니다. 방화벽이 연결 시간을 초과한다고 생각하십니까? 그런 말을 들어 본 적이 없습니다.
Pistos

나는 이것이 리눅스 박스의 문제 일 것이라고 생각한다. cifs와 Windows가 아니라 nfs 공유가 마운트되어있는 비슷한 문제가 나타났습니다. 저장할 수 없습니다. 존재하지 않는 nfs 서버에 액세스 할 때 일부 프로세스가 중단 된 것 같습니다. 이것은 일반적으로 서버가 충돌했을 때 발생합니다.
cornelinux

1
내 조언은 리눅스 컴퓨터에 링 버퍼 네트워크 캡처를 설정하는 것입니다 (예 : tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap host 192.168.0.103-또한 실행됩니다) 연결을 끊을 때 프로세스가 종료되지 않도록 화면 아래에 표시). 문제가 발생하면 몇 초 후에 추적을 중지하고 최소한 패킷 추적을 검토 할 때 어느 쪽이 문제를 일으키는 지 확인할 수 있어야합니다 (예 : 서버가 응답을 중지하고 세션 연결이 끊어짐 등).
GeekyDeaks

1
@ 피스 토스-Wireshark는 당신의 친구입니다! 트레이스는 혼란스러워 보일 수 있지만 wireshark는 프레임을 해독하여 도움을줍니다. 먼저 서버 또는 클라이언트가 세션을 삭제 (FIN 패킷)하는 등의 기본 사항을 제거한 다음 서버가 응답하지 않는 등의 다른 항목으로 진행하려고합니다. 2013 년 CIFS에 sharkfest 비디오가있는 경우 ( youtube.com/watch ? v = XbvFXSPig-w ) 그러나 다소 길다 :)
GeekyDeaks

답변:


11

왜 문제가 발생하는지 확실하지 않지만 해결 방법으로 매분마다 cron을 통해 실행 touch /mnt/windowsbox/keepalive.txt하거나 echo "I am still alive." >/mnt/windowsbox/keepalive.txt실행 하려고 시도 했습니까? 그렇게하면 연결이 활성화되어 있어야합니다.


좋은 생각. 나는 이것을 제자리에 놓고 어떤 일이 일어나는지 볼 것이다.
Pistos

2
이것은 문제를 해결 한 것으로 보입니다.
Pistos

잘 들었습니다!
Janne Pikkarainen

1
@Pat의 답변에 따라 분당 심장 박동에서 매 5 분 (300 초)마다 심장 박동으로이를 다듬을 수 있습니다 */5 * * * *. crontab 일정
woodvi

나는 이것을 지금 사용하고 있습니다. 3 일 이내에 몇 시간 동안 재부팅 한 후 3 개의 개별 Ubuntu Server 16 LTS 시스템 (2 개의 물리적, 1 개의 VM)이 SMB 연결을 끊었습니다. 시작시 SMB 연결은 문제없이 마운트되지만 결국 응답하지 않습니다.
user38537


0

또 다른 잠재적 인 대답은 cron을 통해 정기적으로 마운트의 파일에 쓰는 것을 제안했습니다. 대신 smbclient 프로그램을 사용하여 공유에 연결하고 연결을 끊는 것이 좋습니다.

나는 이것을 달성하기 위해 다음과 같은 bash 스크립트를 작성했다.

#!/bin/bash

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

이 명령은 공유에 새로 연결 한 다음 exit 명령을 실행하여 명령 줄에서 설정 한 연결을 즉시 종료합니다. 백 슬래시를 이스케이프해야하고 큰 따옴표로 묶인 문자열 안에 있으면 이스케이프를 이스케이프해야하므로 서버 이름 앞에 슬래시가 8 개, 공유 이름 앞에 4가 있어야합니다. 아마도 더 똑똑한 방법이 있지만 이것이 효과가있는 것 같습니다.

어쩌면 한 번에 몇 분 동안 연결을 열어 두어 더 안정적으로 만들 수있는 방법이 있지만 그것은 내 리그에서 약간 벗어났습니다.


재미있는 제안. 다른 솔루션으로 아직 성공하지 못했다면 갈 수 있었을 것입니다.
Pistos 2016 년

이것이 어떻게 도움이되는지 보지 못합니까? Janne의 솔루션은 cifs 클라이언트가 만든 연결을 유지하는 반면 smbclient와 관련이없는 새로운 연결을 만드는 것입니다. 어떻게 도움이 되겠습니까?
flungo

1
참고로 smbclient는 백 슬래시 대신 슬래시를 사용하려는 경우 슬래시를 지원하므로 //servername/sharname많은 이스케이프가 필요한 위치에서 훨씬 쉽습니다.
Steve Friedl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.