Bagaimana mencegah samba menahan kunci file setelah klien terputus?

11

Di sini saya memiliki server Samba (Debian 5.0) yang dikonfigurasi untuk meng-host profil Windows XP.

Klien terhubung ke server ini dan mengerjakan profil mereka secara langsung pada share samba (profil tidak disalin secara lokal).

Sesekali, klien mungkin tidak mematikan dengan benar dan dengan demikian Windows tidak membebaskan kunci file. Saat melihat tabel penguncian samba, kita dapat melihat bahwa banyak file masih terkunci meskipun klien tidak terhubung lagi. Dalam kasus kami, ini tampaknya terjadi dengan lockfiles yang dibuat oleh Mozilla Thunderbird dan Firefox. Berikut adalah contoh dari tabel penguncian 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

Kita dapat melihat bahwa file dibuka oleh Windows dan mengenakan kunci DENY_ALL.

Sekarang ketika klien menghubungkan kembali ke berbagi ini dan mencoba untuk membuka file-file itu, samba mengatakan bahwa mereka dikunci dan menolak akses.

Apakah ada cara untuk mengatasi situasi ini atau saya kehilangan sesuatu?

Edit: Kami ingin menghindari menonaktifkan kunci file di server samba karena ada yang alasan yang baik untuk memiliki orang-orang yang aktif.

Jean-Francois Chevrette
sumber

Jawaban:

11

langkah-langkah di bawah ini telah membantu saya menyelesaikan masalah persis ini pada sejumlah kesempatan:

  1. Masuk ke server samba.
  2. Jalankan "smbstatus".
  3. Temukan pid dari proses yang memiliki kunci pada file di bagian ketiga dari output.
  4. Verifikasi bahwa itu cocok dengan yang diharapkan pengguna dan nama host di bagian pertama dan kedua dari output smbstatus.
  5. Jalankan "ps -ef" dan lihat berapa lama smbd dengan pid itu telah berjalan.
  6. Jika sudah berjalan sejak sebelum komputer terakhir reboot, itu smbd tersisa. Bunuh JUST ITU SATU smbd. (Dan pastikan Anda mendapatkan yang benar - itu harus yang memiliki orang tua pid tidak sama dengan 1.)
Socceroos
sumber
Juga, Anda mungkin menemukan bahwa beberapa smbd pid telah berjalan selama beberapa jam dan file-file yang dikunci adalah yang Anda butuhkan. Seperti di atas, bunuh saja proses ini dan Anda harus baik-baik saja. Jika Anda secara tidak sengaja mematikan proses smbd utama, maka Anda dapat memulai kembali dengan perintah ini: sudo /etc/init.d/smbd restart
Socceroos
5

Lihatlah:

reset on zero vc = yes / no

dan lihat apakah itu akan memperbaiki masalah Anda atau tidak.

Dari smb.confhalaman manual:

Opsi boolean ini mengontrol apakah pengaturan sesi yang masuk harus mematikan koneksi lain yang berasal dari IP yang sama. Ini cocok dengan perilaku Windows 2003 default. Mengatur parameter ini ke yes menjadi perlu ketika Anda memiliki jaringan yang rapuh dan windows memutuskan untuk menyambung kembali sementara koneksi lama masih memiliki file dengan mode berbagi terbuka. File-file ini menjadi tidak dapat diakses melalui koneksi baru. Klien mengirim nol VC pada koneksi baru, dan Windows 2003 membunuh semua koneksi lain yang berasal dari IP yang sama. Dengan cara ini file yang terkunci dapat diakses kembali. Perlu diketahui bahwa mengaktifkan opsi ini akan mematikan koneksi di belakang router yang menyamar.

Sunting :
Saya baru saja memikirkan solusi lain yang mungkin. Anda dapat melakukan sesuatu seperti ini di bagian yang dimaksud.

