如果已安装,则防止登录时绑定安装

如果已安装,则防止登录时绑定安装

登录时,将创建绑定安装。在~/.pam_mount.conf.xml

  <volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />

每次启动只需执行一次此操作。请注意,我无权访问 fstab 或 systemd 挂载。

绑定安装本身可以工作。然而,每次登录时都会执行它。由于我可以通过 SSH 进行数十、数百次登录,因此挂载表很快就会填满。就在几分钟前,该盒子因资源耗尽而无法使用。

检测现有的绑定安装很容易,但是pam_mount.so 我没有看到使安装取决于脚本结果的方法。

因此我的问题是:

  • 如何防止绑定安装被执行多次,或者
  • 如何使重复的绑定挂载成为无操作,以防止挂载累积?

也可以看看:https://github.com/karelzak/util-linux/issues/448

答案1

我想知道您是否使用 systemd (默认情况下挂载传播)。似乎每次绑定安装的数量都会增加一倍以上。也许它private在安装选项中表现得更好......啊。我看到你可以写unbindable为安装选项。如果它接受这一点,那么它就可以回答你的问题。只要pam_mount允许安装失败并且不中止登录即可。


我注意到由于某种原因,你的程序pam_mount似乎没有按照设计的方式工作。

pam_mount 保留您的安装的“引用计数”。例如,如果您同时有两个活动登录,则文件系统只能挂载一次。两个会话都注销后,它就会被卸载。

如果您阻止在注销时卸载文件系统,则您正在滥用 pam_mount。请注意,它将来可能会以某种方式发生变化,从而破坏您的设置。

答案2

经历了之后pam_mount代码我相信我知道发生了什么。出现这种情况主要是因为两个问题:

  • pam_mount检测已安装卷的方法过于简单。

  • 即使源路径和挂载点相同,内核也会乐意将重复的绑定挂载堆叠在一起。

mount.cpam_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;

就是这样。的值来源目标供应商: 库挂载来自 util-linux。不幸的是,库挂载仅当绑定安装出现在 中时,才能够确定它的原始源路径/run/mount/utab。 PAM 挂载点则不然。因此,扩展上述检查是不够的。

但是,对于绑定安装

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

内核生成一个条目/proc/mounts如下:

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

其中源显然与我们在 mount(8) 命令行中指定的路径不匹配。相反,它给出底层卷作为源,导致检查pam_mount失败。

源路径信息丢失。更好一点的是 /proc/self/mountinfo

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

还根据 库安装源第一的 /nix(arg索引4)对应于“FS内挂载的根”。 (第二个是VFS中的挂载点。)因此,原始路径传递到安装(8)被卷内的位置替代。当卷被安装在/mnt/local我们最终得到的仅仅是/nix.该值可以使用 API ( mnt_table_get_fs_root()) 查询,但对于pam_mount因为后者在执行检查时不会从源值中删除挂载点。

相关内容