udevルールをデバッグする方法(/etc/udev/rules.d/…内)


15

新しい基本ルールを作成しています

/etc/udev/rules.d/10-myrule.rules

含む:

KERNEL!="sdb*", GOTO="auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount /dev/sdb1 /media"
LABEL="auto_mount_end"

保存してリブートし、SDカードを挿入しました(で認識されますが/dev/sdb1、で表示されますdmesg)が、何も起こりません。手動mount /dev/sdb1 /mediaで行うと、動作します。

そのようなudevルールをトラブルシューティング/デバッグするにはどうすればよいですか?

注:私はArchLinuxを使用していますが、どのディストリビューションでも同じでしょうか?


1
ファイル名を99-myrule.rules...に変更します
jasonwryan

@jasonwryan:同じ:何も起こりません。udevルールのトラブルシューティング方法は?手動でトリガーする必要があります(この場合はどうですか?)
Basj

systemd通常udevの動作に変更何かを?
バスジ

1
してみてくださいudevadm monitor参照、これこの
アクエリアスパワー

1
知る限り、udevにルールを再読み込みさせるために再起動する必要はありません(unix.stackexchange.com/a/39371/44760を参照)。私はudevでデバッグを行い(実際、これは最も簡単なタスクではありません!)、udevadm testで現実に対するルールを検証しましたudevadm info
ザグリムサン

回答:


11
  • 10-jasonwryanが述べたように、高い番号付け(90年代が良い)を使用してください。したがって、あなたは他のルールによって上書きされることはありません。
  • 本当に必要な最小限のキーを使用してください。例、!=GOTO/ LABEL、代わりに直接使用==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • ターゲットはsdb1固定コマンドで、次を使用してブラインドマッチを最小限に抑えましたKERNEL=="sdb1"

  • シャドウデバッグルールを作成すると便利だと思います。シャドウを常に同じファイルに残しておくため、シャドウと呼んでいます。必要なときに使用します。

    ACTION=="add", KERNEL=="sdb*", RUN+="/bin/sh -c 'echo == >> /home/user/Desktop/udev-env.txt; env >> /home/user/Desktop/udev-env.txt'"
    #ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    

    注: udev-env.txtが作成されると、とにかくルールがトリガーされます。1つの一致するノードに==対応する行。そのファイルに記録されたENVは、2つ以上のノードが混在していて、ほぼ同時に作成される可能性があり、バッファリングの問題です。stdout

  • および を使用してudevadm monitor -u、イベントを処理したルールを確認します。udevadm test ...udevadm trigger ...

  • スクリプト内では、戻り値stdoutstderrメッセージを保存することにより、デバッグログを作成し、失敗したコマンドをキャッチします。

更新:

  • リファレンス: udev_237- man udev (Ubuntu_18.04)

    RUN{type}

    Note that running programs that access the network or mount/unmount filesystems is not
    allowed inside of udev rules, due to the default sandbox that is enforced on
    systemd-udevd.service.
    

1
非常に便利。これらのその他の設定を見つけるために使用できるようにudevadm test...、環境変数のみを表示するコメントがいくつか表示されます。ATTRSudevadm info $DEVICE
肥満児RIGH

1
udevadm infoリターンデバイスのツリーは、デバイスとその親デバイス間の設定を区別するように注意してください(プロパティが上書きされない場合は継承されているように見えます)。私の場合、サブシステムが間違っていました。
肥満児RIGH

udevadm test "This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run."実際に何が起こっているのかを追跡する方法はありませんか?
-MarcH

@MarcHを使用するudevadm monitor -uと、イベント/条件を確認しudevadm trigger ...たり、アクションをテストしたりできます。
user.dz

@MarcHですが、デバッグログを作成し、失敗したコマンドをキャッチするのはスクリプト内です(戻り値を保存することにより、stdoutおよびstderrメッセージも)。
user.dz

1

ここで探しているコマンドはであると思いますudevadm。パラメータtriggertestパラメータを使用して、それぞれudevイベントの再スキャンをトリガーし、特定のイベントをテストします。

EL 7で命名された新しいネットワークデバイスを使いこなすときに、この難しい方法を学びました。幸運を祈ります!


1
  1. udevルールファイルを作成する

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. udisksに自動マウントするように指示するルールを追加します

    SUBSYSTEM=="block", SUBSYSTEMS=="mmc", DRIVERS=="mmcblk", ATTRS{type}=="SD", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
    

    ATTRS{type}=="SD" 異なるタイプを使用している場合は必要ありません。

  3. ルールをリロードする

    sudo udevadm control -R
    
  4. 取り出してから戻します。

参照: Archlinux Wiki:一部のデバイスは、取り外し可能として扱う必要がありますが、


0

RASPBERRY PI 3 B +でも同じ問題が発生していました。上記のコマンドが役立つ場合があります。しかし、それは私を助けませんでした。USBストレージデバイスの挿入時にスクリプトを呼び出そうとしました。ルールはsyslogに記録されないため、どのルールが機能したか、どのルールが失敗したかを理解するのは非常に困難になります。

だから私は次のことをしました:

(1)/etc/udev/rules.d/100-myrule.rulesにルールファイルを作成しました

(2)その後、コマンドを実行しました sudo /etc/init.d/udev restart

それが動作することを確認しました。情報は役に立つかもしれませんが、ファイルシステムは(2)のコマンドが実行されるまで、udevに対して読み取り専用です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.