自动挂载支持

对于希望进行自动挂载支持的文件系统(例如 fs/afs/ 中的 kAFS 和 fs/nfs/ 中的 NFS),可以使用此功能。 该功能包括允许执行内核内挂载和请求挂载点降级。 后者也可以由用户空间请求。

内核内自动挂载

请参阅autofs - 工作原理的 “挂载陷阱” 部分

然后从用户空间,你可以做类似的事情

[root@andromeda root]# mount -t afs \#root.afs. /afs
[root@andromeda root]# ls /afs
asd  cambridge  cambridge.redhat.com  grand.central.org
[root@andromeda root]# ls /afs/cambridge
afsdoc
[root@andromeda root]# ls /afs/cambridge/afsdoc/
ChangeLog  html  LICENSE  pdf  RELNOTES-1.2.2

然后,如果你查看挂载点目录,你会看到类似的内容

[root@andromeda root]# cat /proc/mounts
...
#root.afs. /afs afs rw 0 0
#root.cell. /afs/cambridge.redhat.com afs rw 0 0
#afsdoc. /afs/cambridge.redhat.com/afsdoc afs rw 0 0

自动挂载点过期

如果按照单独概述的自动挂载程序挂载了要过期的挂载点,则自动过期挂载点很容易。

要执行过期,您需要按照以下步骤操作

  1. 创建至少一个列表,从中可以挂起要过期的 vfsmounts。

  2. 当在 ->d_automount 方法中创建新挂载点时,使用 mnt_set_expiry() 将 mnt 添加到列表

    mnt_set_expiry(newmnt, &afs_vfsmounts);
    
  3. 当您希望挂载点过期时,使用指向此列表的指针调用 mark_mounts_for_expiry()。 这将处理列表,标记其上的每个 vfsmount,以便在下次调用时可能过期。

    如果 vfsmount 已被标记为过期,并且如果其使用计数为 1(仅由其父 vfsmount 引用),那么它将从命名空间中删除并丢弃(有效地卸载)。

    使用某种定时事件来驱动它,以固定的时间间隔调用它可能最简单。

每次调用 mntput 都会清除过期标志。 这意味着只有在上一次访问挂载点后的第二次过期请求时才会发生过期。

如果移动挂载点,它会从过期列表中删除。 如果在可过期挂载上进行绑定挂载,则新的 vfsmount 将不在过期列表中,也不会过期。

如果复制了命名空间,则其中包含的所有挂载点都将被复制,并且位于过期列表中的那些挂载点的副本将被添加到相同的过期列表。

用户空间驱动的过期

作为替代方案,用户空间可以请求任何挂载点过期(尽管有些会被拒绝 - 例如,当前进程对 rootfs 的想法)。 它通过将 MNT_EXPIRE 标志传递给 umount() 来实现这一点。 此标志被认为与 MNT_FORCE 和 MNT_DETACH 不兼容。

如果相关的挂载点被 umount() 或其父挂载点以外的其他东西引用,则将返回 EBUSY 错误,并且该挂载点将不会被标记为过期或卸载。

如果挂载点当时尚未标记为过期,则将给出 EAGAIN 错误,并且不会卸载它。

否则,如果它已经被标记并且未被引用,则将像往常一样进行卸载。

同样,每次除了 umount() 之外的任何东西查看挂载点时,都会清除过期标志。