我在 Linux 中使用 g_file_storage
小工具将分区作为可移动 USB 大容量存储设备导出到主机 PC(Windows、Linux、MAC)。
所有这些主机操作系统(都可以)自动安装可移动磁盘并毫无问题地访问它,我正在寻找一种方法来检测主机是否已弹出/卸载磁盘。
到目前为止,我发现的唯一方法仅限于 Windows XP。当用户选择“Safely Remove Hardware”时,XP会将USB设备置于挂起模式,远程端可以检测到。由于某些原因,这在 Vista 中不起作用。
最佳答案
我也遇到过这个问题。
我的嵌入式 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 只是保持沉默。
测试单元就绪超时可以在 Windows 上工作,但它是检测设备停止条件的糟糕方法。另外,它不能与 OS X 一起使用,因为 OS X 不会像 Windows 那样每秒都对我的设备执行 ping 操作;我会得到误报。
2009 年 11 月 15 日更新
Sondergaard 在此汇报。
很大程度上取决于设备对 USB 大容量存储级 SCSI“查询”命令的响应是 self 识别为“可移动”还是“固定”。
如果标志显示为可移动,我可以判断 Windows XP 用户是否“停止”了我的设备的唯一方法是测试单元就绪命令每秒退出一次。如果标志没有说可移动,则没有常规的测试单元就绪命令流。两者都不能指望 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 没有任何问题)。所以我的大部分测试都是在这种配置下进行的。
希望这对您有所帮助。
关于linux - 在 Linux 中检测 USB 大容量存储弹出/卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1345901/