Até o Fedora 14, eu estava usando cdctl
com 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:
- desativar botão cd / dvd no laptop linux (ubuntu)
- Desative o botão de ejeção do DVD em um Thinkpad executando Linux
Nenhum dos quais funcionou para mim. Então, volto para cdctl
ver se não podemos consertar o que está quebrado, pois funcionou por tanto tempo.
Depurando o problema
Então, começando com os cdctl
switches, 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, cdctl
até 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 strace
olhada cdctl
para 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 cdctl
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 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 cdctl
estã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 eject
comando 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 eject
também pensa que está desativando o botão, mas não é qualquer um. Usando strace
aqui, 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?
Respostas:
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.Você pode solucionar o problema e desativar a capacidade da UDEV de cooptar o botão de ejeção, fazendo o seguinte:
Faça uma cópia do arquivo
60-cdrom_id.rules
Edite esta versão copiada do arquivo e comente a linha que contém a sequência
DISK_EJECT_REQUEST
,.Salve o arquivo e a alteração deverá ser notada imediatamente!
A solução acima corrige o problema para ambos
eject
ecdctl
. Portanto, agora os seguintes comandos funcionam conforme o esperado:bloquear a unidade
desbloquear a unidade
fonte
/lib/
regra. Copiei/etc/udev/rules.d/
e fiz minha própria versão principal.udev
substitui 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.Adicione a linha:
às regras do CD ROM udev. Isso permitirá que você bloqueie com:
fonte
udev
? etc - resposta ruim.