วิธีการโหลดกฎ udev โดยไม่ต้องรีบูต?


209

เราควรรีโหลดกฎ udev อย่างไรเพื่อให้กฎที่สร้างขึ้นใหม่สามารถทำงานได้

ฉันใช้ Arch Linux และฉันไม่มีudevstartคำสั่งที่นี่

ตรวจสอบ/etc/rc.dแล้วไม่มีบริการ udev


1
โปรดทราบว่ารุ่นล่าสุดของ udev ได้ยกเลิกการสนับสนุน inotify ดังนั้นการโหลดกฎการเปลี่ยนแปลงบ่อยครั้งกว่านี้
โคลิน Guthrie

คือudevอะไร มันเป็นผู้จัดการของ/dev?
Sandburg

1
@ Sandburg ใช่มันจัดการ plug-n-play บนระบบ Linux
Aaron D. Marasco

คำตอบ:


229
# udevadm control --reload-rules && udevadm trigger

4
คุณต้องการในudevtriggerภายหลังหรือไม่?
นิลส์

38
@ ไม่มีจริงคุณอาจต้องการudevtrigger(หรือมากกว่าudevadm triggerในการแจกแจงส่วนใหญ่) แทน (นั่นคือหรือเสียบอุปกรณ์กลับและสำรอง) --reload-rulesเกือบจะไร้ประโยชน์เสมอเมื่อมันเกิดขึ้นโดยอัตโนมัติ
Gilles

12
udevadm triggerเคล็ดลับสำหรับ CentOS 6 สำหรับฉันแล้ว
astrostl

3
udevtriggerหรือudevadm triggerไม่ได้ผลสำหรับฉัน ฉันพบว่าอุปกรณ์บางอย่างจะทำงานหลังจากที่ยกเลิกการโหลดและโหลดโมดูลสำหรับเดียวกัน (สมมติว่ามันเป็นโมดูลที่โหลดได้) สิ่งที่ฉันพบคือไม่จำเป็นต้องรีบูตระบบ ตัวอย่างสำหรับอุปกรณ์เครือข่ายที่ฉันทำrmmod ixgbe, rmmod tg3, rmmod e1000แล้วmodprobe ixgbe, modprobe tg3, modprobe e1000ขึ้นอยู่กับชนิดของโปรแกรมควบคุมเครือข่าย
กระตือรือร้น

1
ไม่มีสิ่งใดที่ได้กล่าวถึงในบรรดาคำตอบที่ฉันใช้กับ Debian Jessie (8.0) สิ่งที่ทำงานมีการip link set $oldname name $newnameกล่าวถึงที่นี่ ในกรณีของฉันฉันต้องการแทนที่ iface ที่ชื่อlanด้วย bridged iface (สำหรับ KVM) และด้วยเหตุนี้ต้นฉบับ - ตอนนี้ - iface ต้องได้รับชื่อเก่าของมันeth1กลับมา ดังนั้นเคล็ดลับคือ: 1) นำ iface ลง; 2) แก้ไขการกำหนดค่าเครือข่าย 3) อัปเดตไฟล์ udev การตั้งชื่อกฎ; 4) เปลี่ยนชื่อ iface ที่ใช้ip link...; 5) นำสะพานขึ้นมา
kostix

69

Udev ใช้กลไกinotifyเพื่อดูการเปลี่ยนแปลงในไดเรกทอรีกฎทั้งในห้องสมุดและในต้นไม้การกำหนดค่าท้องถิ่น (โดยทั่วไปจะอยู่ที่/lib/udev/rules.dและ/etc/udev/rules.d) ดังนั้นเวลาส่วนใหญ่คุณไม่จำเป็นต้องทำอะไรเมื่อคุณเปลี่ยนไฟล์กฎ

คุณจะต้องแจ้งให้ udev daemon อย่างชัดเจนหากคุณทำสิ่งผิดปกติตัวอย่างเช่นถ้าคุณมีกฎที่มีไฟล์ในไดเรกทอรีอื่น จากนั้นคุณสามารถใช้การประชุมตามปกติเพื่อขอให้ daemons โหลดการกำหนดค่าของพวกเขาซ้ำอีกครั้ง: ส่งSIGHUP ( pkill -HUP udevd) หรือคุณสามารถใช้คำสั่ง:udevadmudevadm control --reload-rules

