CFカードをUSBカードリーダーに挿入すると、Udevトリガーは実行されません(これ以上)。

CFカードをUSBカードリーダーに挿入すると、Udevトリガーは実行されません(これ以上)。

udevCFカードをUSBカードリーダーに挿入すると、CFカードから写真をコピーするシェルスクリプトが実行されるという規則があります。これはしばらくうまくいきました。ただし、最近のアップグレード以降は動作が停止しました。

問題(AFAICT)は、CFカードをUSBカードリーダーに挿入してもイベントがudevトリガーされなくなり、スクリプトが実行されないことです。 (内の項目も/dev/disk/by-label/挿入物に表示されず、dmesg挿入物の内容も表示されません。)

udev実行するとfdisk -l /dev/sdf(またはsdhCFカードとして見えるデバイス)イベントをトリガーできます。をudev使用して実行中のudevadm monitorイベントを確認しましたudevd --debug。システムを手動でトリガーしたとき、この時点からスクリプトは正常に機能しました。

私はDebian 6.0(Squeeze)を実行しており、数ヶ月前にLennyのアップグレードによって動作が変わったと確信しています。しかし、それが微妙な変化であるかどうかはわかりませんudev(たぶんバグのあるイベントを聞いているのでしょうか?)またはカーネルやUSBスタックにいくつかの変更がありますか?とにかく、この問題を解決する方法について提案がある人はいますか?それとも、USBメモリモジュールからより多くのデバッグ情報を取得するための提案はありますか?

私が使用する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"

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

アップデート#2:addueventトリガー

開いていて不完全な部分があります。Debian エラー同様の内容を扱います(次にスキップしてください)。アップデート#25関連ビットの場合)。そこにはいくつかの便利なヒントがあります。

私の設定では、rootとしてecho add > /sys/block/sdf/ueventCFカードを挿入しても認識されない場合は、udevすべてのイベントが正しく実行され、すべてのスクリプトが正しく実行されます。

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

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

通常のUSBキーを挿入すると、udevすべてのイベントがすぐにトリガーされ、正しく機能します。 CFカードをUSBカードリーダーに挿入しても機能しません。カードリーダーでは、/sys/block/sdfCFカードを挿入しなくてもUSBデバイスが「存在」するように(したがって項目がある)ように見えますが、USBキーでは/sys/block/sdjUSBキーを挿入しなければ存在しません。

アップデート#4:2.6.38で修正された可能性があります

これUbuntuエラー2.6.38 カーネルにバグが存在しないと主張するアップデート(最後のアップデート)があります。

アップデート#5:未修正(3.2.0から)

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

ベストアンサー1

簡単に言うと:以下のアップデート2のソリューションを参照してください。

悲しいことに、これは実際に答えではないか、少なくとも良いニュースではありません。とにかくこれがうまくいかないような気がします。過去にはこれがうまくいったと確信していたので少し信じていません!

これが一般的に機能する方法と理由です。ほとんどのラップトップSDカードリーダーです。 SDカードを挿入してudev確認すると、Linuxはパーティションを検索し、自動マウントが正常に機能していることを確認できます。これがうまくいくのはなぜですか?lsusbカードの挿入前と挿入後の状況を確認してください。 SDカードが挿入されていない場合は、USBデバイスがありません。したがって、SDカードを挿入すると、USBホットプラグがいっぱいのイベントが発生します。

私のモニターのカードリーダーはこのように動作しないようです。いつもそこにいます。 SDカードを挿入してもイベントは生成されません。まず、システムログを見てudevadm monitorから、usbmon生のUSBイベントログを見ました。残念ながら、私のモニターのカードリーダーや私のコンピューターの手頃な価格のDealExtremeカードリーダーから挿入/ポップアップ通知/イベントがまったくないようです。

RAWデバイスにアクセスしようとすると、カーネルが起動し、パーティションが表示されます。同様に、電話をかけるとudevadm triggerデバイスに記録されます。カードを取り外した後、デバイスに再度アクセスしようとし、カーネルがカードがなくなったことを認識するまで何も起こりません。

今私が気になったのは、これがどのように機能できるかです(つまり、私がこの記憶を作り出さなかった場合)。おそらく、いくつかのデーモンが数秒ごとに生のデバイスをポーリングするために使用され、それを中断した可能性があります。これに関する文書を見つけるのは本当に難しいです。

アップデート#1

上記はDebianストックカーネルの全内容です。 SDカードホットスワッピングが動作するUbuntuカーネルでいくつかの実験を行いました。当然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"

おすすめ記事