Bagaimana cara debug aturan udev (di /etc/udev/rules.d/…)

15

Saya membuat aturan dasar baru

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

mengandung:

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

Saya menyimpan, mem-boot ulang, dan memasukkan kartu SD (dikenali oleh /dev/sdb1, saya melihatnya dmesg), tetapi tidak ada yang terjadi. Ketika saya melakukannya secara manual mount /dev/sdb1 /media, itu berfungsi.

Bagaimana saya bisa memecahkan masalah / men-debug udevaturan seperti itu ?

Catatan: Saya menggunakan ArchLinux, tetapi harus sama pada distro apa pun?

Basj
sumber
1
Ubah nama file menjadi 99-myrule.rules...
jasonwryan
@jasonwryan: sama: tidak ada yang terjadi. Bagaimana cara memecahkan masalah aturan udev? Haruskah saya memicunya secara manual (bagaimana dalam kasus ini?)
Basj
Apakah systemdmengubah sesuatu menjadi perilaku udev yang normal?
Basj
1
coba udevadm monitor, lihat ini dan ini
Aquarius Power
1
AFAIK seseorang tidak perlu melakukan reboot untuk mendapatkan udev untuk membaca kembali aturan (lihat unix.stackexchange.com/a/39371/44760 ). Saya telah melakukan debug udev saya (yang memang bukan tugas termudah!) Dengan udevadm testdan memvalidasi aturan melawan kenyataan dengan udevadm info.
zagrimsan

Jawaban:

11
  • 10-seperti yang disebutkan oleh jasonwryan, gunakan penomoran yang tinggi (90-an bagus). Jadi Anda berkuasa tidak akan ditimpa oleh yang lain.
  • Gunakan kunci minimum seperti yang benar-benar Anda butuhkan. Contoh, !=& GOTO/ LABEL, alih-alih gunakan langsung==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Target Anda adalah sdb1dengan perintah tetap, meminimalkan penggunaan butaKERNEL=="sdb1"

  • Saya merasa berguna untuk membuat aturan debugging bayangan, saya menelepon shadow karena saya selalu meninggalkannya di file yang sama, jadi saya menggunakannya ketika saya membutuhkannya.

    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"
    

    Catatan: udev-env.txt dibuat maka aturannya dipicu pula. Garis==sesuai dengan satu simpul yang cocok. ENV yang direkam dalam file itu bisa berupa campuran antara 2 node atau lebih, dibuat hampir dalam waktu yang bersamaan, ini merupakanstdoutmasalah buffering.

  • Gunakan udevadm monitor -u, udevadm test ...dan udevadm trigger ... untuk memverifikasi aturan mana yang memproses acara.

  • Di dalam skrip terserah Anda untuk membuat log debug dan menangkap perintah yang gagal, dengan menyimpan nilai kembalinya juga stdout& stderrpesan.

Memperbarui:

  • Referensi: 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.
    
user.dz
sumber
1
Sangat berguna. Beberapa komentar udevadm test...tampaknya hanya menunjukkan kepada Anda variabel lingkungan, agar ATTRSAnda dapat menggunakan udevadm info $DEVICEuntuk menemukan pengaturan lain ini.
Att Righ
1
Sebagai udevadm infoimbalannya pohon perangkat berhati-hati untuk membedakan pengaturan antara perangkat dan perangkat induknya (properti tampaknya diwarisi jika tidak diganti). Dalam kasus saya, subsistem salah.
Att 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."Apakah tidak ada cara untuk melacak apa yang sebenarnya terjadi?
MarcH
@ Markc, Anda dapat menggunakan udevadm monitor -uuntuk memeriksa acara / kondisi & udevadm trigger ...untuk menguji tindakan mereka.
user.dz
@MarcH, tetapi di dalam skrip terserah Anda untuk membuat log debug dan menangkap perintah yang gagal (dengan menyimpan nilai pengembaliannya juga pesan stdout & stderr).
user.dz
1

Saya pikir perintah yang Anda cari di sini adalah udevadm. Anda akan menggunakan triggerdan testparameter untuk memicu menelusuri ulang acara udev, dan masing-masing untuk menguji peristiwa tertentu.

Saya belajar ini dengan cara yang sulit ketika mencoba-coba dengan penamaan perangkat jaringan baru di EL 7. Semoga Sukses!

Paul
sumber
1
  1. Buat file aturan udev

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Tambahkan aturan yang memberi tahu udisk untuk mengotomatiskannya

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

    ATTRS{type}=="SD" mungkin tidak diperlukan jika Anda menggunakan jenis yang berbeda.

  3. Muat ulang aturan

    sudo udevadm control -R
    
  4. Keluarkan, lalu kembalikan.

Referensi: Archlinux Wiki: Beberapa perangkat, yang harus diperlakukan sebagai removable, tidak

user.dz
sumber
0

Saya mengalami masalah yang sama dengan RASPBERRY PI 3 B +, mungkin saja perintah di atas dapat membantu Anda. Tapi itu TIDAK membantu saya. Saya mencoba menjalankan skrip untuk memasukkan perangkat penyimpanan USB. Aturan tidak bisa login di syslog, sehingga menjadi sangat sulit untuk memahami aturan mana yang berfungsi atau aturan mana yang gagal.

Jadi saya melakukan yang berikut:

(1) Saya membuat file aturan saya di /etc/udev/rules.d/100-myrule.rules

(2) maka saya menjalankan perintah sudo /etc/init.d/udev restart

kemudian saya memeriksanya bekerja. Sepotong informasi, mungkin bermanfaat bagi Anda atau tidak, tetapi sistem file hanya dapat dibaca untuk udev sampai perintah at (2) dijalankan.

MSharq
sumber