อย่างไรก็ตามโปรดระวังว่า udev เวอร์ชันที่แตกต่างกันในอดีตมีทริกเกอร์ที่ต่างกันสำหรับการโหลดกฎโดยอัตโนมัติ ดังนั้นหากมีข้อสงสัยโทรudevadm control --reload-rules: มันจะไม่ทำอันตรายใด ๆ

กฎ udev จะถูกนำไปใช้เฉพาะเมื่อมีการเพิ่มอุปกรณ์ หากคุณต้องการที่จะนำไปใช้ใหม่กฎไปยังอุปกรณ์ที่เชื่อมต่ออยู่แล้วคุณจะต้องทำเช่นนี้อย่างชัดเจนโดยการเรียกudevadm triggerพร้อมกับตัวเลือกที่เหมาะสมเพื่อให้ตรงกับอุปกรณ์ (s) udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'มีการกำหนดค่าที่มีการเปลี่ยนแปลงเช่น


1
systemd udev ใช้ inotify เพื่อเฝ้าดูการเปลี่ยนแปลงกฎหรือไม่?
Craig McQueen

inotifyกลไกไม่เคยจับการเปลี่ยนแปลงของไฟล์กฎ udev ตัวอย่างเช่นเมื่อฉันใช้การเปลี่ยนไฟล์กฎโดยการวางเนื้อหาที่ฉันต้องโหลดด้วยตนเองโดยใช้กฎcat > 10-name.rules udevadmทดสอบกับ Raspbian Stretch
Daniel K.

@DanielK มีการเปลี่ยนแปลงเมื่อเร็ว ๆ นี้? IIRC ฉันตรวจสอบทั้ง systemd udev และ non-systemd udev เมื่อฉันโพสต์คำตอบนี้และทั้งสองใช้ inotify ดังนั้นจึง--reload-rulesจำเป็นเฉพาะในกรณีที่ไม่ธรรมดา
Gilles

@Gilles: อาจเป็นตัวอย่างของฉันด้านบน (การเขียนทับไฟล์กฎที่มีอยู่โดยใช้การเปลี่ยนเส้นทางเชลล์) อาจถือได้ว่าเป็น "กรณีผิดปกติ" เมื่อฉันแก้ไขไฟล์นี้ด้วยวิธีการแก้ไขเช่น vi inotifyกลไกการทำงาน
Daniel K.

@DanielK อานั่นเป็นเรื่องดีที่จะรู้ ไม่ใช่กรณีผิดปกติ: บรรณาธิการบางคนจะบันทึกไฟล์ด้วยการเขียนใหม่ (ด้วย Vim และ Emacs ขึ้นอยู่กับการกำหนดค่า) แปลกที่ udev จัดการกับหนึ่งในกรณีเท่านั้น - ดูเหมือนว่าเป็นข้อบกพร่องสำหรับฉันเพราะฉันไม่สามารถคิดเหตุผลที่จะปฏิบัติต่อพวกเขาแตกต่างกัน
Gilles

19

ฉันกำลังเพิ่มเพราะบางวันฉันต้องการมัน ... อีกครั้ง

บางครั้งคุณได้รับหมายเลขอุปกรณ์อีเธอร์เน็ตและที่อยู่ MAC ที่ไม่ถูกต้อง บางครั้งสิ่งนี้มีความสำคัญจริง ๆ เช่นเมื่อทำงานใน VM และแต่ละอุปกรณ์ถูกกำหนดให้กับ VLAN ที่แตกต่างกัน

  1. ทำให้ส่วนต่อประสานเครือข่ายล่มแล้ว
  2. แก้ไข/etc/udev/rules.d/70-persistent-net.rules(หรือเทียบเท่า)
  3. โหลดซ้ำกับ udevadm control --reload-rules
  4. ทริกเกอร์อีกครั้งด้วย udevadm trigger --attr-match=subsystem=net
  5. นำอินเทอร์เฟซเครือข่ายขึ้น

ฉันรู้สึกประหลาดใจว่ามันทำงานได้ดีแค่ไหน


6
ใน Red Hat:service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
Alexander Torstling

1
ในการทดสอบ Debian 'udevadm trigger --attr-match = ระบบย่อย = net' ไม่ทำงาน ฉันต้องถอดปลั๊กและเสียบการ์ดอีเธอร์เน็ต usb เท่านั้นจากนั้น udev จะเรียกใช้กฎใหม่
Trismegistos

