Як я можу відключити кнопку мого 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 або щось інше потенційно блокує або приймає право власності на пристрій?

Думки?


1
У мене також є T410, і часто я натискаю кнопку виймання CD-диска, коли цього не хочу. Мені буде цікаво подивитися, чи це вирішиться.
WhiteHotLoveTiger

Чи все ще працює кнопка, коли диск на цьому накопичувачі встановлений?
Бонсі Скотт

1
Я відчуваю, що ти болиш, у мене була та сама проблема: заблокувати диск CD / DVD (запобігти витягуванню) . Я не знайшов рішення і в кінцевому рахунку видалив накопичувач фізично, оскільки це було занадто прикро, щоб накопичувач вискакував десяток разів на день. Удачі…
Марко

@Marco - дивіться відповідь!
slm

@WhiteHotLoveTiger - дивіться відповідь!
slm

Відповіді:


9

Завдяки відповіді @ Affix, яка дала мені правильний напрямок, я вирішив вирішення проблеми.

Проблема, безумовно, викликана UDEV, як ви здогадалися. Проблема полягає в цьому рядку, який є в більшості файлів UDEV, пов'язаних з компакт-диском.

Приклад

У 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

@Marco - Мене бентежить те, що ви мене просите, я не змінив /lib/правило. Я скопіював це /etc/udev/rules.d/і зробив власну переважну версію.
slm

@Marco - NP, є багато місць, щоб заплутатися та помилитися 8-)
slm

Дякую за це Підтверджено в поточній консолі Debian (8 / Джессі). Коментуючи цей рядок, миттєво усунув мою здатність, наприклад, випадково вийняти Bluray під час встановлення або навіть відтворення. Мені подобається, як udevперекриває очікувану поведінку в інших місцях Linux ... Але тепер я можу дозволити KDE впоратися із навмисним викидом та перестати турбуватися про аварії.
підкреслюй_d

2

Додати рядок:

DISC_EJECT_REQUEST

до правил CD ROM udev. Це дозволить вам заблокувати за допомогою:

eject -i

1
Рядок насправді потрібно було видалити, принаймні в моєму випадку на Fedora 19.
slm

Те ж саме. Навіть так: додати його до якого файлу? між якими іншими лініями? Це весь рядок? Звичайно, це не синтаксично udev? тощо - погана відповідь.
підкреслити_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.