在Linux中检测USB大容量存储弹出/卸载

时间:2009-08-28 09:18:38

标签: linux usb storage removable

我正在使用Linux中的g_file_storage小工具将分区导出为可移动USB大容量存储设备以托管PC(Windows,Linux,MAC)。

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

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

4 个答案:

答案 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)

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

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

  • Mer(maemo opensource fork)确实(afaik)是一系列不同类型的小工具的固件/发行版。当您将此类设备插入USB主机时,它将自动安装,并且还会通知usb主机的卸载。你必须要有一些东西可供使用。您也可以在irc.freenode.net
  • 中找到#mer
  • 如果只通过usb导出,你可以监控usb驱动程序,如果它连接了客户端吗? libusb和gadget usb apis可以提供合适的方式......

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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

你可以检查dmesg输出如下:

  

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