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

13

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

Consultei os métodos discutidos nestas 2 perguntas:

Nenhum dos quais funcionou para mim. Então, volto para cdctlver se não podemos consertar o que está quebrado, pois funcionou por tanto tempo.

Depurando o problema

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

Exemplos

Essas coisas funcionam.

ejeta a unidade

$ cdctl -e

lista de recursos

$ 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, cdctlaté pensa 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, vamos dar uma straceolhada cdctlpara ver se ele pode lançar alguma luz sobre 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 cdctlque 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 eu entendi direito, o retorno de um 0 significa que foi bem-sucedido.

Uma coisa que chamou minha atenção aqui foi a lista de dispositivos que cdctlestão tentando interagir. Então pensei "e se eu experimentar esses dispositivos eject"?

comando ejetar

Um dos outros comandos que eu costumava usar anos atrás era o ejectcomando para interagir com o dispositivo de CD / DVD. Notei que este comando agora também possui um switch nomeado semelhante:

$ 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

Assim ejecttambém pensa que está desativando o botão, mas não é qualquer um. Usando straceaqui, 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 o UDEV ou outra coisa está potencialmente bloqueando ou tomando posse do dispositivo?

Pensamentos?

slm
fonte
1
Eu também tenho um T410 e geralmente me pego pressionando o botão de ejeção da unidade de CD quando não pretendo. Ficarei interessado em ver se isso é resolvido.
WhiteHotLoveTiger
O botão ainda está funcionando quando o disco nessa unidade está montado?
Bonsi Scott
1
Sinto sua dor, tive o mesmo problema: Bloquear unidade de CD / DVD (impedir a ejeção) . Não encontrei solução e acabei removendo a unidade fisicamente, pois era muito chato fazer com que a unidade saísse uma dúzia de vezes por dia. Boa sorte ...
Marco
@Marco - veja a resposta!
slm
@WhiteHotLoveTiger - veja a resposta!
slm

Respostas:

9

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

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

Exemplo

No Fedora 19, há 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 solucionar o problema e desativar a capacidade da 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 esta versão copiada do arquivo e comente a linha que contém a sequência DISK_EJECT_REQUEST,.

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
  3. Salve o arquivo e a alteração deverá ser notada imediatamente!

A solução acima corrige o problema para ambos ejecte cdctl. Portanto, agora os seguintes comandos funcionam conforme o esperado:

bloquear a unidade

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

-or-

$ cdctl -o1

desbloquear a unidade

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

-or-

$ cdctl -o0
slm
fonte
@Marco - Estou confuso com o que você está me perguntando, não mudei a /lib/regra. Copiei /etc/udev/rules.d/e fiz minha própria versão principal.
Slm
@Marco - NP, há lugares amplos para ficar confuso e erros make 8-)
SLM
Obrigado por isso. Confirmado no atual estável Debian (8 / Jessie). Comentar essa linha instantaneamente removeu minha capacidade de, por exemplo, ejetar acidentalmente um Bluray enquanto ele estiver montado ou mesmo tocando. Tenho que amar como udevsubstitui o comportamento esperado em outras partes do Linux ... Mas agora posso deixar o KDE lidar com a ejeção deliberada e parar de me preocupar com acidentes.
Underscore_d
2

Adicione a linha:

DISC_EJECT_REQUEST

às regras do CD ROM udev. Isso permitirá que você bloqueie com:

eject -i
Afixo
fonte
1
A linha realmente necessária para ser removido, pelo menos em meu caso no Fedora 19.
SLM
O mesmo aqui. Mesmo assim: adicione a qual arquivo? entre quais outras linhas? Essa é a linha inteira? Certamente isso não é sintaticamente válido udev? etc - resposta ruim.
Underscore_d