我正在使用Linux中的g_file_storage
小工具将分区导出为可移动USB大容量存储设备以托管PC(Windows,Linux,MAC)。
所有这些主机操作系统(可以)自动挂载可移动磁盘并且可以毫无问题地访问它,我正在寻找一种方法来检测主机是否已经弹出/卸载磁盘。
到目前为止,我发现的唯一方法仅限于Windows XP。当用户选择“安全删除硬件”时,XP将USB设备置于可以在远程端检测到的挂起模式。出于某种原因,这在Vista中不起作用。
答案 0 :(得分: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 Mass-Storage-Class SCSI“查询”命令的响应是否自我识别为“可移动”或“固定”。
如果该标志显示为可移动,那么我可以判断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),这将是一个非常好的迹象表明它已经通过。
我没有详尽地尝试不同的配置。我的应用程序是只读的两个分区,并且必须标识为NON可移动,因为Windows XP拒绝确认可移动USB驱动器的多个分区(OS X无论哪种方式都没有问题)。所以我的大多数测试都在这个配置中。
希望这有帮助。
答案 1 :(得分:1)
可悲的是,我不能给出解决方案,因为我对这个主题并不熟悉,但很少有人指点。
但是您可以选择开始检查解决方案。
答案 2 :(得分:0)
我不认为主机操作系统必须向小工具发出任何信号。我对Eject操作的理解是主机操作系统与小工具无关。
答案 3 :(得分:-1)
你可以检查dmesg输出如下:
[31027.944083] usb 2-2:USB 断开连接,地址2