impede a montagem da ligação no login, se montado

0

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. Note que eu não tenho acesso às montagens fstab ou systemd.

A própria montagem de ligação funciona. No entanto, está sendo executado em cada login . Desde que eu posso ter dezenas, centenas de logins para o caixa via SSH, isso preenche a tabela de montagem rapidamente. Somente minutos atrás, a caixa foi processada inutilizável devido ao recurso exaustão por causa disso.

Detectar uma montagem de ligação existente é fácil, mas com pam_mount.so Eu não vejo meios de fazer a montagem depender do resultado de diga um script.

Daí a minha pergunta:

  • Como posso evitar que a montagem de ligação seja executada mais de uma vez, ou
  • como posso fazer uma ligação repetida para montar um no-op para evitar montagens de acumular?

Veja também: link

    
por phg 11.07.2018 / 17:05

2 respostas

2

Gostaria de saber se você está usando o systemd (propagação de montagem por padrão). Parece mais do que duplicar o número de montagens de ligação de cada vez. Talvez se comporte melhor com private nas opções de montagem ... Ah. Eu vejo que você pode escrever unbindable como uma opção para montar. Se aceitar isso, poderá responder à sua pergunta. Contanto que pam_mount permita que uma montagem falhe e não aborte o login.

Noto que, por algum motivo, seu pam_mount parece não estar funcionando da maneira como foi projetado.

pam_mount mantém uma "contagem de referência" das suas montagens. Por exemplo, se você tiver dois logons ativos ao mesmo tempo, o sistema de arquivos só deve ser montado uma vez. É desmontado depois que ambas as sessões efetuam logout.

Se você estiver impedindo que o sistema de arquivos seja desmontado no momento da desconexão, você estará abusando do pam_mount. Esteja ciente de que isso pode mudar no futuro de alguma forma que interrompa sua configuração.

    
por 11.07.2018 / 18:51
1

Depois de passar pelo código pam_mount , acredito que sei o que é indo. A situação surge principalmente de duas questões:

  • A abordagem pam_mount para detectar volumes já montados é muito simplista.

  • O kernel irá alegremente empilhar montagens repetidas de bind no topo de um ao outro, mesmo se o caminho de origem e o ponto de montagem forem os mesmos.

De mount.c no repo pam_mount :

128         xcmp = fstype2_icase(vpt->type) ? strcasecmp : strcmp;
129         if (source != NULL)
130                 result = xcmp(vpt->volume, source) == 0;
131         if (target != NULL)
132                 result &= strcmp(vpt->mountpoint, target) == 0;

É isso. Os valores para source e target são fornecidos por libmount do util-linux. Infelizmente, libmount é capaz de determinar o caminho de origem original de uma montagem de ligação apenas se aparece em /run/mount/utab . Pontos de montagem do PAM, não. Assim é não é suficiente para estender a verificação acima.

No entanto, para a montagem de ligação

<volume
  options="bind,nodev,exec,nosuid"
  user="yourstruly"
  mountpoint="/nix"
  path="/mnt/local/nix"
  />

o kernel gera uma entrada em /proc/mounts da seguinte forma:

/dev/mapper/VolGroup00-local /nix ext4 rw,relatime 0 0

onde a fonte obviamente não corresponde ao caminho especificado a linha de comando mount (8). Em vez disso, dá a base volume como a origem, fazendo com que a verificação pam_mount falhe.

As informações do caminho de origem são perdidas. Um pouco melhor é /proc/self/mountinfo :

934 654 253:6 /nix /nix rw,relatime shared:33 - ext4 /dev/mapper/VolGroup00-local rw

Ainda de acordo com o fonte libmount o primeiro /nix (arg index 4) corresponde à “raiz do o monte dentro do FS ”. (O segundo é o ponto de montagem 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 meramente com /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 tira o ponto de montagem do valor de origem ao executar a verificação.

    
por 24.08.2018 / 10:27