Làm thế nào để ngăn samba giữ khóa tệp sau khi máy khách ngắt kết nối?


11

Ở đây tôi có một máy chủ Samba (Debian 5.0) được cấu hình để lưu trữ các cấu hình Windows XP.

Khách hàng kết nối với máy chủ này và làm việc trên hồ sơ của họ trực tiếp trên chia sẻ samba (hồ sơ không được sao chép cục bộ).

Thỉnh thoảng, một máy khách có thể không tắt đúng cách và do đó Windows không giải phóng các khóa tệp. Khi nhìn vào bảng khóa samba, chúng ta có thể thấy rằng nhiều tệp vẫn bị khóa mặc dù máy khách không được kết nối nữa. Trong trường hợp của chúng tôi, điều này dường như xảy ra với các tệp khóa được tạo bởi Mozilla Thunderbird và Firefox. Dưới đây là một ví dụ về bảng khóa samba:

# smbstatus -L | grep DENY_ALL | head -n5
Pid          Uid        DenyMode   Access      R/W        Oplock           SharePath   Name   Time
--------------------------------------------------------------------------------------------------
15494        10345      DENY_ALL   0x3019f     RDWR       EXCLUSIVE+BATCH  /home/CORP/user1   app.profile/user1.thunderbird/parent.lock   Mon Nov 22 07:12:45 2010
18040        10454      DENY_ALL   0x3019f     RDWR       EXCLUSIVE+BATCH  /home/CORP/user2   app.profile/user2.thunderbird/parent.lock   Mon Nov 22 11:20:45 2010
26466        10056      DENY_ALL   0x3019f     RDWR       EXCLUSIVE+BATCH  /home/CORP/user3   app.profile/user3.firefox/parent.lock   Mon Nov 22 08:48:23 2010

Chúng ta có thể thấy rằng các tệp đã được Windows mở và áp dụng khóa DENY_ALL.

Bây giờ khi một khách hàng kết nối lại với chia sẻ này và cố gắng mở các tệp đó, samba nói rằng họ bị khóa và từ chối truy cập.

Có cách nào để khắc phục tình trạng này hay tôi đang thiếu thứ gì?

Chỉnh sửa: Chúng tôi muốn tránh việc vô hiệu hóa khóa tệp trên máy chủ samba vì có những lý do chính đáng để bật chúng.

Câu trả lời:


11

các bước dưới đây đã giúp tôi giải quyết vấn đề chính xác này trong một số trường hợp:

  1. Đăng nhập vào máy chủ samba.
  2. Chạy một "smbstatus".
  3. Tìm pid của quá trình có khóa trên tệp trong phần thứ ba của đầu ra.
  4. Xác minh rằng nó phù hợp với tên người dùng và tên máy chủ dự kiến ​​trong phần đầu tiên và thứ hai của đầu ra smbstatus.
  5. Chạy "ps -ef" và xem smbd với pid đó đã chạy được bao lâu.
  6. Nếu nó đã chạy từ trước khi máy tính được khởi động lại lần cuối, thì đó là phần còn lại của smbd. Giết CHỈ LÀ MỘT smbd. (Và hãy chắc chắn rằng bạn đã chọn đúng - nó phải là một cái có giá trị cha mẹ không bằng 1.)

Ngoài ra, bạn có thể thấy rằng một số pids smbd đã chạy được vài giờ và các tệp họ đã khóa là những tệp bạn cần. Như trên, chỉ cần giết các quá trình này và bạn sẽ ổn thôi. Nếu bạn vô tình giết tiến trình smbd chính thì bạn có thể khởi động lại nó bằng lệnh này: sudo /etc/init.d/smbd restart
Socceroos 17/07/13

5

Có một cái nhìn tại:

reset on zero vc = yes / no

và xem nếu điều đó sẽ khắc phục vấn đề của bạn hay không.

Từ smb.conftrang người đàn ông:

Tùy chọn boolean này kiểm soát xem thiết lập phiên đến có nên giết các kết nối khác đến từ cùng một IP hay không. Điều này phù hợp với hành vi mặc định của Windows 2003. Đặt tham số này thành có trở nên cần thiết khi bạn có một mạng không ổn định và các cửa sổ quyết định kết nối lại trong khi kết nối cũ vẫn có các tệp với chế độ chia sẻ mở. Những tập tin này không thể truy cập được qua kết nối mới. Máy khách gửi một VC không trên kết nối mới và Windows 2003 sẽ giết tất cả các kết nối khác đến từ cùng một IP. Bằng cách này, các tập tin bị khóa có thể truy cập lại. Xin lưu ý rằng việc bật tùy chọn này sẽ giết chết các kết nối phía sau bộ định tuyến giả mạo.

