如何禁用我的 CD/DVD 驱动器的按钮?

slm*_*slm 13 linux eject audio-cd data-cd

直到 Fedora 14,我才成功使用cdctl启用/禁用笔记本电脑 (Thinkpad T410) 上的 CD/DVD 弹出按钮。可悲的是它现在已经停止工作。

我已经咨询了这两个问题中讨论的方法:

其中没有一个对我有用。所以我回头cdctl看看我们是否无法修复它的坏处,因为它已经工作了很长时间。

调试问题

所以从cdctl开关开始,我注意到大多数事情似乎都很好。

例子

这些东西有效。

弹出驱动器

$ cdctl -e
Run Code Online (Sandbox Code Playgroud)

列出能力

$ 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
Run Code Online (Sandbox Code Playgroud)

根据该列表cdctl甚至认为它可以启用/禁用弹出按钮。

Can disable eject      : 1
Run Code Online (Sandbox Code Playgroud)

所以我继续调试这个问题。

调试cdctl

所以我想,您做一个stracecdctl,看它是否能够揭示发生了什么事情的一些情况。

$ 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 +++
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它似乎cdctl认为它正在禁用按钮。

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

$ strace cdctl -o0
ioctl(3, CDROM_LOCKDOOR, 0)             = 0
Run Code Online (Sandbox Code Playgroud)

注意:如果我理解正确,返回 0 表示成功。

在这里引起我注意的一件事cdctl是尝试与之交互的设备列表。所以我想“如果我尝试使用这些设备会怎样eject”?

弹出命令

我多年前使用的其他命令之一是eject与 CD/DVD 设备交互的命令。我注意到这个命令现在也有一个类似的命名开关:

$ eject --help
 -i, --manualeject <on|off>  toggle manual eject protection on/off
Run Code Online (Sandbox Code Playgroud)

例子

$ 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
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

所以现在我想知道 UDEV 或其他东西是否可能会阻止或获取设备的所有权?

想法?

slm*_*slm 11

感谢@Affix 的回答给了我正确的前进方向,我已经找到了解决问题的方法。

如您所料,问题肯定是由 UDEV 引起的。问题是与 cdrom 驱动器相关的大多数 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"
Run Code Online (Sandbox Code Playgroud)

您可以通过执行以下操作来解决此问题并禁用 UDEV 选择弹出按钮的功能:

  1. 制作文件的副本 60-cdrom_id.rules

    $ sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑此文件的复制版本并注释掉包含字符串DISK_EJECT_REQUEST.

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
    Run Code Online (Sandbox Code Playgroud)
  3. 保存文件,更改应该立即引起注意!

上述解决方案解决了eject和的问题cdctl。所以现在以下命令按预期工作:

锁定驱动器

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

-or-

$ cdctl -o1
Run Code Online (Sandbox Code Playgroud)

解锁驱动器

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

-or-

$ cdctl -o0
Run Code Online (Sandbox Code Playgroud)