3

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

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

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

4

4 回答 4

4

我也遇到过这个问题。

我的嵌入式 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 两种方式都没有问题)。所以我的大部分测试都是在这种配置下进行的。

希望这可以帮助。

于 2009-09-07T21:31:39.447 回答
1

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

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

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

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

于 2009-08-28T09:59:27.400 回答
-1

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

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

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

于 2009-08-28T09:48:32.227 回答