Server samba Linux: cifs_mount gagal w / kode pengembalian = -12

16

Server: RHEL 5.9 / smbd 3.0.33 - Klien: beragam, meskipun semuanya menggunakan mount.cifs saat ini (5.2)

Saya sudah memecahkan masalah ini, tetapi merupakan mimpi buruk untuk memburu kode kesalahan ini, saya merasa perlu mendokumentasikan secara universal.

Gejala : Kegagalan pemasangan terputus-putus yang tidak dapat diprediksi dari satu klien cifs tertentu ke server samba linux. Semua klien linux saya pam_mount rumah pengguna saat masuk. Secara acak, dan secara sporadis pemasangan dir home mulai gagal pada satu mesin. Login dan mount terus bekerja dengan sempurna pada semua klien lain. Awalnya saya pikir sejumlah aktivitas yang tidak biasa pada klien yang rusak menyebabkan smbd menjadi aneh, tetapi kegagalan yang terputus-putus tetap ada bahkan setelah penggunaannya mereda.

Upaya untuk memasang dengan tangan gagal dan melaporkan:

Errors from underlying mount program
mount error(12): Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

Set <debug enable="1"/>di /etc/security/pam_mount.conf.xml untuk mendapatkan info lebih lanjut dari pam_mount:

command: 'mount' '-t' 'cifs' '//my_server/watdo' '/home/watdo' '-o' 'user=watdo,uid=666,gid=666'
pam_mount(misc.c:38): set_myuid<pre>: (ruid/rgid=0/0, e=0/0)
pam_mount(misc.c:38): set_myuid<post>: (ruid/rgid=0/0, e=0/0)
pam_mount(mount.c:64): Errors from underlying mount program:
pam_mount(mount.c:68): mount error(12): Cannot allocate memory
pam_mount(mount.c:68): Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)`

/var/log/kern.log juga melaporkan acara ini:

kernel: [4316790.256149] CIFS VFS: cifs_mount failed w/return code = -12

'echo 1> / proc / fs / cifs / cifsFYI' engkol up mount.cifs debug (menulis ke / var / log / debug). Inilah bagian yang baik (terlihat familier?):

CIFS Session Established successfully
For smb_command 117
Sending smb:  total_len 88
cifs_sync_mid_result: cmd=117 mid=54307 state=4
Mapping smb error code 0xc0000205 to POSIX err -12

Pada titik ini sebenarnya tidak ada informasi lain yang tersedia di sisi klien. permintaan mount cifs padam dan klien segera mati. kesalahan mount.cifs (12) cukup tidak informatif (halaman manual tidak membantu, thx guys). Pencarian di internet yang luas mengungkapkan bahwa ini adalah kode kesalahan yang umum, juga menegaskannya sebagai tidak informatif.

Saatnya memeriksa server! Ditetapkan log level = 3untuk smbd di /etc/samba/smb.conf (dari buku Using Samba: "Level di atas 3 adalah untuk digunakan oleh pengembang dan membuang informasi cryptic dalam jumlah besar." Lol!). Inilah garis yang relevan:

[2013/02/08 10:18:03, 3] smbd/error.c:error_packet_set(106) error packet at smbd/reply.c(514) cmd=117 (SMBtconX) NT_STATUS_INSUFF_SERVER_RESOURCES

Hampir di sana ... dari arsip milis seseorang saya menemukan seseorang yang melaporkan semacam masalah yang sama, diidentifikasi sebagai batas saham yang dipatok pada koneksi seseorang. Daftar saham terbuka di server:

smbstatus -S | grep <serverIP> | wc -ldikembalikan 2048 . Sangat mencolok.

Sebenarnya memeriksa output dari ribuan entri smbstatus -Sterungkap untuk 'IPC $'. Samba docs pada IPC $ mengungkapkan bahwa ia terlibat dengan penjelajahan berbagi anonim dan akses ke "beberapa sumber daya lain". Saya menetapkan host deny pada server di /etc/samba/smb.conf:

[IPC$]
hosts deny = 0.0.0.0/0

Bagus sekali sekarang. Oke, semoga sesuatu di sini membantu beberapa jiwa miskin di masa depan.

Saya kira dengan semangat situs saya akan mengajukan pertanyaan: Mengapa smbd tidak membersihkan saham IPC $? Mengapa membangun satu IPC $ per koneksi pengguna ke sebuah share daripada satu per koneksi klien? Bisakah Anda menonaktifkan kreasi IPC $ share dari sisi klien? Apakah ada cara untuk meningkatkan koneksi # max per saham (bukan berarti ini akan membantu dalam kasus ini)? Saya tidak melihatnya di dokumen.

zastard
sumber
"Secara acak, dan secara sporadis", "kegagalan terputus-putus" dan kesalahan alokasi memori - apakah Anda memeriksa kesalahan memori (fisik)?
ckujau
1
Pangsa IPC $ selalu diakses dalam konteks per pengguna karena itu benar-benar (dalam dunia MSFT) antarmuka jarak jauh prosedur-panggilan (RPC). Yaitu, berbagi IPC $ memberi pengguna saluran untuk mengautentikasi ke layanan Server sehingga mereka dapat melakukan panggilan RPC ke sana. Ini adalah praktik keamanan yang baik untuk menonaktifkannya jika Anda tidak memerlukannya (dan tbh saya sulit percaya bahwa ada orang yang melakukannya).
AlwaysLearning
Terima kasih atas contoh terperinci tentang pemecahan masalah samba. Pesan kesalahan abstrak adalah mimpi buruk.
mmv-ru

Jawaban:

1

Ini adalah oldie, tapi mengingat itu belum terjawab dan saya mencari IPC $ dan Samba, saya akan mencobanya demi dokumentasi.

Mengapa smbd tidak membersihkan saham IPC $?

Seperti yang dinyatakan di atas dalam komentar untuk pertanyaan Anda, layanan ini digunakan untuk administrasi jarak jauh dan komunikasi antar server, dan khususnya di Samba, layanan ini digunakan untuk beberapa keperluan penelusuran dan tcp / ip. Kecuali Anda membutuhkannya karena alasan tertentu atau sesuatu tidak berfungsi, aman untuk menonaktifkannya. [1]

Mengapa membangun satu IPC $ per koneksi pengguna ke sebuah share daripada satu per koneksi klien?

Karena pengguna dapat memiliki beberapa koneksi klien.

Bisakah Anda menonaktifkan kreasi IPC $ share dari sisi klien?

Iya dan tidak. Ini tidak benar-benar menonaktifkan penciptaan saham $ IPC, tetapi Anda dapat menonaktifkan aksesnya dari klien windows. [2]

Untuk windows Vista, Windows 7, Windows 8 dan Windows 10, Anda dapat melakukan edit registri berikut:

  1. Klik Mulai, ketik "regedit" di kotak Pencarian, dan kemudian klik regedit.exe di hasil pencarian. Kotak dialog Kontrol Akun Pengguna muncul.
  2. Katakan "Ya" ke prompt UAC dan Editor Registri akan terbuka.
  3. Buka cabang HKEY_LOCAL_MACHINE.
  4. Buka cabang SISTEM.
  5. Buka cabang CurrentControlSet.
  6. Buka cabang Layanan.
  7. Buka cabang LanmanServer.
  8. Pilih cabang Parameter.
  9. Pilih Edit, Baru, “Nilai DWORD (32-bit)”
  10. Ketik "AutoShareWks" dan tekan Enter. (Biarkan nilai default 0.)
  11. Nyalakan kembali atau mulai ulang layanan menggunakan Command Prompt (DOS atau terminal): "net stop server" lalu "net start server".

Apakah ada cara untuk meningkatkan koneksi # max per saham (bukan berarti ini akan membantu dalam kasus ini)? Saya tidak melihatnya di dokumen.

Ya [3] Di bawah input just share:

[share]
   max connections = ##

Di mana XX adalah jumlah koneksi.

Sumber:

Leo
sumber