Как я могу отключить кнопку моего CD / DVD привода?

13

Вплоть до Fedora 14 я успешно использовал cdctlдля включения / выключения кнопку извлечения CD / DVD на моем ноутбуке (Thinkpad T410). К сожалению, он перестал работать сейчас.

Я ознакомился с методами, обсуждаемыми в этих двух вопросах:

Ни один из которых не работал для меня. Поэтому я возвращаюсь к тому, cdctlчтобы увидеть, не можем ли мы исправить то, что с ним не так, так как это работало так долго.

Отладка проблемы

Итак, начиная с cdctlпереключателей, я замечаю, что большинство вещей работает нормально.

Примеры

Эти вещи работают.

извлекает диск

$ cdctl -e

список возможностей

$ cdctl -k
Tray close             : 1
Tray open              : 1
Can disable eject      : 1
Selectable spin speed  : 1
Is a jukebox           : 0
Is multisession capable: 1
Can read the MCN (UPC) : 1
Can report media change: 1
Can play audio discs   : 1
Can do a hard reset    : 1
Can report drive status: 1

Согласно этому списку cdctlдаже считает, что он может включить / отключить кнопку извлечения.

Can disable eject      : 1

Итак, я продолжаю отлаживать проблему.

Отладка cdctl

Так что цифра позволяет выполнить команду straceна , cdctlчтобы увидеть , если он может пролить свет на то, что происходит.

$ strace cdctl -o1
...
brk(0)                                  = 0x1371000
open("/dev/cdrom", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/dev/cd", O_RDONLY|O_NONBLOCK)    = -1 ENOENT (No such file or directory)
open("/dev/scd0", O_RDONLY|O_NONBLOCK)  = -1 ENOENT (No such file or directory)
open("/dev/sr0", O_RDONLY|O_NONBLOCK)   = 3
ioctl(3, CDROM_LOCKDOOR, 0x1)           = 0
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Любопытно, что он cdctlдумает, что отключает кнопку.

$ strace cdctl -o1
ioctl(3, CDROM_LOCKDOOR, 0x1)           = 0

$ strace cdctl -o0
ioctl(3, CDROM_LOCKDOOR, 0)             = 0

ПРИМЕЧАНИЕ. Если я правильно понимаю, возвращение 0 означает, что оно прошло успешно.

Одна вещь, которая попалась мне на глаза, была списком устройств, с которыми cdctlпытаются взаимодействовать. Вот я и подумал "а что если я попробую эти устройства с eject"?

команда извлечения

Одной из других команд, которые я использовал несколько лет назад, была ejectкоманда взаимодействия с устройством CD / DVD. Я заметил, что эта команда также теперь имеет аналогичный именованный ключ:

$ eject --help
 -i, --manualeject <on|off>  toggle manual eject protection on/off

пример

$ eject -i 1 /dev/sr0
eject: CD-Drive may NOT be ejected with device button

$ eject -i 0 /dev/sr0
eject: CD-Drive may be ejected with device button

Так что ejectтоже думает, что это отключение кнопки, но это не так. Используя straceздесь я вижу те же системные вызовы:

$ strace eject -i 1 /dev/sr0 |& grep ioctl
ioctl(3, CDROM_LOCKDOOR, 0x1)           = 0

$ strace eject -i 0 /dev/sr0 |& grep ioctl
ioctl(3, CDROM_LOCKDOOR, 0)             = 0

Так что теперь мне интересно, если UDEV или что-то еще потенциально блокирует или приобретает устройство?

Мысли?

SLM
источник
1
У меня также есть T410, и я часто нажимаю на кнопку извлечения CD-привода, когда я этого не хочу. Мне будет интересно посмотреть, будет ли это решено.
WhiteHotLoveTiger
Кнопка все еще работает, когда диск в этом диске смонтирован?
Бонси Скотт
1
Я чувствую вашу боль, у меня была та же проблема: заблокировать CD / DVD привод (предотвратить извлечение) . Я не нашел решения и в итоге удалил диск физически, так как это было слишком раздражающим, чтобы привод вынимал дюжину раз в день. Удачи ...
Марко
@ Марко - посмотри ответ!
SLM
@WhiteHotLoveTiger - посмотрите ответ!
SLM

Ответы:

9

Благодаря ответу @ Affix, который дал мне правильное направление, я нашел решение проблемы.

Проблема определенно вызвана UDEV, как вы уже догадались. Проблема заключается в этой строке, которая есть в большинстве файлов UDEV, связанных с диском cdrom.

пример

На Fedora 19 есть следующий файл /usr/lib/udev/rules.d/60-cdrom_id.rules. В этом файле находится следующая строка, в которой используется кнопка извлечения для CD / DVD-устройств.

ENV{DISK_EJECT_REQUEST}=="?*", RUN+="cdrom_id --eject-media $devnode", GOTO="cdrom_end"

Вы можете обойти эту проблему и отключить способность UDEV кооптировать кнопку извлечения, выполнив следующие действия:

  1. Сделайте копию файла 60-cdrom_id.rules

    $ sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
    
  2. Редактировать эту скопировано версию файла и закомментируйте строку , содержащую строку, DISK_EJECT_REQUEST.

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
  3. Сохраните файл и изменения должны быть заметны немедленно!

Приведенное выше решение устраняет проблему как для, так ejectи для cdctl. Теперь следующие команды работают как положено:

заблокировать диск

$ eject -i on /dev/sr0
eject: CD-Drive may NOT be ejected with device button

-or-

$ cdctl -o1

разблокировать диск

$ eject -i off /dev/sr0
eject: CD-Drive may be ejected with device button

-or-

$ cdctl -o0
SLM
источник
@ Марко - я запутался в том, что ты меня спрашиваешь, я не менял /lib/правила. Я скопировал его /etc/udev/rules.d/и сделал свою собственную основную версию.
slm
@Marco - NP, есть много мест, где можно запутаться и ошибиться 8-)
slm
Спасибо за это. Подтверждено в текущей стабильной версии Debian (8 / Джесси). Комментирование этой строки мгновенно лишило меня возможности, например, случайно вытолкнуть Bluray, когда он подключен или даже играет. Должен любить, как udevпереопределяет ожидаемое поведение в других местах в Linux ... Но теперь я могу позволить KDE справиться с преднамеренным выбросом и перестать беспокоиться об авариях.
underscore_d
2

Добавьте строку:

DISC_EJECT_REQUEST

на CD-ROM правила Udev. Это позволит вам заблокировать с помощью:

eject -i
Affix
источник
1
Эту строку на самом деле нужно было удалить, по крайней мере, в моем случае на Fedora 19.
slm
Тоже самое. Даже так: добавить его в какой файл? между какими другими линиями? Это вся линия? Конечно, это не синтаксически верно для udev? и т.д. - плохой ответ.
underscore_d