ฉันยินดีที่จะเดิมพัน Trismegistos ว่า unplug / plug นั้นคล้ายกับการถอดและโหลดไดรเวอร์เครือข่ายใหม่ตามคำตอบของ Clayton Dukes
Mike S

12

ฉันไม่แน่ใจว่าสิ่งนี้มีผลบังคับใช้หรือไม่และนี่เป็นบทความเก่ากว่านี้ แต่มันก็ค่อนข้างสูงในการค้นหาเว็บสำหรับข้อมูล udev ดังนั้นฉันคิดว่าฉันอาจแบ่งปันความรู้บางอย่าง

คุณสามารถเรียกใช้กฎ udev ด้วยตนเองสำหรับอุปกรณ์เฉพาะ สิ่งนี้ใช้เฉพาะกับ distros ที่เกี่ยวข้องกับ redhat (centos fedora ฯลฯ ฯลฯ )

เมื่อคุณทำการเปลี่ยนแปลงที่เกี่ยวข้องในไฟล์ rules ของคุณ ( /etc/udev/rules.d/whateveryoucalledyourrules) คุณสามารถสะท้อนchangeไปยังอุปกรณ์ของคุณได้

echo change > /sys/block/devname/partname1/uevent

สิ่งนี้จะบังคับใช้กฎ udev สำหรับอุปกรณ์นี้เท่านั้น ดีกว่ามากและตรงเป้าหมายมากขึ้นในความคิดของฉัน


4

สำหรับฉันลำดับคำสั่งด้านล่างใช้ได้ผลตามที่ต้องการ

ฉันทำการแก้ไข/etc/udev/rules.d/70-persistent-net.rulesเพื่อเปลี่ยนethหมายเลขและโหลดซ้ำโดยไม่ต้องรีบูตเครื่อง

/etc/init.d/networking stop
/etc/init.d/udev stop
udevadm control --reload-rules
/etc/init.d/udev start
/etc/init.d/networking start

โดยทำตามสิ่งนี้มันถูกโหลดสำเร็จในเวลาทำงานโดยไม่ต้องรีบูตเครื่อง

ข้อเสนอแนะหรือคำแนะนำใด ๆ เกี่ยวกับเรื่องนี้ยินดีต้อนรับเพราะฉันได้ค้นพบสิ่งนี้ด้วยตัวเองโดยการอ่านหน้าคน


2

ฉันกำลังเพิ่มคำตอบที่ถูกต้องที่นี่เพราะใช้เวลาสักครู่ในการสังเกตในความคิดเห็นจาก @enthusiasticgeek สิ่งที่คุณต้องทำ (สมมติว่าคุณอยู่บนคอนโซลของเซิร์ฟเวอร์ - ชัดเจนว่าเป็นการดีถ้าคุณมี ssh'd!):

  1. รับรายการของโมดูลอินเตอร์เฟสที่ใช้อยู่:

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq

ในกรณีของฉันมันigbก็เลยพิมพ์ออกมา

  1. ประเภทsudo rmmod igb(แทนที่igbด้วยไดรเวอร์การ์ดของคุณที่ได้รับจากขั้นตอนที่ 1

ถัดไปแก้ไข/etc/udev/rules.d/70-persistent-net.rulesตามต้องการจากนั้นโหลดโมดูลอีกครั้งโดยใช้modprobe igbอีกครั้งแทนที่igbด้วยของคุณ


เมื่อรวมกับคำตอบของ Otheus นี้เป็นซอสลับที่ทำให้ฉันสามารถแก้ไขการตั้งค่าการ์ดเครือข่าย Mellanox ได้โดยไม่ต้องรีบูตเครื่อง ฉันเชื่อว่าการโหลดไดรเวอร์และการอ่าน udevadm ของไฟล์ persistent-net.rules นั้นคล้ายกับสิ่งที่ระบบทำเมื่อทำการบูท
Mike S

0

ในกรณีที่มีหลายเครือข่าย

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | awk '{print $NF}'|sed -e 's/(//g' -e 's/)//g'| uniq > /tmp/listnet
rm -rf /etc/udev/rules.d/70-persistent-net.rules 
for i in $(cat /tmp/listnet); do rmmod $i; modprobe $i;done
service network restart
rm -rf /tmp/listnet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.