我已经在发行版(可能也跨操作系统)和光介质驱动器品牌/型号中看到了这种行为。对于任何 CD、DVD 和/或蓝光驱动器,如果open()
/dev/sr0
在托盘打开时尝试这样做,托盘将关闭,并且在完成关闭之前,调用open()
将被阻止。一旦托盘完成关闭,驱动器就会进入“识别”状态,在该状态下,驱动器将尝试确定其中的介质类型(是否有 CD、DvD、蓝光或其他内容,以及它使用哪种激光)应使用),这通常需要几秒钟,在此期间open()
对设备的任何调用(包括首先导致托盘关闭的调用)都将失败,并出现无媒体错误。
换一种方式:
用户打开CD托盘并放入光盘。
运行一些命令将打开 /dev/sr0 进行读取或写入(例如
mount
,dd
等dvdbackup
)CD 托盘将自行关闭,并且该命令将被阻止,直到托盘完全关闭为止。
- 一旦托盘完成关闭,该命令立即报告没有介质并退出。驱动器开始识别新加载的介质。
- 用户在识别阶段完成之前尝试再次运行该命令(在此期间显然未设置某些“媒体存在”标志)。该命令立即失败,并出现相同的“无介质”错误。
- 几秒钟后,驱动器就可以读取介质了。
- 用户第三次运行该命令。这次命令成功了。
我对正在发生的事情的理论(这只是一个理论):
- 在上述步骤 2 中,Linux 向驱动器发出请求。驱动器发现其托盘已打开,并将其关闭。
- 托盘完成关闭,驱动器向操作系统报告它已进入识别阶段,可能是通过设置一些“忙”标志并清除“媒体存在”或您拥有的东西。
- Linux 看到“媒体存在”标志已清除,立即向应用程序报告它无事可做。
我的第一个问题是,为什么会发生这种情况?为什么 Linux 不检查 busy 标志? Windows 是这样(或者至少看起来是这样;在某些版本中,在此识别阶段,光标旁边会出现一个 CD 图标)。我的第二个问题是,有什么办法可以解决这个问题吗?有没有办法在不完全绕过内核的情况下知道 DVD 驱动器是否处于识别阶段或者其中是否确实没有介质?