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

标签 linux usb storage removable

我在 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/

相关文章:

linux - MariaDB gcomm 后端连接失败 110

c - 内核 - Linux - 内核在哪里与 cpu 对话?

ubuntu - 自动完成高级解释

C: 存储命令历史的数据库

xml - 在内部,Postgres 如何存储 XML 数据?

linux - 使用 bash 仅打印文件中的某些行

linux - 假设我正在运行一个名为 RTP.sh 的脚本并且它停止了。是否有任何命令可以知道特定进程何时在 ubuntu 中停止?

linux - 在 pppd 连接时向 USB 3G 调制解调器发送 AT 命令

java - 通过编程访问 USB 电缆引脚排列

java - 我们可以通过简单的 USB 线将 Android 数据传输到桌面应用程序吗?