web-dev-qa-db-ja.com

CFカードをUSBカードリーダーに挿入してもUdevトリガーが起動しない(もう)

カードを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"

更新#1:blockdevとパーティションの変更をトリガーする

パーティションではなくブロックデバイスのみでトリガーするルールを追加しましたが(表示される可能性がある場合)、CFカードを挿入してもトリガーされません。

KERNEL=="sd?", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add-disk"

奇妙なことに、CFカードの認識をトリガーするためにfdisk -l /dev/sdfを実行すると、/dev/sdfの「変更された」イベントが発生します(「追加」イベントは発生しませんでしたが)。

更新#2:addueventトリガー

いくつかの同様の根拠をカバーするオープンで不完全な Debianバグ があります(関連するビットについては pdate#25 にスキップしてください)。それにはいくつかの便利なヒントがあります。

私のセットアップでは、CFカードを挿入した状態で(rootとして)echo add > /sys/block/sdf/ueventを実行しても認識されない場合、すべてのudevイベントが正しくトリガーされ、すべてのスクリプトが正しく実行されます。

CFカードを挿入する前後でudevadm info --query=all --name=sdfを実行しても、違いはありません。 'add'イベントを挿入し、udevadmコマンドを再実行すると、もう少し出力が得られます(ディスクパーティションに関する情報がいくつかあります)。

アップデート#3:USBリーダーのUSBキーとCFカード

バニラUSBキーを挿入すると、すべてのudevイベントがすぐにトリガーされ、正常に機能します。 CFカードをUSBカードリーダーに挿入しても、そうではありません。カードリーダーの場合、CFカードが挿入されていなくてもUSBデバイスは「存在する」ように見えますが(したがって、/sys/block/sdfエントリが存在します)、USBキーを使用すると、/sys/block/sdjはUSBが存在する間のみ存在します。キーが差し込まれています。

アップデート#4:おそらく2.6.38で修正されました

この buntuバグ には、バグが2.6.38カーネルに存在しなくなったと主張するアップデート(最後のもの)があります。

アップデート#5:修正されていません(3.2.0)

カーネルを数回アップグレードし、使用しているマザーボードを変更しましたが、それでも同じ問題が発生します。私は現在3.2.0.0カーネルを使用しています。そしてudevバージョン164。

5
P.T.

tl; dr:以下のアップデート2の解決策を参照してください。

これは本当に悲しい答えではありません、または少なくとも良いニュースではありません:これはとにかくうまくいかないという感じがします—これは確かに過去にうまくいったと思うので、少し信じがたいです!

これが通常機能するものであり、その理由は次のとおりです。ほとんどのラップトップSDカードリーダー。 SDカードを差し込むと、udevがそれを確認し、Linuxがそれをスキャンしてパーティションを探し、自動マウントが機能することがわかります。なぜこれが機能するのですか?カードを挿入する前後のlsusbを見てください。 SDカードが接続されていない場合、USBデバイスは存在しないことに注意してください。そのため、SDカードを挿入すると、本格的なUSBホットプラグイベントが発生します。

私のモニターのカードリーダーはこのように機能していないようです、それは常にそこにあります。また、SDカードを挿入したときにイベントを生成することができません。まずsyslogを調べ、次に_udevadm monitor_、次にusbmonで生のUSBイベントログを確認しました。運が悪いです。モニターのカードリーダーまたはPCの安価なDealExtremeのいずれからも、挿入/取り出しの通知/イベントはまったく発生していないようです。

Rawデバイスにアクセスしようとすると、カーネルが起動し、パーティションが表示されます。同様に、_udevadm trigger_を呼び出すと、デバイスが記録されます。カードを取り出して、デバイスに再度アクセスしようとしてカーネルがカードがなくなったことを認識するまで、何も起こりません。

私が今自分自身に疑問に思っているのは、これがどのように機能したのか(つまり、私がこの記憶を構成していない場合)?たぶん、いくつかのデーモンが数秒ごとにrawデバイスをポーリングしていて、これを停止していましたか?これに関するドキュメントを見つけるのは本当に難しいです。

アップデート#1

上記はすべてDebianストックカーネルです。私はUbuntuカーネルでいくつかの実験を行ったところですが、SDカードのホットプラグが機能しているようです。そして当然のことながら、usbmonでは2秒ごとに投票が行われます。これは、カードがすぐに検出されないが、わずかに遅れる理由も説明しています。

ポーリングは、select()ループでスタックする以外のことをユーザーランドプロセスが実行しないシングルユーザーモードでも行われるため、カーネルによって行われるようです。カーネルのどこでこれが行われているのか理解できませんでした。わかったら、この投稿を更新します。

アップデート#2

重要な違いは_/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"
_
4
Wilmer