登录时,将创建绑定安装。在~/.pam_mount.conf.xml
:
<volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />
每次启动只需执行一次此操作。请注意,我无权访问 fstab 或 systemd 挂载。
绑定安装本身可以工作。然而,每次登录时都会执行它。由于我可以通过 SSH 进行数十、数百次登录,因此挂载表很快就会填满。就在几分钟前,该盒子因资源耗尽而无法使用。
检测现有的绑定安装很容易,但是pam_mount.so 我没有看到使安装取决于脚本结果的方法。
因此我的问题是:
- 如何防止绑定安装被执行多次,或者
- 如何使重复的绑定挂载成为无操作,以防止挂载累积?
答案1
我想知道您是否使用 systemd (默认情况下挂载传播)。似乎每次绑定安装的数量都会增加一倍以上。也许它private
在安装选项中表现得更好......啊。我看到你可以写unbindable
为安装选项。如果它接受这一点,那么它就可以回答你的问题。只要pam_mount
允许安装失败并且不中止登录即可。
我注意到由于某种原因,你的程序pam_mount
似乎没有按照设计的方式工作。
pam_mount 保留您的安装的“引用计数”。例如,如果您同时有两个活动登录,则文件系统只能挂载一次。两个会话都注销后,它就会被卸载。
如果您阻止在注销时卸载文件系统,则您正在滥用 pam_mount。请注意,它将来可能会以某种方式发生变化,从而破坏您的设置。
答案2
经历了之后pam_mount代码我相信我知道发生了什么。出现这种情况主要是因为两个问题:
这pam_mount检测已安装卷的方法过于简单。
即使源路径和挂载点相同,内核也会乐意将重复的绑定挂载堆叠在一起。
从mount.c
在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;
就是这样。的值来源和目标供应商:
库挂载来自 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因为后者在执行检查时不会从源值中删除挂载点。