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 (ดิสก์หรือ I / O รอ) กระบวนการเหล่านี้ไม่สามารถส่งสัญญาณถึง TERM และ KILL ได้ การตัดการเชื่อมต่อและเชื่อมต่อกล่อง Windows ใหม่จากเครือข่ายไม่ได้ช่วย สถานะแช่แข็งใช้เวลานานกว่า 5 นาที มันน่าหงุดหงิดจริงๆและเข้าสู่การทำงานตามปกติเพราะมันหยุดกล่องโต้ตอบ Save As lsคำสั่ง ฯลฯ หากฉันออก a umountจุดเมานท์มันจะแฮงค์หรือรายงานว่ามีการใช้จุดเมานท์ ในที่สุดสถานะที่ตายจะแก้ไขตัวเองและจุดเชื่อมต่อจะถูกถอดออกหรือumountไม่สามารถล่าช้าได้

ฉันเดาว่าจะเกิดเหตุการณ์นี้ขึ้นเมื่อการเชื่อมต่อ / การเมานท์ไม่ทำงานหรือเมื่อเครื่อง Windows ไม่มีการใช้งาน ฉันไม่แน่ใจจริงๆ

เหตุใดสิ่งนี้จึงเกิดขึ้นและฉันจะป้องกันอะไรได้บ้าง หรือฉันจะฆ่ากระบวนการ D-state เหล่านี้ให้สำเร็จได้อย่างไร

อาจเกี่ยวข้องกับ: CIFS mounts หยุดอ่าน


1
มีการใช้ไฟร์วอลล์ชนิดใดระหว่างเครื่องสองเครื่องหรือไม่
Schrute

@Schrute: ฉันคิดว่าสิ่งที่เป็นค่าเริ่มต้นบน Linux (iptables?) และ Windows กำลังทำงานอยู่ คุณคิดว่าไฟร์วอลล์หมดเวลาเชื่อมต่อแล้วหรือยัง ฉันไม่เคยได้ยินเรื่องแบบนี้มาก่อนเลย
Pistos

ฉันคิดว่านี่อาจเป็นปัญหาของกล่อง linux ฉันเห็นปัญหาที่คล้ายกัน - ไม่ใช่กับ cif และ 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 เป็นเพื่อนของคุณ! ร่องรอยอาจดูสับสน แต่ wireshark จะถอดรหัสเฟรมเพื่อช่วย คุณต้องการกำจัดพื้นฐานเช่นเซิร์ฟเวอร์หรือไคลเอนต์ปล่อยเซสชัน (แพ็คเก็ต FIN) จากนั้นความคืบหน้าไปยังผู้อื่นเช่นเซิร์ฟเวอร์หยุดตอบสนอง ฯลฯ ถ้าคุณมีเวลามีวิดีโอ sharkfest ใน 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 ทุกนาทีหรือไม่? วิธีการเชื่อมต่อจะยังคงทำงานอยู่


ความคิดที่ดี. ฉันใส่มันเข้าที่แล้วจะเห็นว่าเกิดอะไรขึ้น
Pistos

2
ดูเหมือนว่าจะแก้ปัญหาได้แล้วฉันควรพูดถึง
Pistos

ดีใจที่ได้ยินเช่นนั้น!
Janne Pikkarainen

1
ตามคำตอบของ @ Pat คุณสามารถลดการเต้นของหัวใจในแต่ละนาทีเป็น Heartbeat ทุก 5 นาที (300 วินาที) ซึ่งจะอยู่*/5 * * * *ในตาราง crontab
woodvi

ฉันใช้สิ่งนี้ในตอนนี้ ภายใน 3 วันฉันมี Ubuntu Server 16 LTS สามเครื่อง (สองเครื่อง, VM หนึ่งเครื่อง) แยกการเชื่อมต่อ SMB หลังจากรีบูทสองสามชั่วโมง เมื่อเริ่มต้นการเชื่อมต่อ SMB นั้นจะติดตั้งโดยไม่มีปัญหา แต่ในที่สุดจะไม่ตอบสนอง
user38537


0

คำตอบที่เป็นไปได้อีกข้อเสนอแนะให้เขียนไฟล์บนเมานท์ในช่วงเวลาปกติผ่าน cron ฉันขอแนะนำให้ใช้โปรแกรม smbclient แทนเพื่อเชื่อมต่อกับการแชร์และยกเลิกการเชื่อมต่อ

ฉันเขียนสคริปต์ทุบตีเช่นนี้เพื่อบรรลุว่า:

#!/bin/bash

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

คำสั่งนี้สร้างการเชื่อมต่อใหม่ไปยังการแชร์แล้วเรียกใช้คำสั่ง exit ทันทีปิดการเชื่อมต่อที่เพิ่งสร้างขึ้นบนบรรทัดคำสั่ง ควรมี 8 สแลชก่อนชื่อเซิร์ฟเวอร์และ 4 ก่อนชื่อแบ่งใช้เนื่องจากแบ็กสแลชจำเป็นต้องใช้ Escape และ Escape จะต้องมีการหลีกเลี่ยงเมื่ออยู่ภายในสตริงที่มีเครื่องหมายคำพูดคู่ อาจมีวิธีที่ชาญฉลาดในการทำเช่นนี้ แต่ดูเหมือนว่าจะทำงานได้

บางทีอาจมีวิธีที่จะทำให้สิ่งนี้น่าเชื่อถือยิ่งขึ้นด้วยการทำให้การเชื่อมต่อนั้นเปิดไว้เป็นเวลาหลายนาทีในแต่ละครั้ง


ข้อเสนอที่น่าสนใจ ฉันจะให้มันไปถ้าฉันไม่ได้ประสบความสำเร็จกับการแก้ปัญหาอื่น ๆ
Pistos

ฉันไม่เห็นว่าสิ่งนี้จะเป็นประโยชน์หรือไม่ โซลูชันของ Janne จะรักษาการเชื่อมต่อที่ทำโดยไคลเอนต์ cifs ขณะที่สิ่งนี้จะสร้างการเชื่อมต่อใหม่ที่ไม่เกี่ยวข้องกับ smbclient - ดังนั้นมันจะช่วยได้อย่างไร
flungo

1
FYI, smbclient รองรับเครื่องหมายสแลชหากคุณต้องการใช้แทนเครื่องหมายแบ็กสแลชดังนั้น//servername/sharnameวิธีที่ง่ายขึ้นในสถานที่ที่คุณต้องการหลบหนีมากมาย
Steve Friedl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.