我需要收集本地文件系统可以访问的所有已安装“挂载点”的列表。
这包括:
/Volumes
。/net
。但是我需要避免访问任何可以自动挂载但当前未挂载的文件系统。即,我不想引起任何自动分配。
我当前的方法如下:
FSGetVolumeInfo()
循环调用以收集所有已知的卷。这将使我在/Volumes
以及下的所有本地驱动器以及/net, /home
在之下的NFS挂载/net
。FSGetVolumeParms()
以获取每个卷的“设备ID”(原来是网络卷的安装路径)。readdir()
在其路径的父目录中使用,以检查父目录是否实际上包含安装点项(例如,如果ID为/net/MyNetShare
,那么我为readdir /net
)。如果它不可用,我认为这是一个尚未挂载的卷的自动挂载点,因此将其从我的挂载卷列表中排除。必须执行步骤3才能查看路径是否已实际安装。如果我改为lstat()
在完整路径上调用,它将尝试自动挂载文件系统,这是我需要避免的。
现在,尽管以上大多数情况下都有效,但仍然存在一些问题:
FSGetVolumeInfo()
调用为我提供了诸如“ / net”和“ / home”之类的挂载点,尽管这些挂载点似乎不是实际的挂载点-挂接点宁愿出现在这些内部。例如,如果将NFS共享安装在“ / net / MyNFSVolume”上,则将同时收集“ / net”点和“ / net / MyNFSVolume”,但是“ / net”点不是实际卷。因此,谁能向我展示找到所有实际安装的卷的更好方法?
通过使用BSD级别功能getattrlist()
,请求ATTR_DIR_MOUNTSTATUS
属性,就可以测试该DIR_MNTSTATUS_TRIGGER
标志。
似乎仅在当前无法安装自动安装的共享点时才设置此标志。该标志的状态似乎与automountd
管理重新安装此类挂载点的守护程序所维护的挂载状态直接相关:只要automountd
报告由于服务器未响应而导致挂载点不可用,则“触发” ”标志已设置。
但是请注意,一旦无法访问网络共享,就不会立即设置此状态。考虑这种情况:
文件/etc/auto_master
的末尾添加了以下行:
/- auto_mymounts
该文件/etc/auto_mymounts
具有以下内容:
/mymounts/MYSERVER1 -nfs,soft,bg,intr,net myserver1:/
这意味着将在处有一个自动挂载目录/mymounts/MYSERVER1
,可访问myserver1导出的NFS共享的根目录。
假设服务器最初是可访问的。然后,我们可以浏览目录/ mymounts / MYSERVER1,然后DIR_MNTSTATUS_TRIGGER
将清除该标志。
接下来,让我们通过简单地终止网络连接(例如拔下以太网电缆以关闭Wi-Fi)使服务器变得不可访问。此时,当再次尝试访问/ mymounts / MYSERVER1时,我们将获得延迟和超时,甚至可能获得看似有效的结果,例如尽管服务器不可用,但目录列表仍为空。该DIR_MNTSTATUS_TRIGGER
标志将在此时保持清除状态。
现在,使计算机进入睡眠状态,然后再次将其唤醒。此时,automountd
尝试再次重新连接所有自动安装的卷。它将注意到服务器处于脱机状态,并将挂载点置于“触发”状态。现在,DIR_MNTSTATUS_TRIGGER
将根据需要设置标志。
因此,尽管此触发标志并不是判断远程服务器何时无法访问的理想指示器,但足以判断服务器何时长时间脱机,这通常是在不同网络之间移动客户端计算机时发生的,例如在工作和家庭之间,计算机处于睡眠状态,因此automountd守护程序可以检测NFS服务器的可达性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句