确定OSX中实际安装的卷和远程文件系统

时间:2015-02-17 17:10:37

标签: macos unix filesystems

我需要收集本地文件系统可以访问的所有已挂载“挂载点”的列表。

这包括:

  • /Volumes
  • 下的任何常用量
  • 当前在/net下安装的任何NFS卷。
  • 使用“mount”命令挂载或以某种方式自动挂载的任何本地或远程文件系统。

但是我需要避免访问任何可以自动挂载但当前未挂载的文件系统。即,我不想引起任何自动累积。

我目前的方法如下:

  1. 在循环中调用FSGetVolumeInfo()以收集所有已知卷。这将为我提供/Volumes以及/net, /home下的所有本地驱动器,以及/net下的NFS安装。
  2. 调用FSGetVolumeParms()获取每个卷的“设备ID”(这最终成为网络卷的安装路径)。
  3. 如果ID是POSIX路径(即它以“/”开头),我在其路径的父路径上使用readdir()来检查父目录是否实际包含挂载点项(例如,如果ID为{{ 1}},然后我读了/net/MyNetShare)。如果它不可用,我认为这是一个具有尚未卸载的卷的自动挂载点,因此将其从我的挂载卷列表中排除。
  4. 最后,如果卷显示已挂载,我会检查它是否包含任何项目。如果是,我将其添加到我的列表中。
  5. 步骤3是必要的,以查看路径是否实际安装。如果我改为在完整路径上调用/net,它将尝试自动挂载文件系统,我需要避免这种情况。

    现在,即使上述情况大部分时间都有效,但仍存在一些问题:

    • 调用BSD和Carbon API的混合,以及“设备ID”值的特殊大小,是相当不洁净的。
    • lstat()调用给出了挂载点,例如“/ net”和“/ home”,即使这些看起来不是实际挂载点 - 挂载点也会在里面显示 >这些。例如,如果我在“/ net / MyNFSVolume”挂载NFS共享,我会收集“/ net”点和“/ net / MyNFSVolume”,但“/ net”点不是实际卷
    • 最糟糕的是,有时上述过程仍会导致主动尝试联系离线服务器,导致超时。

    那么,谁能告诉我一个更好的方法来找到所有实际安装的卷?

1 个答案:

答案 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服务器的可达性。