登录时,会创建一个绑定挂载。在~/.pam_mount.conf.xml
:
<volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />
每次启动只需执行一次。请注意,我无权访问 fstab 或 systemd 挂载。
绑定安装本身可以工作。但是,它会在每次登录时执行。由于我可以通过 SSH 登录到该框的数十个,数百个,这会很快填满挂载表。就在几分钟前,由于资源耗尽,该盒子无法使用。
检测现有的绑定挂载很容易,但是使用pam_mount.so 我看不到使挂载取决于脚本的结果的方法。
因此我的问题是:
- 如何防止绑定挂载被多次执行,或者
- 如何使重复绑定挂载成为无操作以防止挂载累积?
我想知道您是否正在使用 systemd (默认安装传播)。每次绑定安装的数量似乎增加了一倍以上。也许它在安装选项中表现得更好
private
......啊。我看到你可以写作unbindable
为挂载的选项。如果它接受,那么它可以回答你的问题。只要pam_mount
允许挂载失败并且不会中止登录。我注意到由于某种原因,您
pam_mount
似乎没有按设计工作。pam_mount 保留您的坐骑的“参考计数”。例如,如果您一次有两个活动登录,则文件系统应该只挂载一次。它在两个会话注销后被卸载。
如果您在注销时阻止文件系统被卸载,那么您就是在滥用 pam_mount。请注意,它将来可能会以某种方式改变,从而破坏您的设置。
经过pam_mount代码后,我相信我知道发生了什么。这种情况主要源于两个问题:
检测已安装卷的pam_mount方法过于简单。
即使源路径和挂载点相同,内核也会愉快地将重复的绑定挂载堆叠在一起。
从pam_mount 存储
mount.c
库中:而已。source和target的值由 util-linux的libmount提供 。不幸的是,只有当绑定挂载出现在
/run/mount/utab
. PAM 挂载点没有。因此,扩展上述检查是不够的。但是,对于绑定安装
内核生成
/proc/mounts
如下条目:其中源显然与我们在 mount(8) 命令行中指定的路径不匹配。相反,它将底层卷作为源,导致pam_mount的检查失败。
源路径信息丢失。更好的是
/proc/self/mountinfo
:同样根据 libmount 源 ,第一个
/nix
(arg 索引 4)对应于“FS 内挂载的根”。(第二个是 VFS 中的挂载点。)因此,传递给mount(8)的原始路径被卷内的位置所取代。随着卷的安装,/mnt/local
我们最终只有/nix
. 可以使用 API (mnt_table_get_fs_root()
) 查询此值,但它对pam_mount没有用,因为后者在执行检查时不会从源值中删除挂载点。