¿Cómo puedo desactivar el botón de mi unidad de CD / DVD?

13

Hasta Fedora 14 estaba usando cdctlcon éxito para habilitar / deshabilitar el botón de expulsión de CD / DVD en mi computadora portátil (Thinkpad T410). Lamentablemente ha dejado de funcionar ahora.

He consultado los métodos discutidos en estas 2 preguntas:

Ninguno de los cuales ha funcionado para mí. Así que vuelvo a cdctlver si no podemos arreglar lo que está roto, ya que ha funcionado durante tanto tiempo.

Depuración del problema

Entonces, comenzando con los cdctlinterruptores, noto que la mayoría de las cosas parecen funcionar bien.

Ejemplos

Estas cosas funcionan.

expulsa el disco

$ cdctl -e

lista de capacidades

$ 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

Según esa lista, cdctlincluso piensa que puede habilitar / deshabilitar el botón de expulsión.

Can disable eject      : 1

Así que continúo con la depuración del problema.

Depuración de cdctl

Así figura que le permite hacer un stracesobre cdctlpara ver si puede arrojar alguna luz sobre lo que está pasando.

$ 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 +++

Curiosamente parece que cdctlpiensa que está desactivando el botón.

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

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

NOTA: Si entiendo este derecho, el retorno de un 0 significa que fue exitoso.

Una cosa que me llamó la atención aquí fue la lista de dispositivos con los que cdctlintenta interactuar. Entonces pensé "¿y si pruebo estos dispositivos con eject"?

comando de expulsión

Uno de los otros comandos que solía usar hace años era el ejectcomando para interactuar con el dispositivo de CD / DVD. Noté que este comando también ahora tiene un interruptor con nombre similar:

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

Ejemplo

$ 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

También ejectpiensa que está deshabilitando el botón, pero tampoco lo está. Usando straceaquí veo las mismas llamadas al sistema:

$ 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

Entonces, ahora me pregunto si UDEV o algo más está potencialmente bloqueando o tomando posesión del dispositivo.

Pensamientos?

slm
fuente
1
También tengo un T410, y a menudo me encuentro presionando el botón de expulsión de la unidad de CD cuando no es mi intención. Me interesará ver si esto se resuelve.
WhiteHotLoveTiger
¿Sigue funcionando el botón cuando el disco en esa unidad está montado?
Bonsi Scott
1
Siento tu dolor, tuve el mismo problema: bloquear la unidad de CD / DVD (evitar la expulsión) . No encontré ninguna solución y terminé quitando el disco físicamente, ya que era demasiado molesto que saliera una docena de veces al día. Buena suerte ...
Marco
@Marco - ¡mira la respuesta!
slm
@WhiteHotLoveTiger - ¡mira la respuesta!
slm

Respuestas:

9

Gracias a la respuesta de @ Affix que me dio la dirección correcta para dirigirme, descubrí la solución al problema.

El problema definitivamente es causado por UDEV como lo has adivinado. El problema es esta línea que se encuentra en la mayoría de los archivos UDEV relacionados con la unidad de CDROM.

Ejemplo

En Fedora 19 se encuentra el siguiente archivo, /usr/lib/udev/rules.d/60-cdrom_id.rules. En este archivo se encuentra la siguiente línea que está cooptando el botón de expulsión para dispositivos CD / DVD.

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

Puede solucionar el problema y deshabilitar la capacidad de UDEV para cooptar el botón de expulsión haciendo lo siguiente:

  1. Haga una copia del archivo. 60-cdrom_id.rules

    $ sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
    
  2. Editar esta versión copiada del archivo y comentar la línea que contiene la cadena, DISK_EJECT_REQUEST.

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
  3. ¡Guarde el archivo y el cambio debería notarse de inmediato!

La solución anterior soluciona el problema para ambos ejecty cdctl. Entonces, los siguientes comandos funcionan como se esperaba:

bloquear el disco

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

-or-

$ cdctl -o1

desbloquear el disco

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

-or-

$ cdctl -o0
slm
fuente
@Marco: estoy confundido con lo que me preguntas, no cambié la /lib/regla. Lo copié /etc/udev/rules.d/e hice mi propia versión principal.
slm
@Marco - NP, hay muchos lugares para confundirse y cometer errores 8-)
slm
Gracias por esto. Confirmado en el actual Debian estable (8 / Jessie). Al comentar esa línea, instantáneamente eliminé mi capacidad para, por ejemplo, expulsar accidentalmente un Bluray mientras está montado o incluso jugando. Me encanta cómo udevanula el comportamiento esperado en otras partes de Linux ... Pero ahora puedo dejar que KDE maneje la expulsión deliberada y deje de preocuparse por los accidentes.
underscore_d
2

Agrega la línea:

DISC_EJECT_REQUEST

a las reglas de CD ROM udev. Esto te permitirá bloquear con:

eject -i
Afijo
fuente
1
La línea realmente necesitaba ser eliminada, al menos en mi caso en Fedora 19.
slm
Igual que aquí. Aun así: ¿agregarlo a qué archivo? ¿entre qué otras líneas? ¿Es esa la línea completa? ¿Seguramente eso no es sintácticamente válido para udev? etc. - mala respuesta.
underscore_d