web-dev-qa-db-ja.com

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/sdb1dmesg)で表示されますが、何も起こりません。手動で行う場合mount /dev/sdb1 /media、 できます。

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

注:私はArchLinuxを使用していますが、どのディストリビューションでも同じでなければなりませんか?

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

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • ターゲットはsdb1で、コマンドは修正されました。KERNEL=="sdb1"を使用してブラインドマッチを最小化してください

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

    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が作成され、ルールがトリガーされます。 oneに一致するノードに対応する行==。そのファイルに記録されたENVは2ノード以上の混合である可能性があり、ほぼ同時に作成されました。これはstdoutバッファリングの問題です。

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

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

更新:

  • 参照:dev_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.
    
11
user.dz
  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:一部のデバイスは取り外し可能として扱われるべきであり、そうではありません

1
user.dz

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

EL 7での新しいネットワークデバイスの命名を試してみたとき、私はこれを難しい方法で学びました。

1
Paul

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

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

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

(2)次に、コマンドSudo /etc/init.d/udev restart

それが機能することを確認しました。情報の一部は、役立つ場合もあればそうでない場合もありますが、(2)のコマンドが実行されるまで、ファイルシステムはudevに対して読み取り専用です。

0
MSharq