自动挂载支持

对于希望进行自动挂载支持的文件系统(例如 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. 创建至少一个列表,用于存放要过期的 vfsmount。

  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() 之外的任何东西查看挂载点时,都会清除过期标志。