Почему доступ к sr0 закрывает лоток, но возвращает ошибку, когда привод выбирает CD / DVD / Blu-Ray?

Я видел такое поведение в дистрибутивах (возможно, также в операционных системах) и в разных моделях / моделях дисковода для оптических носителей. Появляется любой привод CD, DVD и / или Blu-Ray, если была предпринята попытка open() /dev/sr0 при открытом лотке, лоток закроется, и пока он не закончит закрывать вызов на open() заблокирует. Как только лоток заканчивает закрываться, накопитель переходит в состояние «идентификации», в котором он пытается определить, какой тип носителя находится в нем (есть ли на нем компакт-диск, DVD-диск, Blu-Ray или что-то еще, и, следовательно, какой лазер на нем находится. Следует использовать), что обычно занимает несколько секунд, в течение которых любые вызовы функции open() на устройстве (включая вызов, вызвавший в первую очередь закрытие лотка) завершатся с ошибкой без носителя.

Перефразируй:

  1. Лоток для компакт-дисков открывается, и пользователь вставляет диск.

  2. Запускается какая-то команда, которая открывает / dev / sr0 для чтения или записи (например, mount , dd , dvdbackup и т. Д.)

  3. Лоток для компакт-дисков закроется сам, и команда заблокируется, пока лоток не закроется полностью.

  4. Как только лоток заканчивает закрываться, команда немедленно сообщает об отсутствии носителя и о выходе. Диск начинает идентифицировать вновь загруженный носитель.
  5. Пользователь пытается выполнить команду еще раз до завершения фазы идентификации (во время которой, очевидно, не установлен какой-либо флаг «присутствия носителя»). Команда мгновенно завершается с ошибкой отсутствия носителя.
  6. Через несколько секунд накопитель готов к чтению носителя.
  7. Пользователь запускает команду в третий раз. На этот раз команда выполнена успешно.

Моя теория о том, что происходит (это всего лишь теория):

  1. На шаге 2 вышеизложенного Linux отправляет запрос на диск. Накопитель видит, что его лоток открыт, и закрывает его.
  2. Лоток завершает закрытие, и накопитель сообщает операционной системе, что он вступил в фазу идентификации, возможно, установив какой-либо флаг «занят» и очистив «присутствующий носитель» или что-то еще.
  3. Linux, видя, что флаг «присутствующего носителя» ясен, немедленно сообщает приложению, что ему нечего делать.

Мой первый вопрос: почему это происходит? Почему Linux не проверяет флаг занятости? Windows делает (или, по крайней мере, выглядит так, как есть; в некоторых версиях значок CD появляется рядом с курсором во время этой фазы идентификации). Мой второй вопрос, есть ли способ обойти это? Есть ли способ узнать, без полного обхода ядра, находится ли DVD-привод в фазе идентификации или в нем действительно нет носителя?