我正在使用g_file_storage
Linux 中的小工具将分区作为可移动 USB 大容量存储设备导出到主机 PC(Windows、Linux、MAC)。
所有这些主机操作系统(可以)自动安装可移动磁盘并毫无问题地访问它,我正在寻找一种方法来检测主机是否已弹出/卸载磁盘。
到目前为止,我发现的唯一方法仅限于 Windows XP。当用户选择“安全删除硬件”时,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 只是默默无闻。
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 两种方式都没有问题)。所以我的大部分测试都是在这种配置下进行的。
希望这可以帮助。
可悲的是,我无法给出解决方案,因为我对这个话题并不熟悉,但很少有指点。
但是,您可以开始检查解决方案的选择很少。
我不认为主机操作系统必须向小工具发出任何信号。我对 Eject 操作的理解是主机操作系统与小工具无关。
编辑:即使您将问题标记为 Linux,您也可能正在寻找 Windows 解决方案...
你可以像这样检查 dmesg 的输出:
[31027.944083] USB 2-2:USB 断开,地址 2