Ok, resolvi meu problema e, ao fazê-lo, entendi melhor como os ulimits funcionam, pelo menos no Ubuntu. Houve vários problemas e acho que resolvi todos eles.
Primeiro problema, e um bobo: nofiles
deve ser nofile
em /etc/security/limits.conf
Outra supervisão mais significativa: Embora eu tenha garantido a inclusão do pam_limits.so em /etc/pam.d/common-session
, não percebi que também havia /etc/pam.d/common-session-noninteractive
. O último arquivo foi o que o samba estava usando.
Corrigir esse problema parece ter corrigido o samba, que agora pode abrir quantos descritores de arquivos desejar. Cópias do Windows concluídas com sucesso. Observe também : o Samba realmente usa o ulimit do usuário apropriado, não os ulimits com os quais o processo smbd começou, nem o ulimit do root. /etc/security/limits.conf
é o local para definir isso, depois de ter configurado corretamente (ambos?) /etc/pam.d/common-session-noninteractive
e /etc/pam.d/samba
para usar pam_limits.so
Quanto ao outro problema, onde meu usuário estava preso a 1024 hard / 1024 soft limits, isso foi uma combinação de alguns problemas. Em primeiro lugar, apesar de ter /etc/pam.d/sshd
o daemon ssh não usa o PAM, a menos que você modifique /etc/ssh/sshd_config
para ter "UsePAM yes". O padrão é "não" e, sem usar o PAM, o pam_limits.so (que é responsável por aplicar o limits.conf) nem entra em ação.
Em vez disso, os ulimits padrão para logins que não são do PAM parecem herdar do pid 1 (normalmente "init"). Você pode verificar esses limites padrão de pid 1 com cat /proc/1/limits
. Infelizmente, até onde eu sei, esses limites são definidos como padrões no kernel. Não parece haver nenhuma maneira de modificá-los, a não ser recompilar o kernel, ou convencer o aplicativo não-PAM a usar o PAM.
Eu também só quero oferecer o conselho de que cat /proc/<anypid>/limits
é uma ótima maneira de depurar os limites de qualquer processo específico com o qual você possa ter problemas. Eu gostaria de ter descoberto isso antes.