カードをUSBカードリーダーに挿入すると、CFカードから写真をコピーするシェルスクリプトをトリガーするudev
ルールがあります。これはしばらくの間うまくいきました。しかし、最近のアップグレードの後、それは機能しなくなりました。
問題(AFAICT)は、CFカードをUSBリーダーに挿入しても、udev
イベントがトリガーされなくなったため、スクリプトが実行されないことです。 (/dev/disk/by-label/
のエントリでさえ、挿入時に表示されず、dmesg
は挿入について何も表示しません。)
fdisk -l /dev/sdf
(またはudev
、またはCFカードが表示されると思われるデバイス)を実行すると、sdh
イベントがトリガーされる可能性があります。 udev
イベントをudevadm monitor
で検証し、udevd --debug
を実行しました。システムを手動でトリガーした後、この時点からスクリプトは正常に機能します。
私はDebian6.0(Squeeze)を実行しており、動作が変わったのは数か月前のLennyからのアップグレードであると確信していますが、udev
の微妙な変更かどうかはわかりません。 (おそらく私は間違ったイベントを聞いていますか?)またはカーネルまたはUSBスタックの変更?とにかく、誰かがこれを修正する方法についての提案がありますか?または、usb-storageモジュールからより多くのデバッグ情報を取得するための提案はありますか?
これは私が使用しているudevルールです:
KERNEL=="sd??", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add"
パーティションではなくブロックデバイスのみでトリガーするルールを追加しましたが(表示される可能性がある場合)、CFカードを挿入してもトリガーされません。
KERNEL=="sd?", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add-disk"
奇妙なことに、CFカードの認識をトリガーするためにfdisk -l /dev/sdf
を実行すると、/dev/sdf
の「変更された」イベントが発生します(「追加」イベントは発生しませんでしたが)。
add
ueventトリガーいくつかの同様の根拠をカバーするオープンで不完全な Debianバグ があります(関連するビットについては pdate#25 にスキップしてください)。それにはいくつかの便利なヒントがあります。
私のセットアップでは、CFカードを挿入した状態で(rootとして)echo add > /sys/block/sdf/uevent
を実行しても認識されない場合、すべてのudev
イベントが正しくトリガーされ、すべてのスクリプトが正しく実行されます。
CFカードを挿入する前後でudevadm info --query=all --name=sdf
を実行しても、違いはありません。 'add'イベントを挿入し、udevadm
コマンドを再実行すると、もう少し出力が得られます(ディスクパーティションに関する情報がいくつかあります)。
バニラUSBキーを挿入すると、すべてのudev
イベントがすぐにトリガーされ、正常に機能します。 CFカードをUSBカードリーダーに挿入しても、そうではありません。カードリーダーの場合、CFカードが挿入されていなくてもUSBデバイスは「存在する」ように見えますが(したがって、/sys/block/sdf
エントリが存在します)、USBキーを使用すると、/sys/block/sdj
はUSBが存在する間のみ存在します。キーが差し込まれています。
この buntuバグ には、バグが2.6.38カーネルに存在しなくなったと主張するアップデート(最後のもの)があります。
カーネルを数回アップグレードし、使用しているマザーボードを変更しましたが、それでも同じ問題が発生します。私は現在3.2.0.0カーネルを使用しています。そしてudev
バージョン164。
tl; dr:以下のアップデート2の解決策を参照してください。
これは本当に悲しい答えではありません、または少なくとも良いニュースではありません:これはとにかくうまくいかないという感じがします—これは確かに過去にうまくいったと思うので、少し信じがたいです!
これが通常機能するものであり、その理由は次のとおりです。ほとんどのラップトップSDカードリーダー。 SDカードを差し込むと、udev
がそれを確認し、Linuxがそれをスキャンしてパーティションを探し、自動マウントが機能することがわかります。なぜこれが機能するのですか?カードを挿入する前後のlsusb
を見てください。 SDカードが接続されていない場合、USBデバイスは存在しないことに注意してください。そのため、SDカードを挿入すると、本格的なUSBホットプラグイベントが発生します。
私のモニターのカードリーダーはこのように機能していないようです、それは常にそこにあります。また、SDカードを挿入したときにイベントを生成することができません。まずsyslogを調べ、次に_udevadm monitor
_、次にusbmon
で生のUSBイベントログを確認しました。運が悪いです。モニターのカードリーダーまたはPCの安価なDealExtremeのいずれからも、挿入/取り出しの通知/イベントはまったく発生していないようです。
Rawデバイスにアクセスしようとすると、カーネルが起動し、パーティションが表示されます。同様に、_udevadm trigger
_を呼び出すと、デバイスが記録されます。カードを取り出して、デバイスに再度アクセスしようとしてカーネルがカードがなくなったことを認識するまで、何も起こりません。
私が今自分自身に疑問に思っているのは、これがどのように機能したのか(つまり、私がこの記憶を構成していない場合)?たぶん、いくつかのデーモンが数秒ごとにrawデバイスをポーリングしていて、これを停止していましたか?これに関するドキュメントを見つけるのは本当に難しいです。
上記はすべてDebianストックカーネルです。私はUbuntuカーネルでいくつかの実験を行ったところですが、SDカードのホットプラグが機能しているようです。そして当然のことながら、usbmon
では2秒ごとに投票が行われます。これは、カードがすぐに検出されないが、わずかに遅れる理由も説明しています。
ポーリングは、select()
ループでスタックする以外のことをユーザーランドプロセスが実行しないシングルユーザーモードでも行われるため、カーネルによって行われるようです。カーネルのどこでこれが行われているのか理解できませんでした。わかったら、この投稿を更新します。
重要な違いは_/sys/block/sd?/events_poll_msecs
_のようです。私のDebianボックスでは-1、Ubuntuボックスでは2000です。このudev
ルールはそれを行うようです:
_# enable in-kernel media-presence polling
ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"
ACTION=="add", ATTR{removable}=="1", ATTR{events_poll_msecs}=="-1", ATTR{events_poll_msecs}="2000"
_