วิธีแก้จุดบกพร่องกฎ 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 แต่ควรจะเหมือนกันใน distro ใด ๆ


1
เปลี่ยนชื่อไฟล์เป็น99-myrule.rules...
jasonwryan

@ Jasonwryan: เหมือนกัน: ไม่มีอะไรเกิดขึ้น วิธีแก้ปัญหากฎ udev ฉันควรจะเรียกมันด้วยตนเอง (ในกรณีนี้อย่างไร)
Basj

ไม่systemdเปลี่ยนแปลงอะไรบางอย่างกับพฤติกรรม udev ปกติ?
Basj

1
ลองudevadm monitorดูสิ่งนี้และสิ่งนี้
กุมภ์ Power

1
AFAIK ไม่มีใครชอบรีบูตเพื่อรับ udev เพื่ออ่านกฎอีกครั้ง (ดูunix.stackexchange.com/a/39371/44760 ) ฉันได้ทำแก้จุดบกพร่อง udev ของฉัน (ซึ่งแน่นอนไม่ได้เป็นงานที่ง่ายที่สุด!) กับและตรวจสอบกฎระเบียบกับความเป็นจริงด้วยudevadm test udevadm info
zagrimsan

คำตอบ:


11
  • 10-ตามที่กล่าวไว้โดย jasonwryan ให้ใช้หมายเลขที่สูง (90's good) ดังนั้นคุณกฎจะไม่ถูกแทนที่โดยคนอื่น
  • ใช้ปุ่มขั้นต่ำตามที่คุณต้องการจริงๆ ตัวอย่าง!=& GOTO/ LABELใช้โดยตรงแทน==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • เป้าหมายของคุณคือsdb1ด้วยคำสั่งคงที่ลดการจับคู่แบบบอดโดยใช้KERNEL=="sdb1"

  • ฉันพบว่ามีประโยชน์ในการสร้างกฎการดีบัก shadow ฉันเรียกว่า 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สร้างแล้วกฎจะถูกเรียกใช้ต่อไป บรรทัดที่==สอดคล้องกับหนึ่งโหนดที่ตรงกัน ENV ที่บันทึกในไฟล์นั้นอาจผสมกันระหว่าง 2 โหนดขึ้นไปซึ่งสร้างขึ้นในเวลาเดียวกันมันเป็นstdoutปัญหาบัฟเฟอร์

  • การใช้งานudevadm monitor -u, udevadm test ...และudevadm trigger ... การตรวจสอบซึ่งกฎการประมวลผลเหตุการณ์ที่เกิดขึ้น

  • ภายในสคริปต์นั้นขึ้นอยู่กับคุณในการสร้างบันทึกการดีบักและจับคำสั่งที่ล้มเหลวโดยการบันทึกค่าส่งคืนstdoutและstderrข้อความ

ปรับปรุง:

  • ข้อมูลอ้างอิง: 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...ปรากฏขึ้นเพื่อแสดงเฉพาะตัวแปรสภาพแวดล้อมเพื่อให้ATTRSคุณสามารถใช้udevadm info $DEVICEเพื่อค้นหาการตั้งค่าอื่น ๆ เหล่านี้
Att Righ

1
ในการudevadm infoส่งคืนแผนผังของอุปกรณ์ต้องระมัดระวังในการแยกแยะการตั้งค่าระหว่างอุปกรณ์กับอุปกรณ์หลัก ในกรณีของฉันระบบย่อยผิด
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."ไม่มีวิธีใดที่จะติดตามสิ่งที่เกิดขึ้นจริงหรือ
MarcH

@MarcH คุณสามารถใช้udevadm monitor -uเพื่อตรวจสอบเหตุการณ์ / เงื่อนไข & udevadm trigger ...เพื่อทดสอบการกระทำของพวกเขา
user.dz

@MarcH แต่ภายในสคริปต์ขึ้นอยู่กับคุณที่จะสร้างบันทึกการดีบักและตรวจจับคำสั่งที่ล้มเหลว (โดยการบันทึกค่าส่งคืนจะเป็นข้อความ stdout & stderr)
user.dz

1

udevadmผมคิดว่าคำสั่งที่คุณกำลังมองหาที่นี่คือ คุณจะใช้triggerและtestพารามิเตอร์เพื่อเรียกใช้การสแกนซ้ำของเหตุการณ์ udev และเพื่อทดสอบเหตุการณ์เฉพาะตามลำดับ

ฉันได้เรียนรู้วิธีนี้อย่างยากลำบากเมื่อทำการวางกับอุปกรณ์เครือข่ายใหม่ใน EL 7 ขอให้โชคดี!


1
  1. สร้างไฟล์ udev rules

    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

จากนั้นฉันตรวจสอบว่ามันใช้งานได้ ข้อมูลบางส่วนอาจเป็นประโยชน์กับคุณหรืออาจจะไม่ใช่ แต่ระบบไฟล์นั้นจะอ่านได้อย่างเดียวสำหรับ udev จนกว่าคำสั่งที่ (2) จะถูกดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.