【问题标题】:Determine actually mounted volumes and remote file systems in OSX确定 OSX 中实际安装的卷和远程文件系统
【发布时间】:2015-02-17 17:10:37
【问题描述】:

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

这包括:

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

但我需要避免访问任何可以自动挂载但当前未挂载的文件系统。即,我不想导致任何自动金额。

我目前的方法如下:

  1. 在循环中调用FSGetVolumeInfo() 以收集所有已知卷。这将为我提供/Volumes/net, /home 下的所有本地驱动器,以及/net 下的NFS 挂载。
  2. 调用 FSGetVolumeParms() 以获取每个卷的“设备 ID”(事实证明这是网络卷的挂载路径)。
  3. 如果 ID 是 POSIX 路径(即它以“/”开头),我在其路径的父级上使用 readdir() 来检查父级目录是否实际包含挂载点项目(例如,如果 ID 是 /net/MyNetShare,然后我读了/net)。如果它不可用,我认为这是一个带有尚未安装卷的自动安装点,因此将其从我的已安装卷列表中排除。
  4. 最后,如果卷显示为已安装,我会检查它是否包含任何项目。如果有,我会将其添加到我的列表中。

第 3 步是需要查看路径是否实际挂载的。如果我改为在完整路径上调用 lstat(),它会尝试自动挂载文件系统,这是我需要避免的。

现在,尽管上述方法大部分时间都有效,但仍然存在一些问题:

  • 对 BSD 和 Carbon API 的调用组合以及“设备 ID”值的特殊大小写相当不干净。
  • FSGetVolumeInfo() 调用为我提供了诸如“/net”和“/home”之类的挂载点,即使它们似乎不是实际的挂载点 - 挂载点更愿意出现在 内部这些.例如,如果我在“/net/MyNFSVolume”上挂载 NFS 共享,我会同时收集“/net”点和“/net/MyNFSVolume”,但“/net”点不是实际卷.
  • 最糟糕的是,有时上述过程仍然会导致主动尝试联系离线服务器,从而导致长时间超时。

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

【问题讨论】:

    标签: macos unix filesystems


    【解决方案1】:

    通过使用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 服务器的可达性。

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多