【问题标题】:Detect USB mass storage eject/unmount in Linux在 Linux 中检测 USB 大容量存储弹出/卸载
【发布时间】:2009-08-28 09:18:38
【问题描述】:

我在 Linux 中使用 g_file_storage 小工具将分区作为可移动 USB 大容量存储设备导出到主机 PC(Windows、Linux、MAC)。

所有这些主机操作系统(可以)自动安装可移动磁盘并毫无问题地访问它,我正在寻找一种方法来检测主机是否已弹出/卸载磁盘。

到目前为止,我发现的唯一方法仅限于 Windows XP。当用户选择“安全删除硬件”时,XP 将 USB 设备置于挂起模式,可以在远程端检测到。出于某种原因,这在 Vista 中不起作用。

【问题讨论】:

  • 这不属于超级用户。该解决方案可能与一些 sysfs 监控有关,或者最糟糕的是,内核黑客攻击

标签: linux usb storage removable


【解决方案1】:

我也遇到过这个问题。

我的嵌入式 USB 只读大容量存储项目监视来自主机的 SCSI 命令。使用 Mac OS X (10.5):在插件上,OS X 驱动程序非常好地告诉设备防止删除媒体(SCSI 命令 PREVENT/ALLOW MEDIUM REMOVAL)。我的设备接受此命令。后来,当用户发出应该弹出设备的信号时,OS X 再次非常好地发送带有 ALLOW 标志的 PREVENT/ALLOW REMOVAL,然后发送 SCSI START/STOP 指示停止(或弹出,不记得了)。漂亮。

然而,Windows XP 似乎只是停止发送 SCSI 命令 TEST UNIT READY。我看过; “安全删除硬件”不会发送任何 SCSI 信号,它只会导致 TEST UNIT READY 信号停止出现,而它一直在每秒左右执行一次。基本上,Windows 只是默默无闻。

TEST UNIT READY 超时可能适用于 Windows,但它是检测设备停止条件的糟糕方法。此外,它不适用于 OS X,因为 OS X 不像 Windows 那样每秒都在 ping 我的设备;我会得到一个误报。

2009 年 11 月 15 日更新

Sondergaard 在这里报告。

很大程度上取决于设备对 USB 大容量存储类 SCSI“查询”命令的响应是否将自身标识为“可移动”或“固定”。

如果标志显示可移动,那么我可以判断 Windows XP 用户是否“停止”了我的设备的唯一方法是 test-unit-ready 命令每秒都会退出。如果标志没有说可移动,则没有常规的 test-unit-ready 命令流。也不能指望 USB 挂起,在我大约 1/4 的测试中,“安全移除”没有发送 USB 挂起。不知道为什么不一致。因此,如果您想确定,我可以为仅与 WINDOWS XP 兼容的最佳建议是将 INQUIRY 响应为“可移除”,查找常规 TEST UNIT READY 命令,然后在它们停止时认为您已安全移除。

OS X (10.6) 是另一回事。正如我上面写的,它更有礼貌。它发送 SCSI START/STOP 来加速或减速设备,有时完全独立,无需用户输入。但这意味着,如果您将 STOP 解释为用户已通过,并以任何丑陋的方式断开设备内部的连接,OS X 在尝试再次启动磁盘时会变得非常混乱。如果您的设备被标记为可移动设备,OS X 将在 STOP 之前发送一个 ALLOW REMOVAL 命令(或者在这种情况下是 EJECT 吗?),这将是一个很好的信号。

我没有详尽地尝试不同的配置。我的应用程序是只读的,有两个分区,并且必须标识为不可移动,因为 Windows XP 拒绝承认多个可移动 USB 驱动器的分区(OS X 两种方式都没有问题)。所以我的大部分测试都是在这种配置下进行的。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    遗憾的是我无法给出解决方案,因为我对这个主题并不熟悉,但很少有指点。

    但是,您可以开始检查解决方案的选择很少。

    • Mer (maemo opensource fork) 确实 (afaik) 是用于各种不同类型小工具的固件/发行版。当您将此类设备插入 USB 主机时,它会自动挂载,并且它还会注意到 USB 主机的卸载。一定有一些东西可以让你一起工作。您也可以访问 irc.freenode.net 中的#mer
    • 如果您只通过 USB 导出,您是否可以通过某种方式监控 USB 驱动程序(如果它已连接客户端)? libusb 和 gadget usb apis 适当地提供了合适的方式...

    【讨论】:

      【解决方案3】:

      我不认为主机操作系统必须向小工具发出任何信号。我对 Eject 操作的理解是主机操作系统与小工具不再有任何关系。

      【讨论】:

      • 我也是这么想的。当我在“可移动”模式下使用小工具时,我希望能够以某种方式检测到主机已卸载设备。例如,我的 MP3 播放器可以检测到它,所以一定有办法做到这一点。
      【解决方案4】:

      编辑:即使您将问题标记为 Linux...,您也可能正在寻找 Windows 解决方案...

      你可以像这样检查 dmesg 的输出:

      [31027.944083] USB 2-2:USB 断开连接,地址 2

      【讨论】:

      • 不,他在一个 linux 机器上,试图知道 Windows 主机是否已弹出/卸载磁盘
      • 弹出/卸载 action 发生在主机端(可能是 Window),但我想在设备端(Linux)检测它。不幸的是,设备端(dmesg、udevinfo)没有显示任何关于主机端事件的信息。
      • 是的,当主机连接到小工具时,没有新的“设备”可供linux小工具使用,因此没有关联的热插拔操作,真的很痛苦。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多