Jak mogę wyłączyć przycisk napędu CD / DVD?


13

Aż do Fedory 14 z powodzeniem cdctlwłą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:

Żaden z nich nie działał dla mnie. Więc wracam, aby cdctlsprawdzić, czy nie możemy naprawić tego, co jest zepsute, ponieważ działało to tak długo.

Debugowanie problemu

Począwszy od cdctlprzełą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 cdctlnawet 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ć stracena cdctlcelu 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 cdctluważ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 cdctlpró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 ejectpolecenie 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 ejectteż sądzi, że to wyłączenie przycisku, jednak nie jest to albo. Używając stracetutaj 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?


1
Mam też T410 i często nie mam ochoty naciskać przycisk wysuwania napędu CD. Będę zainteresowany zobaczyć, czy to zostanie rozwiązane.
WhiteHotLoveTiger

Czy przycisk nadal działa, gdy dysk w tym napędzie jest zamontowany?
Bonsi Scott,

1
Czuję twój ból, miałem ten sam problem: Zablokuj napęd CD / DVD (zapobiegnij wysunięciu) . Nie znalazłem rozwiązania i fizycznie usunąłem dysk, ponieważ było to zbyt denerwujące, aby dysk wyskakiwał kilkanaście razy dziennie. Powodzenia…
Marco

@Marco - zobacz odpowiedź!
slm

@WhiteHotLoveTiger - zobacz odpowiedź!
slm

Odpowiedzi:


9

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.

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

Możesz obejść ten problem i wyłączyć zdolność UDEV do kooptacji przycisku wysuwania, wykonując następujące czynności:

  1. Zrób kopię pliku 60-cdrom_id.rules

    $ sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
    
  2. Edytuj skopiowana wersja pliku i wykomentuj wiersza zawierającego ciąg znaków DISK_EJECT_REQUEST.

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
  3. Zapisz plik, a zmiana powinna być zauważalna natychmiast!

Powyższe rozwiązanie rozwiązuje problem zarówno dla, jak ejecti dla cdctl. Więc teraz następujące polecenia działają zgodnie z oczekiwaniami:

zablokuj dysk

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

-or-

$ cdctl -o1

odblokuj dysk

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

-or-

$ cdctl -o0

@Marco - nie rozumiem, o co mnie pytasz, nie zmieniłem /lib/reguły. Skopiowałem go /etc/udev/rules.d/i stworzyłem własną wersję nadrzędną.
slm

@Marco - NP, istnieje wiele miejsc, w których można się pomylić i popełnić błędy 8-)
slm

Dzięki za to. Potwierdzono w bieżącej stabilnej wersji Debiana (8 / Jessie). Komentowanie tej linii natychmiast usunęło moją możliwość np. Przypadkowego wyrzucenia Bluray'a, gdy jest on zamontowany lub nawet gra. Uwielbiam to, jak udevprzesłania oczekiwane zachowanie w innym miejscu w Linuksie ... Ale teraz mogę pozwolić KDE zająć się celowym wyrzuceniem i przestać martwić się wypadkami.
underscore_d

2

Dodaj linię:

DISC_EJECT_REQUEST

do reguł udev na CD ROM. Umożliwi to zablokowanie za pomocą:

eject -i

1
Linia faktycznie musiała zostać usunięta, przynajmniej w moim przypadku na Fedorze 19.
slm

To samo tutaj. Mimo to: Dodaj go do którego pliku? pomiędzy którymi innymi liniami? Czy to cała linia? Z pewnością nie jest to poprawne pod względem składniowym udev? itp. - słaba odpowiedź.
underscore_d
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.