เราควรรีโหลดกฎ udev อย่างไรเพื่อให้กฎที่สร้างขึ้นใหม่สามารถทำงานได้
ฉันใช้ Arch Linux และฉันไม่มีudevstart
คำสั่งที่นี่
ตรวจสอบ/etc/rc.d
แล้วไม่มีบริการ udev
udev
อะไร มันเป็นผู้จัดการของ/dev
?
เราควรรีโหลดกฎ udev อย่างไรเพื่อให้กฎที่สร้างขึ้นใหม่สามารถทำงานได้
ฉันใช้ Arch Linux และฉันไม่มีudevstart
คำสั่งที่นี่
ตรวจสอบ/etc/rc.d
แล้วไม่มีบริการ udev
udev
อะไร มันเป็นผู้จัดการของ/dev
?
คำตอบ:
# udevadm control --reload-rules && udevadm trigger
udevtrigger
ภายหลังหรือไม่?
udevtrigger
(หรือมากกว่าudevadm trigger
ในการแจกแจงส่วนใหญ่) แทน (นั่นคือหรือเสียบอุปกรณ์กลับและสำรอง) --reload-rules
เกือบจะไร้ประโยชน์เสมอเมื่อมันเกิดขึ้นโดยอัตโนมัติ
udevadm trigger
เคล็ดลับสำหรับ CentOS 6 สำหรับฉันแล้ว
udevtrigger
หรือudevadm trigger
ไม่ได้ผลสำหรับฉัน ฉันพบว่าอุปกรณ์บางอย่างจะทำงานหลังจากที่ยกเลิกการโหลดและโหลดโมดูลสำหรับเดียวกัน (สมมติว่ามันเป็นโมดูลที่โหลดได้) สิ่งที่ฉันพบคือไม่จำเป็นต้องรีบูตระบบ ตัวอย่างสำหรับอุปกรณ์เครือข่ายที่ฉันทำrmmod ixgbe
, rmmod tg3
, rmmod e1000
แล้วmodprobe ixgbe
, modprobe tg3
, modprobe e1000
ขึ้นอยู่กับชนิดของโปรแกรมควบคุมเครือข่าย
ip link set $oldname name $newname
กล่าวถึงที่นี่ ในกรณีของฉันฉันต้องการแทนที่ iface ที่ชื่อlan
ด้วย bridged iface (สำหรับ KVM) และด้วยเหตุนี้ต้นฉบับ - ตอนนี้ - iface ต้องได้รับชื่อเก่าของมันeth1
กลับมา ดังนั้นเคล็ดลับคือ: 1) นำ iface ลง; 2) แก้ไขการกำหนดค่าเครือข่าย 3) อัปเดตไฟล์ udev การตั้งชื่อกฎ; 4) เปลี่ยนชื่อ iface ที่ใช้ip link...
; 5) นำสะพานขึ้นมา
Udev ใช้กลไกinotifyเพื่อดูการเปลี่ยนแปลงในไดเรกทอรีกฎทั้งในห้องสมุดและในต้นไม้การกำหนดค่าท้องถิ่น (โดยทั่วไปจะอยู่ที่/lib/udev/rules.d
และ/etc/udev/rules.d
) ดังนั้นเวลาส่วนใหญ่คุณไม่จำเป็นต้องทำอะไรเมื่อคุณเปลี่ยนไฟล์กฎ
คุณจะต้องแจ้งให้ udev daemon อย่างชัดเจนหากคุณทำสิ่งผิดปกติตัวอย่างเช่นถ้าคุณมีกฎที่มีไฟล์ในไดเรกทอรีอื่น จากนั้นคุณสามารถใช้การประชุมตามปกติเพื่อขอให้ daemons โหลดการกำหนดค่าของพวกเขาซ้ำอีกครั้ง: ส่งSIGHUP ( pkill -HUP udevd
) หรือคุณสามารถใช้คำสั่ง:udevadm
udevadm control --reload-rules
อย่างไรก็ตามโปรดระวังว่า udev เวอร์ชันที่แตกต่างกันในอดีตมีทริกเกอร์ที่ต่างกันสำหรับการโหลดกฎโดยอัตโนมัติ ดังนั้นหากมีข้อสงสัยโทรudevadm control --reload-rules
: มันจะไม่ทำอันตรายใด ๆ
กฎ udev จะถูกนำไปใช้เฉพาะเมื่อมีการเพิ่มอุปกรณ์ หากคุณต้องการที่จะนำไปใช้ใหม่กฎไปยังอุปกรณ์ที่เชื่อมต่ออยู่แล้วคุณจะต้องทำเช่นนี้อย่างชัดเจนโดยการเรียกudevadm trigger
พร้อมกับตัวเลือกที่เหมาะสมเพื่อให้ตรงกับอุปกรณ์ (s) udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'
มีการกำหนดค่าที่มีการเปลี่ยนแปลงเช่น
inotify
กลไกไม่เคยจับการเปลี่ยนแปลงของไฟล์กฎ udev ตัวอย่างเช่นเมื่อฉันใช้การเปลี่ยนไฟล์กฎโดยการวางเนื้อหาที่ฉันต้องโหลดด้วยตนเองโดยใช้กฎcat > 10-name.rules
udevadm
ทดสอบกับ Raspbian Stretch
--reload-rules
จำเป็นเฉพาะในกรณีที่ไม่ธรรมดา
inotify
กลไกการทำงาน
ฉันกำลังเพิ่มเพราะบางวันฉันต้องการมัน ... อีกครั้ง
บางครั้งคุณได้รับหมายเลขอุปกรณ์อีเธอร์เน็ตและที่อยู่ MAC ที่ไม่ถูกต้อง บางครั้งสิ่งนี้มีความสำคัญจริง ๆ เช่นเมื่อทำงานใน VM และแต่ละอุปกรณ์ถูกกำหนดให้กับ VLAN ที่แตกต่างกัน
/etc/udev/rules.d/70-persistent-net.rules
(หรือเทียบเท่า)udevadm control --reload-rules
udevadm trigger --attr-match=subsystem=net
ฉันรู้สึกประหลาดใจว่ามันทำงานได้ดีแค่ไหน
service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
ฉันไม่แน่ใจว่าสิ่งนี้มีผลบังคับใช้หรือไม่และนี่เป็นบทความเก่ากว่านี้ แต่มันก็ค่อนข้างสูงในการค้นหาเว็บสำหรับข้อมูล udev ดังนั้นฉันคิดว่าฉันอาจแบ่งปันความรู้บางอย่าง
คุณสามารถเรียกใช้กฎ udev ด้วยตนเองสำหรับอุปกรณ์เฉพาะ สิ่งนี้ใช้เฉพาะกับ distros ที่เกี่ยวข้องกับ redhat (centos fedora ฯลฯ ฯลฯ )
เมื่อคุณทำการเปลี่ยนแปลงที่เกี่ยวข้องในไฟล์ rules ของคุณ ( /etc/udev/rules.d/whateveryoucalledyourrules
) คุณสามารถสะท้อนchange
ไปยังอุปกรณ์ของคุณได้
echo change > /sys/block/devname/partname1/uevent
สิ่งนี้จะบังคับใช้กฎ udev สำหรับอุปกรณ์นี้เท่านั้น ดีกว่ามากและตรงเป้าหมายมากขึ้นในความคิดของฉัน
สำหรับฉันลำดับคำสั่งด้านล่างใช้ได้ผลตามที่ต้องการ
ฉันทำการแก้ไข/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
โดยทำตามสิ่งนี้มันถูกโหลดสำเร็จในเวลาทำงานโดยไม่ต้องรีบูตเครื่อง
ข้อเสนอแนะหรือคำแนะนำใด ๆ เกี่ยวกับเรื่องนี้ยินดีต้อนรับเพราะฉันได้ค้นพบสิ่งนี้ด้วยตัวเองโดยการอ่านหน้าคน
ฉันกำลังเพิ่มคำตอบที่ถูกต้องที่นี่เพราะใช้เวลาสักครู่ในการสังเกตในความคิดเห็นจาก @enthusiasticgeek สิ่งที่คุณต้องทำ (สมมติว่าคุณอยู่บนคอนโซลของเซิร์ฟเวอร์ - ชัดเจนว่าเป็นการดีถ้าคุณมี ssh'd!):
cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq
ในกรณีของฉันมันigb
ก็เลยพิมพ์ออกมา
sudo rmmod igb
(แทนที่igb
ด้วยไดรเวอร์การ์ดของคุณที่ได้รับจากขั้นตอนที่ 1ถัดไปแก้ไข/etc/udev/rules.d/70-persistent-net.rules
ตามต้องการจากนั้นโหลดโมดูลอีกครั้งโดยใช้modprobe igb
อีกครั้งแทนที่igb
ด้วยของคุณ
ในกรณีที่มีหลายเครือข่าย
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