No login, uma montagem de ligação é criada. Em ~/.pam_mount.conf.xml
:
<volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />
Isso precisa ser feito apenas uma vez por inicialização. Observe que não tenho acesso às montagens fstab ou systemd.
A montagem de ligação em si funciona. No entanto, ele está sendo executado em todos os logins . Como posso ter dezenas, centenas de logins na caixa via SSH, isso preenche a tabela de montagem rapidamente. Apenas alguns minutos atrás, a caixa foi inutilizada devido à exaustão de recursos por causa disso.
Detectar uma montagem de ligação existente é fácil, mas com pam_mount.so não vejo um meio de fazer a montagem depender do resultado de, digamos, um script.
Daí a minha pergunta:
- Como posso impedir que a montagem de ligação seja executada mais de uma vez ou
- como posso tornar as montagens de ligação repetidas sem operação para evitar que as montagens se acumulem?
Veja também: https://github.com/karelzak/util-linux/issues/448
Gostaria de saber se você está usando o systemd (propagação de montagem por padrão). Parece mais que o dobro do número de montagens de ligação a cada vez. Talvez se comporte melhor com
private
as opções de montagem... Ah. Vejo que você pode escreverunbindable
como uma opção para montar. Se ele aceitar isso, poderá responder à sua pergunta. Desde quepam_mount
permita que uma montagem falhe e não aborte o login.Percebo que, por algum motivo, o seu
pam_mount
não parece estar funcionando como foi projetado.pam_mount mantém uma "contagem de referência" de suas montagens. Por exemplo, se você tiver dois logins ativos ao mesmo tempo, o sistema de arquivos deve ser montado apenas uma vez. Ele é desmontado após o logout de ambas as sessões.
Se você está impedindo que o sistema de arquivos seja desmontado no momento do logout, você está abusando do pam_mount. Esteja ciente de que isso pode mudar no futuro de alguma forma que interrompa sua configuração.
Depois de passar pelo código pam_mount , acredito que sei o que está acontecendo. A situação decorre principalmente de duas questões:
A abordagem pam_mount para detectar volumes já montados é muito simplista.
O kernel empilhará alegremente montagens de ligação repetidas umas sobre as outras, mesmo que o caminho de origem e o ponto de montagem sejam os mesmos.
No repositório
mount.c
pam_mount :É isso. Os valores de origem e destino são fornecidos pela libmount do util-linux. Infelizmente, libmount é capaz de determinar o caminho de origem original de uma montagem de ligação somente se ele aparecer no arquivo
/run/mount/utab
. Os pontos de montagem PAM não. Assim, não é suficiente para estender a verificação acima.No entanto, para a montagem de ligação
o kernel gera uma entrada da
/proc/mounts
seguinte forma:onde a fonte obviamente não corresponde ao caminho que especificamos na linha de comando mount(8). Em vez disso, ele fornece o volume subjacente como a origem, fazendo com que a verificação por pam_mount falhe.
As informações do caminho de origem são perdidas. Um pouco melhor é
/proc/self/mountinfo
:Também de acordo com a fonte da libmount, o primeiro
/nix
(arg index 4) corresponde à “raiz da montagem dentro do FS”. (O segundo é o ponto de montagem em VFS.) Assim, o caminho original passado para mount(8) é substituído pela localização dentro do volume. Com o volume sendo montado em/mnt/local
, acabamos com apenas/nix
. Esse valor pode ser consultado usando uma API (mnt_table_get_fs_root()
), mas é inútil para pam_mount porque o último não retira o ponto de montagem do valor de origem ao realizar a verificação.