Por que não usar autofs ?
Configurei pam_mount.so para montar automaticamente um compartilhamento cifs quando os usuários fazem login; o problema é que, se um usuário efetuar login em várias vezes simultaneamente, o comando mount será repetido várias vezes.
Até agora isso não é um problema, mas é confuso quando você vê a saída de um comando mount .
# mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
//srv1/UserShares/jrisk on /home/jrisk type cifs (rw,mand)
//srv1/UserShares/jrisk on /home/jrisk type cifs (rw,mand)
//srv1/UserShares/jrisk on /home/jrisk type cifs (rw,mand)
Estou assumindo que preciso mexer no arquivo pam.d/common-auth ou pam_mount.conf.xml para realizar isso.
Como posso instruir pam_mount.so para evitar montagens duplicadas?
[Editar]
O conteúdo do meu arquivo pam_mount.conf.xml :
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<pam_mount>
<debug enable="1" />
<volume user="*" server="srv1" path="UserShares" mountpoint="home" fstype="cifs" />
<cifsmount>mount -t cifs //%(SERVER)/%(VOLUME)/%(USER) %(MNTPT)/%(USER) -o "user=%(USER),uid=%(USERUID),gid=%(USERGID)%(before=\",\" OPTIONS)"</cifsmount>
<umount>umount %(MNTPT)/%(USER)</umount>
<mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other" />
<mntoptions require="nosuid,nodev" />
<path>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</path>
<logout wait="0" hup="0" term="0" kill="0" />
<mkmountpoint enable="1" remove="true" />
</pam_mount>
Por que não usar autofs ?
Certifique-se de colocar uma barra final para "caminho" (por exemplo, caminho="userShares /") assim:
<volume user="*" server="srv1" path="UserShares/" mountpoint="home" fstype="cifs" />
O problema é que uma barra final é adicionada à entrada em / etc / mtab. Então, quando o pam_mount é chamado novamente, ele não pode ver uma correspondência exata , portanto, montará o compartilhamento novamente, portanto, você tem várias montagens.
Veja este bug: link
"Vários logins simultâneos" é provavelmente a chave. Mais do que provavelmente, o que está acontecendo é que o segundo e os subsequentes comandos de montagem estão sendo lançados antes do primeiro acabamento do comando de montagem. Isso parece muito provável, considerando a lentidão dos comandos de montagem de rede. O que você provavelmente precisa é de algum tipo de arquivo de memória / estado compartilhado / etc, que pode garantir que apenas um processo de montagem seja iniciado. Bem, pelo menos até o autor pam_mount trabalhar em uma correção de longo prazo para essa condição de corrida ...:)
Você pode ver o módulo pam_tally. Você poderia usar esse módulo para manter um contador de login por usuário e negar se a contagem for maior que 1. No campo de controle, você pode configurá-lo para que o módulo pam_mount seja ignorado se pam_tally falhar. Especificamente, acho que algo assim funcionaria:
auth [success=ignore default=1] pam_tally.so deny=1 onerr=succeed no_lock_time no_reset
auth optional pam_mount.so pam_mount_options
... Ou algo nesse sentido. O módulo am_tally2 também funcionaria, se você precisar de algum sistema externo para manipular o contador, digamos, quando desmontar manualmente um sistema de arquivos ou algo assim (já que o pam_tally2 vem com um binário que pode ser usado para manipular as contagens).
A linha incorreta estava no meu arquivo pam_mount.conf.xml :
<mkmountpoint enable="1" remove="true" />
deve ser:
<mkmountpoint enable="1" remove="false" />
Com o valor definido como true, o módulo pam_mount.so estava tentando remover /home/$USER/ do sistema, não, como eu assumi, ./$USER no diretório /home/ .
Suspeito que o pam_mount não consiga desmontar o diretório. Você poderia, por favor, confirmar se o diretório permanece montado depois que o usuário efetuou logout com um mount ?
Se for esse o caso, a única solução que conheço é usar o pam_script para executar um fechamento de umount -l /home/$USER na sessão.
Boa sorte,
João Miguel Neves