web-dev-qa-db-ja.com

CD / DVDドライブのボタンを無効にするにはどうすればよいですか?

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

したがって、問題のデバッグを続行します。

Cdctlのデバッグ

ですから、stracecdctlを実行して、何が起こっているのかを明らかにできるかどうかを確認します。

$ 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などがデバイスの所有権を潜在的にブロックまたは取得しているのではないかと思います。

考え?

13
slm

頭に正しい方向を与えてくれた@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のイジェクトボタンをオプトインする機能を無効にすることができます。

  1. ファイルのコピーを作成します60-cdrom_id.rules

    $ Sudo cp /usr/lib/udev/rules.d/60-cdrom_id.rules /etc/udev/rules.d/.
    
  2. このコピーされたバージョンのファイルを編集し、DISK_EJECT_REQUESTという文字列を含む行をコメント化します。

    $ sudoedit /etc/udev/rules.d/60-cdrom_id.rules
    
  3. ファイルを保存すると、変更がすぐにわかります。

上記のソリューションは、ejectcdctlの両方の問題を修正します。したがって、次のコマンドは期待どおりに機能します。

ドライブをロックします

$ 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
10
slm

次の行を追加します。

DISC_EJECT_REQUEST

cDにROM udevルール。これにより、次の方法でロックできます。

eject -i
2
Affix