Bir udev kuralında hata ayıklama (/etc/udev/rules.d/… içinde)


15

Yeni bir temel kural oluşturuyorum

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

kapsamak:

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

Bir SD kart kaydettim, yeniden başlattım ve taktım (tanıdığı /dev/sdb1, görüyorum dmesg), ama hiçbir şey olmuyor. Manuel olarak yaptığımda işe mount /dev/sdb1 /mediayarıyor.

Böyle bir udevkuralı nasıl giderebilir / hatalarını ayıklayabilirim ?

Not: ArchLinux kullanıyorum, ancak herhangi bir dağıtımda aynı mı olmalı?


1
Dosya 99-myrule.rules
adını

@jasonwryan: aynı: hiçbir şey olmuyor. Bir udev kuralı nasıl giderilir? Manuel olarak tetiklemeliyim (bu durumda nasıl?)
Basj

Bir systemdşeyi normal udev davranışına değiştirir mi?
Basj

1
denemek udevadm monitor, bunu ve bunu
Kova Gücü

1
AFAIK, kuralların yeniden okunması için udev'in yeniden başlatılmasını gerektirmez (bkz. Unix.stackexchange.com/a/39371/44760 ). Benim udev hata ayıklama (gerçekten de en kolay görev değil!) İle yaptım udevadm testve gerçekliğe karşı kuralları doğruladı udevadm info.
Zagrimsan

Yanıtlar:


11
  • 10-Jasonwryan tarafından belirtildiği gibi, yüksek numaralandırma kullanın (90 iyi). Yani kural başka biri tarafından geçersiz kılmayacak.
  • Minimum anahtarları tam istediğiniz gibi kullanın. Örnek, !=& GOTO/ LABELyerine doğrudan kullanın==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Hedefiniz sdb1sabit komut ile, kullanarak kör eşleşmeyi en aza indirinKERNEL=="sdb1"

  • Bir gölge hata ayıklama kuralı oluşturmak için yararlı buluyorum, gölge çağırdım çünkü her zaman orada aynı dosyada bırakıyorum, bu yüzden ihtiyacım olduğunda kullanıyorum.

    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"
    

    Not: udev-env.txt oluşturulduktan sonra kural yine de tetiklenir. Hat==karşılık gelen bir eşleşen düğümü. Bu dosyaya kaydedilen ENV, hemen hemen aynı zamanda oluşturulan 2 düğüm veya daha fazla arasındaki karışım olabilir, bu birstdouttamponlama problemidir.

  • Kullanım udevadm monitor -u, udevadm test ...ve udevadm trigger ... kurallar olayları işlenmiş olan doğrulamak için.

  • Komut dosyalarının içinde, dönüş değerlerini stdoutve stderriletilerini de kaydederek hata ayıklama günlüğü yapmak ve başarısız komutları yakalamak size kalmıştır .

Güncelleme:

  • Referans: 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
Çok kullanışlı. Bu diğer ayarları bulmak için kullanabileceğiniz birkaç yorum udevadm test...yalnızca ortam değişkenlerini gösterir . ATTRSudevadm info $DEVICE
Att Righ

1
Geri udevadm infodönüşlerde, bir cihaz ağacı, bir cihaz ile ana cihazları arasındaki ayarları ayırmaya dikkat edin (özellikler geçersiz kılınmamışsa devralınmış gibi görünür). Benim durumumda alt sistem yanlıştı.
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."Gerçekte olanı izlemenin bir yolu yok mu?
MarcH

@MarcH, udevadm monitor -uolayları / koşulları kontrol udevadm trigger ...etmek ve eylemlerini test etmek için kullanabilirsiniz .
user.dz

@MarcH, ancak komut dosyalarının içinde hata ayıklama günlüğü yapmak ve başarısız komutları yakalamak size kalmış (dönüş değerlerini de kaydederek stdout & stderr mesajları).
user.dz

1

Bence burada aradığın komut udevadm. Udev olaylarının yeniden taranmasını tetiklemek ve sırasıyla belirli bir olayı test etmek için triggerve testparametrelerini kullanırsınız.

EL 7'de yeni ağ cihazı adlandırma ile uğraşırken bunu zor yoldan öğrendim.


1
  1. Bir udev kural dosyası oluşturma

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Uudis'lere otomatikleştirmelerini söyleyen kural ekle

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

    ATTRS{type}=="SD" farklı tipler kullanıyorsanız gerekli olmayabilir.

  3. Kuralları yeniden yükle

    sudo udevadm control -R
    
  4. Çıkarın ve geri koyun.

Referans: Archlinux Wiki: Çıkarılabilir olarak değerlendirilmesi gereken bazı cihazlar


0

RASPBERRY PI 3 B + ile aynı sorunu yaşıyordum, yukarıdaki komutların size yardımcı olması mümkün olabilir. Ama bana yardım etmedi. Bir USB depolama aygıtı takarken bir komut dosyası çağırmaya çalışıyordum. Kurallar syslog'da oturum açmaz, bu nedenle hangi kuralın çalıştığını veya hangi kuralın başarısız olduğunu anlamak çok zorlaşır.

Bu yüzden aşağıdakileri yaptım:

(1) Kural dosyamı /etc/udev/rules.d/100-myrule.rules içinde yaptım

(2) sonra komutu çalıştırdım sudo /etc/init.d/udev restart

sonra işe yaradığını kontrol ettim. Bir bilgi sizin için yararlı olabilir veya olmayabilir, ancak (2) 'deki komut yürütülene kadar dosya sistemleri udev için salt okunurdur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.