Aż do Fedory 14 z powodzeniem cdctl
włączałem / wyłączałem przycisk wysuwania CD / DVD na moim laptopie (Thinkpad T410). Niestety, teraz przestał działać.
Sprawdziłem metody omówione w tych 2 pytaniach:
- wyłącz przycisk cd / dvd na laptopie z Linuksem (ubuntu)
- Wyłącz przycisk wysuwania DVD na Thinkpad z systemem Linux
Żaden z nich nie działał dla mnie. Więc wracam, aby cdctl
sprawdzić, czy nie możemy naprawić tego, co jest zepsute, ponieważ działało to tak długo.
Debugowanie problemu
Począwszy od cdctl
przełączników, zauważam, że większość rzeczy działa dobrze.
Przykłady
Te rzeczy działają.
wysuwa dysk
$ cdctl -e
lista możliwości
$ 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
Według tej listy cdctl
nawet uważa, że może włączyć / wyłączyć przycisk wysuwania.
Can disable eject : 1
Kontynuuję debugowanie problemu.
Debugowanie cdctl
Więc ja figura pozwala wykonać strace
na cdctl
celu sprawdzić, czy może rzucić nieco światła na to, co się dzieje.
$ 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 +++
Co ciekawe, wydaje się, że cdctl
uważa, że wyłącza przycisk.
$ strace cdctl -o1
ioctl(3, CDROM_LOCKDOOR, 0x1) = 0
$ strace cdctl -o0
ioctl(3, CDROM_LOCKDOOR, 0) = 0
UWAGA: Jeśli rozumiem to prawo, zwrócenie wartości 0 oznacza, że się udało.
Jedną z rzeczy, które przykuły moją uwagę, była lista urządzeń, z którymi cdctl
próbuje się współpracować. Pomyślałem więc „co, jeśli wypróbuję te urządzenia eject
”?
polecenie wysuwania
Jednym z innych poleceń, z których korzystałem lata temu, było eject
polecenie interakcji z urządzeniem CD / DVD. Zauważyłem, że to polecenie ma teraz również podobny przełącznik o nazwie:
$ eject --help
-i, --manualeject <on|off> toggle manual eject protection on/off
Przykład
$ 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
Tak eject
też sądzi, że to wyłączenie przycisku, jednak nie jest to albo. Używając strace
tutaj widzę te same wywołania systemowe:
$ 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
Zastanawiam się teraz, czy UDEV lub coś innego może blokować lub przejmować własność urządzenia?
Myśli?
Odpowiedzi:
Dzięki odpowiedzi @ Affix, która dała mi właściwy kierunek, wymyśliłem rozwiązanie problemu.
Problem jest zdecydowanie spowodowany przez UDEV, jak się domyślacie. Problemem jest ten wiersz, który znajduje się w większości plików UDEV związanych z dyskiem cdrom.
Przykład
Na Fedorze 19 jest następujący plik,
/usr/lib/udev/rules.d/60-cdrom_id.rules
. W tym pliku znajduje się następujący wiersz, który kooptuje przycisk wysuwania dla urządzeń CD / DVD.Możesz obejść ten problem i wyłączyć zdolność UDEV do kooptacji przycisku wysuwania, wykonując następujące czynności:
Zrób kopię pliku
60-cdrom_id.rules
Edytuj skopiowana wersja pliku i wykomentuj wiersza zawierającego ciąg znaków
DISK_EJECT_REQUEST
.Zapisz plik, a zmiana powinna być zauważalna natychmiast!
Powyższe rozwiązanie rozwiązuje problem zarówno dla, jak
eject
i dlacdctl
. Więc teraz następujące polecenia działają zgodnie z oczekiwaniami:zablokuj dysk
odblokuj dysk
źródło
/lib/
reguły. Skopiowałem go/etc/udev/rules.d/
i stworzyłem własną wersję nadrzędną.udev
przesłania oczekiwane zachowanie w innym miejscu w Linuksie ... Ale teraz mogę pozwolić KDE zająć się celowym wyrzuceniem i przestać martwić się wypadkami.Dodaj linię:
do reguł udev na CD ROM. Umożliwi to zablokowanie za pomocą:
źródło
udev
? itp. - słaba odpowiedź.