Fedora 14までは、ラップトップ(Thinkpad T410)のCD/DVDイジェクトボタンを有効/無効にするために cdctl
を正常に使用していました。悲しいことに、それは現在、機能しなくなっています。
私はこれら2つの質問で議論された方法を調べました:
どれも私のために働いていません。それで私はcdctl
に戻って、それが長い間働いていたので、それで壊れているものを修正できないかどうかを確認します。
cdctl
スイッチから始めると、ほとんどのことがうまく機能しているように見えます。
これらはうまくいきます。
ドライブを取り出します
$ cdctl -e
リスト機能
$ 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
そのリストによると、cdctl
は、イジェクトボタンを有効/無効にできるとさえ考えています。
Can disable eject : 1
したがって、問題のデバッグを続行します。
ですから、strace
でcdctl
を実行して、何が起こっているのかを明らかにできるかどうかを確認します。
$ 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 +++
不思議なことに、cdctl
はボタンを無効にすると考えているようです。
$ strace cdctl -o1
ioctl(3, CDROM_LOCKDOOR, 0x1) = 0
$ strace cdctl -o0
ioctl(3, CDROM_LOCKDOOR, 0) = 0
注:私がこの権利を理解している場合、0が返されたことは成功したことを意味しています。
ここで私の目を引いたのは、cdctl
が操作しようとしているデバイスのリストでした。それで、「これらのデバイスをeject
で試したらどうなるでしょうか」と思いましたか。
私が何年も前に使用していた他のコマンドの1つは、CD/DVDデバイスと対話するためのeject
コマンドでした。このコマンドにも同様の名前付きスイッチがあることに気づきました。
$ eject --help
-i, --manualeject <on|off> toggle manual eject protection on/off
$ 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
そのため、eject
もボタンを無効にすることを考えていますが、どちらでもありません。 strace
を使用すると、同じシステムコールが表示されます。
$ 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
では、UDEVなどがデバイスの所有権を潜在的にブロックまたは取得しているのではないかと思います。
考え?
頭に正しい方向を与えてくれた@Affixの回答のおかげで、私は問題の解決策を理解しました。
ご想像のとおり、この問題は間違いなくUDEVが原因です。問題は、cdromドライブに関連するほとんどのUDEVファイルにあるこの行です。
Fedora 19には、/usr/lib/udev/rules.d/60-cdrom_id.rules
というファイルがあります。このファイルには、CD/DVDデバイスのイジェクトボタンを選択する次の行があります。
ENV{DISK_EJECT_REQUEST}=="?*", RUN+="cdrom_id --eject-media $devnode", GOTO="cdrom_end"
この問題を回避し、次の方法でUDEVのイジェクトボタンをオプトインする機能を無効にすることができます。
ファイルのコピーを作成します60-cdrom_id.rules
$ Sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
このコピーされたバージョンのファイルを編集し、DISK_EJECT_REQUEST
という文字列を含む行をコメント化します。
$ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
ファイルを保存すると、変更がすぐにわかります。
上記のソリューションは、eject
とcdctl
の両方の問題を修正します。したがって、次のコマンドは期待どおりに機能します。
ドライブをロックします
$ eject -i on /dev/sr0
eject: CD-Drive may NOT be ejected with device button
-or-
$ cdctl -o1
ドライブのロックを解除します
$ eject -i off /dev/sr0
eject: CD-Drive may be ejected with device button
-or-
$ cdctl -o0
次の行を追加します。
DISC_EJECT_REQUEST
cDにROM udevルール。これにより、次の方法でロックできます。
eject -i