กฎ Udev เพื่อให้ตรงกับอุปกรณ์เก็บข้อมูล usb ใด ๆ


10

ฉันจะใช้udevกฎสำหรับอุปกรณ์เก็บข้อมูลขนาดใหญ่แบบ USB ที่เสียบเข้ามาได้อย่างไร สิ่งที่ควรเปลี่ยนในidVendorและidProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

คำตอบ:


7

อุปกรณ์เก็บข้อมูลอยู่ในblockระบบย่อยดังนั้นคุณจะต้องSUBSYSTEM=="block"อยู่ในกฎดังนี้:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

หากคุณกำลังใช้systemdงานคุณสามารถเรียกใช้systemdหน่วยในแต่ละครั้งที่มีการเพิ่มอุปกรณ์เก็บข้อมูล USB สร้างไฟล์หน่วยเช่น/etc/systemd/system/my-usb-rule.service:

[Service]
Type=oneshot
ExecStart=/path/to/script

และกฎเช่น/etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

ตอนนี้udevจะทริกเกอร์my-usb-rule.service(ซึ่งจะรันสคริปต์ของคุณ) บนอุปกรณ์เก็บข้อมูล usb เพิ่มเหตุการณ์


อย่าลืมโหลดการกำหนดค่าใหม่หลังจากคุณแก้ไขกฎ / หน่วย:

udevadm control --reload
systemctl daemon-reload

เมื่อฉันเพิ่มที่เก็บข้อมูล USB ขนาดใหญ่ฉันต้องการที่จะดำเนินการกับพาร์ติชันที่มีอยู่ ในระดับ udev ฉันสามารถดูเหตุการณ์จาก 4 ระบบย่อย: usb, scsi, bdi และ block (ตามลำดับนี้) 3 รายการแรกใช้ไม่ได้เนื่องจากพาร์ติชันยังไม่ทราบ เหตุการณ์บล็อกมี ID_BUS = scsi ไม่ใช่ usb ในตัวอย่างรหัสของคุณ ฉันไม่เห็นคุณลักษณะที่เหมาะสมในเหตุการณ์บล็อคที่จะบอกฉันว่าเป็นที่เก็บข้อมูล USB หรือไม่ (การสืบสวนเสร็จสิ้นโดยใช้ udevadm monitor และ udevadm info) นอกจากว่าฉันจะเชื่อถือได้ว่า ID_BUS = scsi อาจไม่เป็นอย่างอื่นนอกจากที่เก็บข้อมูล USB
Uwe Geuder

@UweGeuder - ไม่มีอะไรจะหยุดให้คุณใช้ชื่ออุปกรณ์เป็นข้อโต้แย้งในโปรแกรมของคุณและขึ้นอยู่กับการกระทำในพาร์ทิชันที่ ...
don_crissti

ในเหตุการณ์ USB ชื่ออุปกรณ์นั้นคล้าย / dev / bus / usb / 002/040 ไม่แน่ใจว่าจะทำอย่างไรกับสิ่งนั้นในโปรแกรมของฉัน ในเหตุการณ์บล็อกชื่ออุปกรณ์มีลักษณะคล้าย / dev / sdb หรือ / dev / sdb1 นั่นคือสิ่งที่ฉันต้องการ แต่ตอนนี้ฉันกลับไปที่ปัญหาที่ ID_BUS = scsi ฉันได้อีกเล็กน้อย: มีไฟล์กฎ 80-udisk2 ซึ่งเพิ่มคุณสมบัติ ID_DRIVE_THUMB ไม่แน่ใจว่าแข็งแกร่งเพียงใดมีรายชื่อผู้จำหน่ายน้อยมาก ไฟล์กฎของฉันถูกเรียกว่า 70- * ดังนั้นตามที่คาดไว้ / dev / sdb ของฉันไม่ตรงกัน จับคู่ / dev / sdb1 ไม่ดีพอแม้ว่ากฎของฉันจะรันก่อน
Uwe Geuder

1
อ่าผมเพิ่งทราบคำถามเดิมไดรฟ์ USB เก็บข้อมูลขนาดใหญ่ ที่ควรทำงานกับกฎSUBSYSTEM=="block", SUBSYSTEMS=="usb"(หมายเหตุความแตกต่างกับS ) ฉันสงสัยว่ามันสามารถใช้งานได้กับENV{ID_BUS}=="usb"คำตอบดั้งเดิมเพราะฉันเห็นคุณค่าของ scsi ที่นี่ แต่ฉันกำลังทำงานกับปัญหาที่แตกต่างกันเล็กน้อยกว่าที่ถามมาฉันต้องการ USB stick (pendrive) แต่ไม่มีไดรฟ์ภายนอก
Uwe Geuder

1
ที่จริงแล้วความจริงที่น่ารังเกียจคือENV{ID_BUS}คุณค่านั้นไม่เหมือนกันในทุกระบบ เมื่อวานนี้ผมได้ทำงานในระบบเก่ากับ udev 210 (ผมเชื่อว่า. ไม่สามารถตรวจสอบในขณะนี้เพราะเครื่องไม่ได้อยู่บนอินเทอร์เน็ต) มีค่าเป็นSCSI ตอนนี้ผมอยู่ในเครื่องรุ่นใหม่ที่มี udev 228 และค่าเป็นUSB สำหรับแท่ง USB ตัวเดียวกันฉันกำลังพกติดตัวไปด้วย (ไม่แน่ใจว่ารุ่น udev เป็นปัจจัยที่เกี่ยวข้องที่นี่หรืออาจเป็นเคอร์เนลหรือแพ็คเกจอื่น ๆ ที่ติดตั้งกฎ udev, e, g, udisks2) ภาพนิ่งSUBSYSTEM=="block", SUBSYSTEMS=="usb"(หมายเหตุ S ) อาจพกพาได้และปลอดภัย
Uwe Geuder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.