Linux: Giá treo CIFS / Samba bị treo trong vài phút


26

Tôi có một mạng cục bộ nhỏ có hộp Gentoo và hộp Windows. Tôi gắn một chia sẻ có nguồn gốc từ hộp Windows lên hộp Gentoo bằng một lệnh như:

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

Hầu hết thời gian, mọi thứ chỉ hoạt động, và tôi có thể đọc và viết mà không gặp vấn đề gì. Tuy nhiên, cứ sau vài tuần, kết nối hoặc điểm gắn kết dường như bị tắt hoặc bị treo, do đó, bất kỳ quá trình nào cố gắng truy cập điểm gắn kết đều bị kẹt ở trạng thái D (đĩa hoặc I / O chờ). Các quy trình này trở nên không thấm đối với tín hiệu TATE và KILL. Ngắt kết nối và kết nối lại hộp Windows khỏi mạng không có ích. Trạng thái đóng băng kéo dài trong hơn 5 phút. Nó thực sự gây phiền toái và cản trở công việc bình thường, bởi vì nó đóng băng các hộp thoại, lslệnh, v.v. Nếu tôi phát hành umountđiểm gắn kết, nó cũng bị treo hoặc báo cáo rằng điểm gắn kết đang được sử dụng. Cuối cùng, trạng thái chết tự giải quyết và điểm gắn kết không được kết nối, hoặc có thể umountkhông bị chậm trễ.

Tôi đoán là điều này xảy ra khi kết nối / mount không hoạt động hoặc khi máy Windows không hoạt động. Tôi không thực sự chắc chắn.

Tại sao điều này xảy ra, và tôi có thể làm gì để ngăn chặn nó? Hoặc làm thế nào tôi có thể giết thành công các quy trình trạng thái D này theo ý muốn?

Có thể liên quan: Gắn kết CIFS treo trên đọc


1
Có bất kỳ loại tường lửa được sử dụng giữa hai máy?
Schrute

@Schrute: Tôi giả sử bất kỳ giá trị mặc định nào trên Linux (iptables?) Và Windows đang chạy. Bạn nghĩ rằng tường lửa đang kết nối thời gian? Tôi chưa bao giờ nghe nói về một điều như vậy.
Pistos

Tôi nghĩ rằng đây có thể là một vấn đề của hộp linux. Tôi đã thấy một vấn đề tương tự - không phải với cifs và Windows - mà là với chia sẻ nfs được gắn kết. Không thể lưu - Tôi đoán do một số quy trình bị treo khi truy cập máy chủ nfs không tồn tại. Điều này thường xảy ra khi máy chủ bị sập.
cornelinux

1
Lời khuyên của tôi là thiết lập chụp mạng đệm vòng trên máy linux (ví dụ: tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap host 192.168.0.103 - Tôi cũng sẽ chạy nó dưới màn hình để ngăn quá trình kết thúc khi bạn ngắt kết nối). Khi sự cố xảy ra, hãy dừng theo dõi sau vài giây và ít nhất bạn sẽ có thể xác định bên nào gây ra sự cố khi xem lại dấu vết gói (tức là máy chủ dừng phản hồi, phiên bị ngắt kết nối, v.v.).
GeekyDeaks

1
@Pistos - Wireshark là bạn của bạn! Các dấu vết có thể trông khó hiểu, nhưng wireshark sẽ giải mã các khung để giúp đỡ. Trước tiên, bạn muốn loại bỏ những điều cơ bản, như máy chủ hoặc máy khách bỏ phiên (gói FIN), sau đó tiến tới những người khác như máy chủ ngừng phản hồi, v.v. Nếu bạn có thời gian có một video cá mập trên CIFS vào năm 2013 ( youtube.com/watch ? v = XbvFXSPig-w ) nhưng nó khá dài :)
GeekyDeaks

Câu trả lời:


11

Không chắc chắn tại sao vấn đề đang xảy ra, nhưng như một cách giải quyết, bạn đã cố gắng đặt một cái gì đó như touch /mnt/windowsbox/keepalive.txthoặc echo "I am still alive." >/mnt/windowsbox/keepalive.txtđược chạy qua cron mỗi phút? Bằng cách đó, kết nối sẽ duy trì hoạt động.


Ý tưởng tốt. Tôi đã đặt cái này vào vị trí, và sẽ xem điều gì sẽ xảy ra.
Pistos

2
Điều này dường như đã giải quyết vấn đề, tôi nên đề cập.
Pistos

Rất vui được nghe tin ấy!
Janne Pikkarainen

1
theo câu trả lời của @ Pat, người ta có thể cắt nó từ nhịp tim mỗi phút thành nhịp tim mỗi 5 phút (300 giây), sẽ nằm */5 * * * *trong lịch trình crontab
woodvi 23/2/2016

Tôi đang sử dụng cái này bây giờ. Trong vòng 3 ngày, tôi đã có ba máy Ubuntu Server 16 LTS riêng biệt (hai máy ảo, một máy ảo) bỏ kết nối SMB sau vài giờ được khởi động lại. Khi khởi động, kết nối SMB được gắn kết không có vấn đề, nhưng cuối cùng nó trở nên không phản hồi.
dùng38537


0

Một câu trả lời tiềm năng khác đề nghị ghi vào một tệp trên mount trên một khoảng thời gian thông qua cron. Tôi sẽ đề nghị thay vì sử dụng chương trình smbclient để kết nối với chia sẻ và ngắt kết nối.

Tôi đã viết một kịch bản bash như thế này để thực hiện điều đó:

#!/bin/bash

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

Lệnh này tạo một kết nối mới để chia sẻ và sau đó chạy lệnh exit, ngay lập tức tắt kết nối mà nó vừa thiết lập trên dòng lệnh. Cần có 8 dấu gạch chéo trước tên máy chủ và 4 trước tên chia sẻ, vì dấu gạch chéo ngược cần được thoát và thoát phải được thoát khi bên trong chuỗi trích dẫn kép. Có lẽ có một cách thông minh hơn để làm điều này, nhưng điều này dường như hoạt động.

Có lẽ có một cách để làm cho điều này trở nên đáng tin cậy hơn bằng cách làm cho nó giữ kết nối mở trong vài phút mỗi lần, nhưng đó là một chút ngoài giải đấu của tôi.


Đề nghị thú vị. Tôi đã thử rồi nếu tôi chưa thành công với giải pháp khác.
Pistos

Tôi không thấy làm thế nào điều này sẽ hữu ích? Giải pháp của Janne sẽ duy trì kết nối được tạo bởi ứng dụng khách cifs trong khi điều này sẽ tạo ra một kết nối mới, không liên quan với smbclient - vậy nó sẽ giúp ích như thế nào?
flungo

1
FYI, smbclient hỗ trợ các dấu gạch chéo về phía trước nếu bạn muốn sử dụng chúng thay vì dấu gạch chéo ngược, vì vậy //servername/sharnamesẽ dễ dàng hơn ở những nơi bạn cần nhiều lối thoát.
Steve Friedl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.