自动挂载支持¶
对于希望进行自动挂载支持的文件系统(例如 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
自动挂载点过期¶
只要您已按照单独概述的自动挂载过程挂载了要过期的挂载点,挂载点的自动过期就很容易实现。
要实现过期,您需要执行以下步骤
创建至少一个列表,用于存放要过期的 vfsmount。
当在 ->d_automount 方法中创建一个新的挂载点时,使用
mnt_set_expiry()
将 mnt 添加到列表中mnt_set_expiry(newmnt, &afs_vfsmounts);当您希望挂载点过期时,调用 mark_mounts_for_expiry() 并传入指向此列表的指针。这将处理该列表,标记其上的每个 vfsmount,使其在下一次调用时可能过期。
如果 vfsmount 已被标记为过期,并且其使用计数为 1(仅由其父 vfsmount 引用),则它将从命名空间中删除并丢弃(实际上是卸载)。
使用某种定时事件来驱动它,可能最简单的方法是定期调用此函数。
过期标志由对 mntput 的调用清除。这意味着过期仅在上次访问挂载点之后第二次过期请求时才会发生。
如果移动了挂载点,它将从过期列表中删除。如果在一个可过期的挂载点上进行了绑定挂载,则新的 vfsmount 将不在过期列表中,也不会过期。
如果复制了一个命名空间,则其中包含的所有挂载点都将被复制,并且那些在过期列表上的副本将被添加到同一个过期列表。
用户空间驱动的过期¶
作为替代方案,用户空间可以请求任何挂载点的过期(尽管某些挂载点会被拒绝 - 例如当前进程的 rootfs 概念)。它通过将 MNT_EXPIRE 标志传递给 umount() 来实现这一点。此标志被认为与 MNT_FORCE 和 MNT_DETACH 不兼容。
如果所讨论的挂载点被 umount() 或其父挂载点以外的其他东西引用,则会返回 EBUSY 错误,并且该挂载点不会被标记为过期或卸载。
如果该挂载点当时尚未被标记为过期,则会给出 EAGAIN 错误,并且不会被卸载。
否则,如果它已被标记并且未被引用,则将像往常一样进行卸载。
同样,每次除 umount() 之外的任何东西查看挂载点时,都会清除过期标志。