Server samba Linux: cifs_mount non riuscito con codice di ritorno = -12


16

Server: RHEL 5.9 / smbd 3.0.33 - Client: vari, sebbene tutti usassero l'attuale mount.cifs (5.2)

Ho già risolto questo problema, ma è stato un tale incubo dare la caccia a questi codici di errore e ho pensato che avesse bisogno di una documentazione universale.

Sintomi : errore di montaggio imprevedibile e intermittente da uno specifico client cifs al server samba di linux. Tutti i miei client Linux pam_mount user homes al login. A caso, e sporadicamente, i montaggi di home dir hanno iniziato a fallire su una macchina. Accessi e montaggi hanno continuato a funzionare perfettamente su tutti gli altri client. Inizialmente pensavo che una insolita quantità di attività sul client non funzionante causasse il freak di smbd, ma i guasti intermittenti sono persistiti anche dopo che l'utilizzo è diminuito.

Il tentativo di montare manualmente non riesce e segnala:

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

Impostare <debug enable="1"/>in /etc/security/pam_mount.conf.xml per ottenere maggiori informazioni da 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)`

Anche /var/log/kern.log ha riferito di questo evento:

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

'echo 1> / proc / fs / CIFS / cifsFYI' manovelle fino mount.cifs debug (scritture / var / log / debug). Ecco la parte buona (sembra familiare?):

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

A questo punto non ci sono letteralmente altre informazioni disponibili sul lato client. La richiesta di mount cifs viene disattivata e il client muore quasi immediatamente. L'errore mount.cifs (12) è piuttosto poco informativo (la pagina man non aiuta, grazie ragazzi). Un'ampia ricerca su Internet rivela che questo è un codice di errore comune, lo conferma anche come non informativo.

È ora di controllare sul server! Imposta log level = 3per smbd in /etc/samba/smb.conf (dal libro Using Samba: "I livelli sopra 3 sono usati dagli sviluppatori e scaricano enormi quantità di informazioni criptiche." Lol!). Ecco la linea pertinente:

[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

Quasi lì ... dall'archivio della mailing list smb ho trovato qualcuno che riportava una sorta di problema simile, identificato come limite di condivisione ancorato su una singola connessione smb. Elenco condivisioni aperte sul server:

smbstatus -S | grep <serverIP> | wc -lrestituito il 2048 . Molto evidente.

Esaminando effettivamente l'output di migliaia di voci smbstatus -Srivelate per "IPC $". I documenti Samba su IPC $ rivelano che è coinvolto nella navigazione condivisa anonima e nell'accesso ad "alcune altre risorse". Ho impostato l'host deny sul server in /etc/samba/smb.conf:

[IPC$]
hosts deny = 0.0.0.0/0

Funziona benissimo ora. OK, speriamo che qualcosa qui aiuti qualche povera anima in futuro.

Immagino che nello spirito del sito farò una domanda: perché smbd non dovrebbe ripulire le azioni IPC $? Perché stabilire una connessione IPC $ per utente a una condivisione anziché una per connessione client? È possibile disabilitare la creazione della condivisione $ IPC dal lato client? C'è un modo per aumentare il numero massimo di connessioni per condivisione (non che ciò avrebbe aiutato in questo caso)? Non l'ho visto nei documenti.


"Errori intermittenti" "casuali e sporadici" ed errori di allocazione della memoria - hai verificato gli errori di memoria (fisica)?
ckujau,

1
La condivisione IPC $ è sempre accessibile in un contesto per utente perché è veramente (nel mondo MSFT) un'interfaccia RPC (remote procedure procedure call). Cioè, la condivisione IPC $ offre a un utente un canale per l'autenticazione al servizio Server in modo che possano quindi effettuare chiamate RPC ad esso. È buona pratica di sicurezza disabilitarlo se non ne hai bisogno (e tbh faccio fatica a credere che qualcuno lo faccia).
AlwaysLearning,

Grazie per un esempio dettagliato di risoluzione dei problemi di samba. Messaggi di errore astratti sono un incubo.
mmv-ru,

Risposte:


1

Questo è un vecchio, ma considerando che è senza risposta e stavo esaminando IPC $ e Samba, lo proverò per motivi di documentazione.

Perché smbd non dovrebbe ripulire le azioni IPC $?

Come indicato sopra nei commenti alla tua domanda, il servizio viene utilizzato per l'amministrazione remota e la comunicazione tra server, e in particolare in Samba viene utilizzato per alcuni scopi di navigazione e tcp / ip. A meno che non sia necessario per qualche motivo o qualcosa non funzioni, è sicuro disabilitarlo. [1]

Perché stabilire una connessione IPC $ per utente a una condivisione anziché una per connessione client?

Perché un utente può avere più connessioni client.

È possibile disabilitare la creazione della condivisione $ IPC dal lato client?

Sì e no. In realtà non disabilita la creazione della condivisione $ IPC, ma è possibile disabilitare l'accesso ad essa dal client Windows. [2]

Per Windows Vista, Windows 7, Windows 8 e Windows 10, puoi effettuare le seguenti modifiche al registro:

  1. Fare clic su Start, digitare "regedit" nella casella Cerca, quindi fare clic su regedit.exe nei risultati della ricerca. Viene visualizzata la finestra di dialogo Controllo account utente.
  2. Di '"Sì" al prompt UAC e l'Editor del Registro di sistema dovrebbe aprirsi.
  3. Apri il ramo HKEY_LOCAL_MACHINE.
  4. Apri il ramo SYSTEM.
  5. Apri il ramo CurrentControlSet.
  6. Apri il ramo Servizi.
  7. Apri il ramo LanmanServer.
  8. Seleziona il ramo Parametri.
  9. Seleziona Modifica, Nuovo, "Valore DWORD (32 bit)"
  10. Digitare "AutoShareWks" e premere Invio. (Lascia il valore predefinito di 0.)
  11. Riavviare o riavviare il servizio utilizzando un prompt dei comandi (DOS o terminale): "net stop server" quindi "net start server".

C'è un modo per aumentare il numero massimo di connessioni per condivisione (non che ciò avrebbe aiutato in questo caso)? Non l'ho visto nei documenti.

Sì [3]. Sotto la condivisione basta inserire:

[share]
   max connections = ##

Dove XX è il numero di connessioni.

fonti:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.