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

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

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

/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

修正する

  • 引用: udev_237 -手動udev (Ubuntu_18.04)

    RUN{type}

       ︙

      デフォルトのサンドボックスはsystemd-udevd.serviceに適用されるため、ネットワークにアクセスしたりファイルシステムをマウントまたはマウント解除したりするプログラムは、udevルール内で実行できません。


元の答えデバッグヒントは他のudevルールアプリケーションに有効です。

  • 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作成されると、ルールがトリガーされます。==対応する行一つ一致するノード。このファイルに書き込まれるENVは、ほぼ同じ時間に生成された2つ以上のノード間の混合である可能性があり、これはバッファリングのstdout問題です。
    • このデバッグに示されている一部の環境変数は、この時点でudev処理の一致がまだ満たされていないため(前の規則に従って)、その条件で使用できない場合があります。バラよりhttps://www.suse.com/support/kb/doc/?id=000016106(コメントで@clonejoが言及しました)
  • udevadm monitor -uudevadm test ...およびを使用してudevadm trigger ... イベントを処理したルールを確認してください。

  • スクリプト内では、stdout戻り値とメッセージを保存してデバッグログを生成し、失敗したコマンドをキャプチャできますstderr

おすすめ記事