veto oplock files = /*.lock/

Ini hanya akan mencegah membuka kunci pada file .lock.

Pengaruh 3d
sumber
0

Beberapa orang yang sangat pintar di Samba memutuskan untuk menghapus opsi ini dan tidak ada pengganti untuk itu.

Sejauh ini untuk kompatibilitas SMB, karena ini memang perilaku win default.

Kecuali jika pengguna berpengalaman dalam baris perintah linux dan cara membunuh file / proses yang terbuka, Anda harus me-restart SMBD ke atau server itu sendiri untuk menghapus ini.

Sungguh luar biasa, Samba.org.

Michael
sumber
Apakah Anda memiliki kutipan untuk ini?
BE77Y
Anda harus melihat beberapa untuk sampai ke sana, tetapi: lists.samba.org/archive/samba-technical/2011-July/078621.html (perlihatkan proses pemikiran dan bab yang memohon agar tidak dihapus) daftar .samba.org / archive / samba-technical / 2008-October /… (menunjukkan parameter telah dihapus pada 4.0)
Michael
Pada 2019, dalam Debian 9 - Samba 4.5.12, reset on zero vcopsi ini masih tercantum dalam manual, dan juga ditampilkan oleh testparm. Jadi apakah itu kembali, atau itu benar-benar belum dihapus.
mivk
0

Saya mengalami masalah yang sama, klien jatuh saat menyalin file besar dan file itu terkunci setelah reboot. Untungnya hal ini tidak terlalu sering terjadi, tetapi masih cukup mengganggu karena harus membunuh proses samba. reset on zero vctampaknya hanya solusi, tetapi itu seharusnya dihapus dari Samba4, meskipun Versi 4.7.6 pada Fedora (27) masih memilikinya (mungkin ditambal oleh RH). Lagipula itu tidak akan banyak membantu, seperti yang dikatakan halaman manual, bahwa itu hanya berfungsi dengan SMB1 (yang seharusnya tidak digunakan lagi) dan tidak melakukan apa-apa pada koneksi SMB2 dan SMB3, satu-satunya cara yang tersisa untuk menangani ini disebutkan dalam utas yang ditautkan oleh Micheal . Saya tidak tahu alasan di balik penghapusan dan apa yang sangat buruk tentang itureset on zero vc, Saya akan mempertimbangkan menggunakan batas waktu tcp untuk tujuan ini lebih seperti peretasan. Pokoknya sesuatu yang masuk akal bisa jadi misalnya

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

Ini akan mematikan koneksi sekitar 40 detik (30 + 3 * 3) setelah komunikasi terakhir, yang biasanya lebih dari cukup untuk melihat crash dan reboot (mengingat bahwa tumpukan tcp server cukup pintar untuk menutup koneksi ketika klien menolak paket keepalive-nya setelah reboot).

Perhatikan bahwa ini meningkatkan beban pada jaringan Anda, tetapi saya ragu itu bahkan terlihat bahkan dengan banyak klien.

Jakob
sumber
Tahukah Anda apakah ini membantu masalah thread zombie klien Windows10 "nobody nogroup" yang aneh? Banyak klien Windows10 saya di beberapa situs sudah mulai meninggalkan ratusan (kadang-kadang ribuan) utas zombie yang ditugaskan untuk "siapa pun nogroup" sampai proses penangan mereka terbunuh / pensiun. Biasanya pengaturan deadtime = 10atau lebih akan menghapusnya, tetapi dengan kunci file melekat pada koneksi SMB3_11 selamanya itu tidak berpengaruh, karena deadtime tidak akan diperiksa sementara kunci file untuk PID masih ada. Sangat membuat frustrasi.
zxq9
Saya tidak pernah mendengar atau mengalami masalah yang Anda gambarkan. deadtimetidak melakukan apa-apa jika klien Anda memiliki file terbuka, jadi pertanyaannya adalah, file mana yang tetap terbuka. Tapi itu mungkin masalah yang sama sekali berbeda dari yang dibahas di sini, jadi Anda harus membuka pertanyaan baru untuk ini. socket optionsSaran saya hanya membantu dengan koneksi yang tidak ditutup dengan benar (karena klien macet, pemadaman jaringan dll.), Tetapi mungkin tidak jika klien WX Anda hanya terhubung ke server tanpa tindakan lebih lanjut atau menggunakan beberapa jenis sesi anonim (yang nobody.nogroupmenyarankan ).
Jakob
Tampaknya ada satu pertanyaan tentang masalah ini, tetapi tanpa solusi nyata. Sepertinya itu bisa menjadi masalah samba yang bisa diperbaiki dalam versi yang lebih baru.
Jakob
Ada beberapa yang menyebutkan hal ini di milis, tidak ada solusi nyata yang disajikan di mana pun, dan tidak ada versi yang saya coba (setiap cabang saat ini tetapi 4,9) memperbaiki masalah. Hanya dengan klien Windows10. Tidak ada: hal nogroup membingungkan, karena tamu dinonaktifkan secara global, tidak ada saham yang menerimanya, dan PID dari entri siapa pun selalu sama dengan satu entri yang valid dengan nama pengguna yang valid. Jadi Anda melihat 12345 someuser somegroup...pada satu entri, kemudian 800 12345 nobody nogroup ...entri, tetapi hanya segelintir kunci file (bukan 800). Sangat aneh. Mempengaruhi 3 situs klien saya sekarang.
zxq9
Ini hanya menjadi kendala sumber daya pada situs aktivitas tinggi, itulah mengapa saya pikir itu menerima begitu sedikit perhatian. Sebagian besar waktu tidak ada masalah, jadi orang hanya tidak menyadarinya dan agak membersihkan diri setiap kali klien benar-benar menutup koneksi mereka.
zxq9
0

Anda dapat menonaktifkan kunci pembuka berdasarkan per-saham dengan yang berikut:

[acctdata]
oplocks = False
level2 oplocks = False

Jenis oplock default adalah Level1. Pembuka level2 diaktifkan berdasarkan per-saham dalam file smb.conf. Sebagai alternatif, Anda dapat menonaktifkan oplock pada basis per file di dalam share:

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

Jika Anda mengalami masalah dengan kunci pembuka, seperti yang terlihat dari entri log Samba, Anda mungkin ingin memainkannya dengan aman dan menonaktifkan kunci pembuka dan pembuka kunci Level2.

Menonaktifkan Kernel Oplocks Kernel oplocks adalah parameter smb.conf yang memberitahukan Samba (jika kernel UNIX memiliki kemampuan untuk mengirim klien Windows istirahat oplock) ketika proses UNIX berusaha untuk membuka file yang di-cache. Parameter ini membahas berbagi file antara UNIX dan Windows dengan oplocks yang diaktifkan pada server Samba: proses UNIX dapat membuka file yang di-Oplock (di-cache) oleh klien Windows dan proses smbd tidak akan mengirim oplock break, yang mengekspos file ke risiko korupsi data. Jika kernel UNIX memiliki kemampuan untuk mengirim istirahat oplock, maka parameter buka kunci kernel memungkinkan Samba untuk mengirim istirahat oplock. Kernel oplock diaktifkan berdasarkan per-server dalam file smb.conf.

kernel oplocks = yes

Standarnya adalah no.

Sumber

ajcg
sumber