Como posso desabilitar o botão da minha unidade de CD / DVD?

13

Até o Fedora 14 eu estava usando com sucesso cdctl para ativar / desativar o botão de ejeção de CD / DVD no meu laptop (Thinkpad T410). Infelizmente, parou de funcionar agora.

Eu consultei os métodos discutidos nestas duas perguntas:

Nada disso funcionou para mim. Então eu volto para cdctl para ver se não podemos consertar o que está quebrado, já que funcionou por tanto tempo.

Depurando o problema

Então, começando com cdctl , percebo que a maioria das coisas parece funcionar bem.

Exemplos

Essas coisas funcionam.

ejeta a unidade

$ cdctl -e

recursos de lista

$ 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

De acordo com essa lista, cdctl acha que pode ativar / desativar o botão de ejeção.

Can disable eject      : 1

Então continuo com a depuração do problema.

Depurando cdctl

Então, imagino que vamos fazer um strace on cdctl para ver se isso pode esclarecer o que está acontecendo.

$ 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 cdctl acha que está desativando o botão.

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

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

NOTA: Se bem entendi, o retorno de um 0 significa que foi bem-sucedido.

Uma coisa que chamou minha atenção foi a lista de dispositivos com os quais cdctl está tentando interagir. Então eu pensei "e se eu experimentar esses dispositivos com eject "?

comando de ejecção

Um dos outros comandos que usei anos atrás foi o comando eject para interagir com o dispositivo de CD / DVD. Notei que este comando também agora tem um switch com nome similar:

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

Exemplo

$ 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

Portanto, eject também acha que está desativando o botão, mas também não é. Usando strace , vejo as mesmas chamadas de 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

Então, agora estou me perguntando se a UDEV ou alguma outra coisa está bloqueando ou apropriando-se do dispositivo?

Pensamentos?

    
por slm 12.12.2013 / 03:37

2 respostas

9

Graças à resposta do @ Affix, que me deu a direção certa, descobri a solução para o problema.

O problema é definitivamente causado pela UDEV como você adivinhou. O problema é essa linha que está na maioria dos arquivos UDEV relacionados à unidade de cdrom.

Exemplo

No Fedora 19 existe o seguinte arquivo, /usr/lib/udev/rules.d/60-cdrom_id.rules . Neste arquivo está a seguinte linha que está cooptando o botão de ejeção para dispositivos de CD / DVD.

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

Você pode contornar o problema e desabilitar a capacidade do UDEV de cooptar o botão de ejeção fazendo o seguinte:

  1. Faça uma cópia do arquivo 60-cdrom_id.rules

    $ sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
    
  2. Edite a versão copiada do arquivo e comente a linha que contém a string DISK_EJECT_REQUEST .

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
  3. Salve o arquivo e a mudança deve ser perceptível imediatamente!

A solução acima corrige o problema para eject e cdctl . Então agora os seguintes comandos funcionam como esperado:

bloqueia a unidade

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

-or-

$ cdctl -o1

desbloqueia a unidade

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

-or-

$ cdctl -o0
    
por 12.12.2013 / 23:33
2

Adicione a linha:

DISC_EJECT_REQUEST

para as regras do udev do CD-ROM. Isso permitirá que você bloqueie com:

eject -i
    
por 12.12.2013 / 23:12