为什么在驱动器选择 CD/DVD/Blu-Ray 时访问 sr0 会关闭托盘但会返回错误?

为什么在驱动器选择 CD/DVD/Blu-Ray 时访问 sr0 会关闭托盘但会返回错误?

我已经在发行版(可能也跨操作系统)和光介质驱动器品牌/型号中看到了这种行为。对于任何 CD、DVD 和/或蓝光驱动器,如果open() /dev/sr0在托盘打开时尝试这样做,托盘将关闭,并且在完成关闭之前,调用open()将被阻止。一旦托盘完成关闭,驱动器就会进入“识别”状态,在该状态下,驱动器将尝试确定其中的介质类型(是否有 CD、DvD、蓝光或其他内容,以及它使用哪种激光)应使用),这通常需要几秒钟,在此期间open()对设备的任何调用(包括首先导致托盘关闭的调用)都将失败,并出现无媒体错误。

换一种方式:

  1. 用户打开CD托盘并放入光盘。

  2. 运行一些命令将打开 /dev/sr0 进行读取或写入(例如mountdddvdbackup

  3. CD 托盘将自行关闭,并且该命令将被阻止,直到托盘完全关闭为止。

  4. 一旦托盘完成关闭,该命令立即报告没有介质并退出。驱动器开始识别新加载的介质。
  5. 用户在识别阶​​段完成之前尝试再次运行该命令(在此期间显然未设置某些“媒体存在”标志)。该命令立即失败,并出现相同的“无介质”错误。
  6. 几秒钟后,驱动器就可以读取介质了。
  7. 用户第三次运行该命令。这次命令成功了。

我对正在发生的事情的理论(这只是一个理论):

  1. 在上述步骤 2 中,Linux 向驱动器发出请求。驱动器发现其托盘已打开,并将其关闭。
  2. 托盘完成关闭,驱动器向操作系统报告它已进入识别阶段,可能是通过设置一些“忙”标志并清除“媒体存在”或您拥有的东西。
  3. Linux 看到“媒体存在”标志已清除,立即向应用程序报告它无事可做。

我的第一个问题是,为什么会发生这种情况?为什么 Linux 不检查 busy 标志? Windows 是这样(或者至少看起来是这样;在某些版本中,在此识别阶段,光标旁边会出现一个 CD 图标)。我的第二个问题是,有什么办法可以解决这个问题吗?有没有办法在不完全绕过内核的情况下知道 DVD 驱动器是否处于识别阶段或者其中是否确实没有介质?

相关内容