我需要收集本地文件系统可以访问的所有已挂载“挂载点”的列表。
这包括:
/Volumes
。/net
下安装的任何NFS卷。但是我需要避免访问任何可以自动挂载但当前未挂载的文件系统。即,我不想引起任何自动累积。
我目前的方法如下:
FSGetVolumeInfo()
以收集所有已知卷。这将为我提供/Volumes
以及/net, /home
下的所有本地驱动器,以及/net
下的NFS安装。FSGetVolumeParms()
获取每个卷的“设备ID”(这最终成为网络卷的安装路径)。readdir()
来检查父目录是否实际包含挂载点项(例如,如果ID为{{ 1}},然后我读了/net/MyNetShare
)。如果它不可用,我认为这是一个具有尚未卸载的卷的自动挂载点,因此将其从我的挂载卷列表中排除。步骤3是必要的,以查看路径是否实际安装。如果我改为在完整路径上调用/net
,它将尝试自动挂载文件系统,我需要避免这种情况。
现在,即使上述情况大部分时间都有效,但仍存在一些问题:
lstat()
调用给出了挂载点,例如“/ net”和“/ home”,即使这些看起来不是实际挂载点 - 挂载点也会在里面显示 >这些。例如,如果我在“/ net / MyNFSVolume”挂载NFS共享,我会收集“/ net”点和“/ net / MyNFSVolume”,但“/ net”点不是实际卷那么,谁能告诉我一个更好的方法来找到所有实际安装的卷?
答案 0 :(得分:0)
通过使用BSD级别函数getattrlist()
,要求ATTR_DIR_MOUNTSTATUS
属性,可以测试DIR_MNTSTATUS_TRIGGER
标志。
此标志似乎仅在当前无法访问自动挂载共享点时设置。此标志的状态似乎与管理重新安装此类挂载点的automountd
守护程序维护的挂载状态直接相关:只要automountd
报告挂载点不是{0}}可用,由于服务器没有响应,"触发"国旗已经设定。
但请注意,一旦网络共享无法访问,就不会立即设置此状态。请考虑以下情况:
文件/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服务器的可达性。