Chỉnh sửa :
Tôi chỉ nghĩ về một giải pháp có thể khác. Bạn có thể làm một cái gì đó như thế này trên chia sẻ trong câu hỏi.

veto oplock files = /*.lock/

Điều này sẽ chỉ ngăn chặn oplocks trên các tập tin .lock.


0

Một số người rất thông minh tại Samba đã quyết định loại bỏ tùy chọn này và không có sự thay thế nào cho nó.

Cho đến nay đối với SMB đồng hành, vì đây thực sự là hành vi giành chiến thắng mặc định.

Trừ khi người dùng thành thạo dòng lệnh linux và cách tiêu diệt các tệp / quy trình đang mở, bạn phải khởi động lại SMBD hoặc chính máy chủ để xóa điều này.

Làm tuyệt vời, Samba.org.


Bạn có một trích dẫn cho điều này?
BE77Y

Bạn sẽ phải xem xét một vài để đạt được điều đó, nhưng: lists.samba.org/archive/samba-technical/2011-July/078621.html (hiển thị quá trình suy nghĩ và chaps cầu xin cho nó không phải được loại bỏ) danh sách .samba.org / archive / samba-kỹ thuật / 2008-Tháng 10 / Lỗi (hiển thị tham số đã bị xóa trong 4.0)
Michael

Kể từ năm 2019, trong Debian 9 - Samba 4.5.12, reset on zero vctùy chọn vẫn được liệt kê trong hướng dẫn và cũng được hiển thị bởi testparm. Vì vậy, nó đã trở lại, hoặc nó thực sự đã không được gỡ bỏ.
mivk

0

Tôi đang gặp một vấn đề tương tự, một khách hàng gặp sự cố trong khi sao chép một tệp lớn và tệp bị khóa sau khi khởi động lại. May mắn là điều này không xảy ra rất thường xuyên, nhưng vẫn khá khó chịu khi phải giết quá trình samba. reset on zero vcdường như chỉ là giải pháp, nhưng nó được cho là đã bị xóa khỏi Samba4, mặc dù Phiên bản 4.7.6 trên Fedora (27) vẫn có nó (có thể được vá bởi RH). Dù sao nó cũng không giúp được gì nhiều, như trang man bây giờ nói rằng nó chỉ hoạt động với SMB1 (không nên sử dụng nữa) và không làm gì trên các kết nối SMB2 và SMB3, cách duy nhất còn lại để xử lý việc này được đề cập trong chủ đề được liên kết bởi Micheal . Tôi không biết lý do đằng sau việc loại bỏ và điều gì quá tệ vềreset on zero vc, Tôi sẽ xem xét sử dụng thời gian chờ tcp cho mục đích này giống như một vụ hack. Dù sao một cái gì đó hợp lý có thể là ví dụ

socket options = TCP_NODELAY SO_KEEPALIVE TCP_KEEPIDLE=30 TCP_KEEPCNT=3 TCP_KEEPINTVL=3

Điều này sẽ giết kết nối khoảng 40 giây (30 + 3 * 3) sau lần liên lạc cuối cùng, thường là quá đủ để nhận thấy sự cố và khởi động lại (với điều kiện ngăn xếp tcp của máy chủ đủ thông minh để đóng kết nối khi máy khách từ chối các gói giữ nguyên của nó sau khi khởi động lại).

Lưu ý rằng điều này làm tăng tải trên mạng của bạn, nhưng tôi nghi ngờ rằng nó thậm chí còn đáng chú ý ngay cả với rất nhiều khách hàng.


Bạn có biết liệu điều này có giúp ích cho ứng dụng zombie kỳ lạ "không ai nogroup" không? Nhiều khách hàng Windows10 của tôi tại một số trang web đã bắt đầu để lại hàng trăm (đôi khi hàng ngàn) chủ đề zombie được gán cho "không ai hợp tác" cho đến khi quy trình xử lý của họ bị giết / nghỉ hưu. Thông thường, cài đặt deadtime = 10sẽ xóa nó, nhưng với các khóa tập tin kéo dài trên các kết nối SMB3_11, nó sẽ không có hiệu lực, vì thời gian chết sẽ không được kiểm tra trong khi vẫn tồn tại các filelocks cho PID. Vô cùng bực bội.
zxq9

Tôi chưa bao giờ nghe hoặc trải nghiệm vấn đề bạn mô tả. deadtimekhông có gì nếu khách hàng của bạn mở tệp, vì vậy câu hỏi sẽ là, tệp nào họ tiếp tục mở. Nhưng đó có lẽ là một vấn đề hoàn toàn khác với vấn đề được thảo luận ở đây, vì vậy bạn nên mở một câu hỏi mới cho vấn đề này. socket optionsĐề xuất của tôi chỉ giúp với các kết nối không được đóng đúng cách (vì máy khách gặp sự cố, mất mạng, v.v.), nhưng có lẽ không nếu máy khách WX của bạn chỉ kết nối với máy chủ mà không có bất kỳ hành động nào hoặc sử dụng một loại phiên ẩn danh nào đó ( nobody.nogroupgợi ý ).
Jakob

Dường như có một câu hỏi về vấn đề này, nhưng không có giải pháp thực sự. Có vẻ như đó có thể là một vấn đề samba có thể được khắc phục trong phiên bản gần đây hơn.
Jakob

Có khá nhiều đề cập về điều này trong danh sách gửi thư, không có giải pháp thực sự nào được trình bày ở bất cứ đâu và không có phiên bản nào tôi đã thử (mọi chi nhánh hiện tại nhưng 4.9) đều khắc phục vấn đề. Nó chỉ với các máy khách Windows10. Điều không ai: nogroup là bối rối, vì khách bị vô hiệu hóa trên toàn cầu, không có cổ phần nào chấp nhận chúng và PID của các mục không ai luôn giống như một mục hợp lệ duy nhất có tên người dùng hợp lệ. Vì vậy, bạn thấy 12345 someuser somegroup...trên một mục, sau đó 800 12345 nobody nogroup ...mục, nhưng chỉ một số ít khóa tệp (không phải 800). Rất kì lạ. Ảnh hưởng đến 3 trang web khách hàng của tôi bây giờ.
zxq9

Điều này chỉ trở thành một hạn chế tài nguyên trên các trang web hoạt động cao, đó là lý do tại sao tôi nghĩ rằng nó nhận được rất ít sự chú ý. Hầu hết thời gian không có vấn đề gì, vì vậy mọi người chỉ không chú ý đến nó và nó sẽ tự xóa đi bất cứ khi nào khách hàng thực sự đóng kết nối của họ.
zxq9

0

Bạn có thể vô hiệu hóa oplocks trên cơ sở cho mỗi chia sẻ với những điều sau đây:

[acctdata]
oplocks = False
level2 oplocks = False

Loại oplock mặc định là Level1. Oplocks Level2 được bật trên cơ sở chia sẻ trong tệp smb.conf. Thay phiên, bạn có thể vô hiệu hóa oplocks trên cơ sở mỗi tệp trong phần chia sẻ:

veto oplock files = /*.mdb/*.MDB/*.dbf/*.DBF/

Nếu bạn đang gặp vấn đề với oplocks, rõ ràng từ các mục nhật ký của Samba, bạn có thể muốn chơi nó an toàn và vô hiệu hóa oplocks và oplocks Level2.

Vô hiệu hóa Kernel Oplocks Kernel oplocks là một tham số smb.conf thông báo cho Samba (nếu hạt nhân UNIX có khả năng gửi cho máy khách Windows một oplock break) khi một tiến trình UNIX đang cố mở tệp được lưu trữ. Tham số này giải quyết các tệp chia sẻ giữa UNIX và Windows với oplocks được bật trên máy chủ Samba: quy trình UNIX có thể mở tệp được Oplocked (lưu trữ) bởi máy khách Windows và quá trình smbd sẽ không gửi ngắt oplock, làm lộ tệp nguy cơ tham nhũng dữ liệu. Nếu hạt nhân UNIX có khả năng gửi ngắt oplock, thì tham số oplocks của hạt nhân cho phép Samba gửi ngắt oplock. Oplocks hạt nhân được kích hoạt trên cơ sở mỗi máy chủ trong tệp smb.conf.

kernel oplocks = yes

Mặc định là không.

Nguồn

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.