Servidor samba Linux: cifs_mount falhou com código de retorno = -12

16

Servidor: RHEL 5.9 / smbd 3.0.33 - Clientes: vários, embora todos usassem o mount.cifs atual (5.2)

Eu já resolvi esse problema, mas foi um pesadelo caçar esses códigos de erro e senti que ele precisava de documentação universal.

Sintomas : Falha imprevisível e intermitente na montagem de um cliente CIFS específico para o servidor Linux Samba. Todos os meus clientes linux pam_mount casas de usuários no login. Aleatoriamente, e esporadicamente, as montagens do diretório doméstico começaram a falhar em uma máquina. Logins e montagens continuaram funcionando perfeitamente em todos os outros clientes. Inicialmente, pensei que uma quantidade incomum de atividade no cliente danificado estava causando smbd, mas falhas intermitentes persistiam mesmo depois que o uso diminuía.

A tentativa de montar manualmente falha e relata:

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

Defina <debug enable="1"/>em /etc/security/pam_mount.conf.xml para obter mais informações de 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 também informou sobre este evento:

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

'echo 1> / proc / fs / CIFS / cifsFYI' manivelas até mount.cifs depuração (gravações em / var / log / debug). Aqui está a parte boa (parece familiar?):

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

Neste ponto, literalmente, não há outras informações disponíveis no lado do cliente. A solicitação de montagem cifs sai e o cliente morre quase imediatamente. O erro mount.cifs (12) é bastante pouco informativo (a página de manual não ajuda, thx pessoal). A extensa pesquisa na Internet revela que este é um código de erro comum, e também o confirma como não informativo.

Hora de checar o servidor! Definido log level = 3para smbd em /etc/samba/smb.conf (do livro Using Samba: "Níveis acima de 3 são para serem usados ​​pelos desenvolvedores e despejam enormes quantidades de informações enigmáticas." Lol!). Aqui está a linha relevante:

[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

Quase lá ... do arquivo da lista de mensagens SMB, encontrei alguém relatando um tipo de problema semelhante, identificado como um limite de compartilhamento vinculado em uma conexão SMB individual. Listar compartilhamentos abertos no servidor:

smbstatus -S | grep <serverIP> | wc -lretornou 2048 . Muito conspícuo.

Examinando realmente a saída de milhares de entradas smbstatus -Sreveladas para 'IPC $'. Os documentos do Samba no IPC $ revelam que ele está envolvido com a navegação anônima por compartilhamento e acesso a "alguns outros recursos". Defino a negação de host no servidor em /etc/samba/smb.conf:

[IPC$]
hosts deny = 0.0.0.0/0

Funciona muito bem agora. OK, espero que algo aqui ajude uma pobre alma em algum momento no futuro.

Acho que, no espírito do site, farei uma pergunta: Por que o smbd não limparia as ações do IPC $? Por que estabelecer um IPC $ por conexão de usuário para um compartilhamento, em vez de um por conexão de cliente? Você pode desativar a criação de compartilhamento de IPC $ no lado do cliente? Existe uma maneira de aumentar o número máximo de conexões por compartilhamento (não que isso ajude nesse caso)? Eu não vi isso nos documentos.

zastard
fonte
"Aleatoriamente e esporadicamente", "falhas intermitentes" e erros de alocação de memória - você verificou erros de memória (físicos)?
Ckujau
11
O compartilhamento IPC $ sempre é acessado em um contexto por usuário, porque é realmente (no mundo MSFT) uma interface RPC (chamada de procedimento remoto). Ou seja, o compartilhamento IPC $ fornece ao usuário um canal para autenticar no serviço do servidor, para que ele possa fazer chamadas RPC a ele. É uma boa prática de segurança desabilitá-lo se você não precisar dele (e é difícil acreditar que alguém o faça).
AlwaysLearning
Obrigado pelo exemplo detalhado da solução de problemas do samba. Mensagens de erro abstratas são um pesadelo.
mmv-ru

Respostas:

1

Isso é antigo, mas, considerando que não foi respondido e eu estava analisando o IPC $ e o Samba, tentarei testar a documentação.

Por que o smbd não limpa as ações do IPC $?

Como mencionado acima nos comentários da sua pergunta, o serviço é usado para administração remota e comunicação entre servidores, e particularmente no Samba é usado para alguns propósitos de navegação e tcp / ip. A menos que você precise por algum motivo ou algo não funcione, é seguro desativá-lo. [1]

Por que estabelecer um IPC $ por conexão de usuário para um compartilhamento, em vez de um por conexão de cliente?

Porque um usuário pode ter várias conexões de clientes.

Você pode desativar a criação de compartilhamento de IPC $ no lado do cliente?

Sim e não. Realmente não desabilita a criação do compartilhamento IPC $, mas você pode desativar o acesso a ele pelo cliente Windows. [2]

Para o Windows Vista, Windows 7, Windows 8 e Windows 10, você pode fazer a seguinte edição do Registro:

  1. Clique em Iniciar, digite "regedit" na caixa Pesquisar e clique em regedit.exe nos resultados da pesquisa. A caixa de diálogo Controle de Conta de Usuário é exibida.
  2. Diga "Sim" ao prompt do UAC e o Editor do Registro deve abrir.
  3. Abra o ramo HKEY_LOCAL_MACHINE.
  4. Abra a ramificação do sistema.
  5. Abra o ramo CurrentControlSet.
  6. Abra a ramificação de serviços.
  7. Abra o ramo LanmanServer.
  8. Selecione o ramo Parâmetros.
  9. Selecione Editar, Novo, "Valor DWORD (32 bits)"
  10. Digite “AutoShareWks” e pressione Enter. (Deixe o valor padrão de 0.)
  11. Reinicie ou reinicie o serviço usando um prompt de comando (DOS ou terminal): “net stop server” e depois “net start server”.

Existe uma maneira de aumentar o número máximo de conexões por compartilhamento (não que isso ajude nesse caso)? Eu não vi isso nos documentos.

Sim [3] Abaixo do compartilhamento, basta inserir:

[share]
   max connections = ##

Onde XX é o número de conexões.

Fontes:

Leo
fonte