Yeniden başlatmadan udev kurallarını nasıl yeniden yükleyebilirim?


209

Yeni udev kuralları nasıl çalışmalı?

Arch Linux kullanıyorum ve udevstartburada bir emrim yok.

Ayrıca kontrol /etc/rc.d, orada udev hizmeti yok.


1
Unutmayın, udev'in daha yeni sürümleri inotify desteğini düşürdü, bu nedenle değişiklikle ilgili kuralların yeniden yüklenmesi bugünlerde daha sık gerekli.
Colin Guthrie

Nedir udev? Yönetici /devmi?
Sandburg

1
@Sandburg evet, Linux sistemlerinde plug-n-play'i yönetiyor.
Aaron D. Marasco

Yanıtlar:


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

4
Daha udevtriggersonra ihtiyacınız var mı?
Nils

38
@Nils Aslında, bunun yerine udevtrigger(veya daha udevadm triggerçok dağıtımda) gerekebilir (bu veya cihazı takıp tekrar takın). --reload-rulesotomatik olarak olduğu gibi neredeyse her zaman işe yaramaz.
Gilles

12
udevadm triggerCentOS 6'daki numarayı benim için yaptı.
astrost

3
udevtriggerya udevadm triggerda benim için işe yaramadı. Modülün boşaltılıp takılmasından sonra bazı cihazların çalışacağını gördüm (yüklenebilir modül olduğu varsayılarak). Öğrendiğim şey, birinin sistemi yeniden başlatması gerekmiyor. Bir ağ cihazı için örnek, var rmmod ixgbe, rmmod tg3, rmmod e1000daha sonra modprobe ixgbe, modprobe tg3, modprobe e1000ağ sürücünün türüne bağlı olarak değişir.
meraklısı

1
Cevaplar arasında belirtilenlerden hiçbiri benim için Debian Jessie'de (8.0) çalıştı. İşe yarayan şey buradaip link set $oldname name $newname bahsedilir . Benim durumumda, köprülü bir iface (KVM için) adında bir iface değiştirmem gerekiyordu ve bu nedenle orijinal - şimdi temelde olan - iface eski adını almak zorunda kaldı . Yani püf noktası şuydu: 1) iface'i düşürmek; 2) ağ yapılandırmasını düzeltmek; 3) udev adlandırma kuralları dosyasını güncelleyin; 4) iface kullanarak yeniden adlandırın ; 5) köprüyü yukarı kaldırın. laneth1ip link...
kostix

69

Udev kullanan Inotify iki kütüphane ve yerel yapılandırma ağaçları (tipik olarak yer alan olarak, kural dizinde değişiklikleri izlemek için bir mekanizma /lib/udev/rules.dve /etc/udev/rules.d). Bu nedenle, bir kural dosyasını değiştirdiğinizde çoğu zaman hiçbir şey yapmanıza gerek kalmaz.

Alışılmadık bir şey yapıyorsanız, örneğin başka bir dizindeki dosyaları içeren bir kuralınız varsa, udev arka planını yalnızca açıkça bildirmeniz gerekir. Daha sonra, normal toplantıdan, servetlerden yapılandırmalarını yeniden yüklemelerini istemek için kullanabilirsiniz: bir SIGHUP ( pkill -HUP udevd) gönderin . Veya udevadm: komutunu kullanabilirsiniz udevadm control --reload-rules.

Bununla birlikte, udev'in farklı sürümlerinin tarihsel olarak kuralları otomatik olarak yeniden yüklemek için farklı tetikleyicilere sahip olduğuna dikkat edin. Şüpheniz varsa, arayın udevadm control --reload-rules: Zaten herhangi bir zararı olmaz.

Udev kuralları, yalnızca bir cihaz eklendiğinde uygulanır. Kuralları zaten bağlı olan bir cihaza yeniden uygulamak istiyorsanız udevadm trigger, yapılandırmasını değiştiren cihazlarla eşleştirmek için doğru seçenekleri arayarak açık bir şekilde yapmanız gerekir udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'.


1
Systemd udev kural değişikliklerini izlemek için inotify kullanıyor mu?
Craig McQueen

inotifyMekanizması her zaman Udev kural dosyasının bir değişiklik yakalamak değil. Örneğin cat > 10-name.rules, içeriği yapıştırarak kural dosyasını değiştirmek için kullandığımda , kuralları kullanarak el ile yeniden yüklemem gerekiyor udevadm. Raspbian Stretch'te test edilmiştir.
Daniel K.,

@DanielK. Bu yakın zamanda değişti mi? IIRC Bu cevabı gönderdiğimde hem bir systemd udev'i hem de systemd udev'i kontrol etmedim ve her ikisi de inotify kullandı, bu yüzden --reload-rulessadece nadir durumlarda gerekli oldu.
Gilles

@Gilles: belki yukarıdaki örneğimi (kabuk yeniden yönlendirme kullanarak varolan bir kural dosyasının üzerine yazmak) "nadir bir durum" olarak kabul edilebilir. Bu dosyayı bir editör vasıtasıyla değiştirdiğimde, örneğin, vi, inotifymekanizma çalıştı.
Daniel K.,

@DanielK. Ah, bunu bilmek güzel. Sıra dışı bir durum değil: bazı editörler dosyayı yeniden yazarak kaydeder (Vim ve Emacs ile nasıl yapılandırıldıklarına bağlı olarak). Uudev'in davalardan sadece birini ele alması garip - bana bir hata gibi geliyor çünkü onlara farklı davranmak için bir neden düşünemiyorum.
Gilles

19

Bunu ekliyorum çünkü bir gün tekrar ihtiyacım olacak.

Bazen ethernet cihaz numaraları ve MAC adresleri arasında yanlış bir eşleşme olabilir. Bazen bir VM'de çalışırken ve her bir cihaz farklı bir VLAN'a atandığında olduğu gibi bu gerçekten önemlidir.

  1. Ağ arayüzlerini aşağı indirin
  2. değiştir /etc/udev/rules.d/70-persistent-net.rules(veya eşdeğeri)
  3. yeniden yüklemek udevadm control --reload-rules
  4. ile yeniden tetiklemek udevadm trigger --attr-match=subsystem=net
  5. ağ arayüzlerini yukarı getir.

Bunun ne kadar iyi çalıştığına şaşırdım.


6
Kırmızı Şapka:service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
Alexander Torstling

1
Debian testinde 'udevadm trigger --attr-match = subsystem = net' çalışmıyor. Sadece udev yeni kuralı tetikleyen usb ethernet kartını fişten çekip çıkarmak zorunda kaldım.
Trismegistos

Bahse girerim Trismegistos, fişten çekmenin / fişin Clayton Dukes'in cevabına göre ağ sürücüsünü söküp yeniden yüklemeye benzer.
Mike S

12

Bunun geçerli olup olmadığından emin değilim ve bu kesinlikle daha eski bir gönderiydi, ancak udev bilgisi için web araştırmam oldukça yükseldi, bu yüzden biraz bilgi paylaşabilirim diye düşündüm.

Belirli cihazlar için udev kurallarını manuel olarak tetikleyebilirsiniz. Bu sadece redhat ile ilgili dağıtımlar için geçerlidir (centos fedora vb. Vb.)

Kural dosyanızda ( /etc/udev/rules.d/whateveryoucalledyourrules) ilgili değişiklikleri yaptıktan sonra change, cihazın kullanım tarihine eko yapabilirsiniz .

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

Bu SADECE bu cihaz için okumaya udev kural zorlar. Bence çok daha iyi ve daha hedefli.


4

Benim için, aşağıdaki komut sırası istenildiği gibi çalıştı.

Numarayı /etc/udev/rules.d/70-persistent-net.rulesdeğiştirmek ethve yeniden başlatmadan yeniden yüklemek için değişiklikler yaptım .

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

Bunu izleyerek, makineyi yeniden başlatmadan çalışma zamanında başarıyla yüklendi.

Bu konuyla ilgili her türlü öneri veya öneriniz memnuniyetle karşılanmaktadır, çünkü man sayfaları okuyarak kendi başıma keşfettim.


2

Buraya doğru cevabı ekliyorum çünkü @enthusiasticgeek'in yorumunda bunu fark etmem biraz zaman aldı. Tek yapmanız gereken (sunucunun konsolunda olduğunuzu farz edersek - açıkçası bunu yapmak kötüdür!):

  1. Kullanılan arayüz modüllerinin bir listesini alın:

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

Benim durumumda, öyle igb, bu yüzden sadece yazdırır.

  1. türünü sudo rmmod igbdeğiştirin ( igbadım 1'den alınan kart sürücünüzle değiştirin) .

daha sonra, /etc/udev/rules.d/70-persistent-net.rulesgerektiği gibi düzenleyin , ardından modprobe igbtekrar igbkendinizle değiştirerek kullanarak modülü tekrar yükleyin .


Bu, Otheus'un cevabıyla birleştiğinde, Mellanox ağ kartı yapılandırmamı makine yeniden başlatılmadan düzeltmemi sağlayan gizli sos oldu. Sürücü ve udevadm persatör-net.rules dosyasını okurken yükleme, sistemin önyükleme yaparken yaptıklarına benziyor.
Mike S

0

birden fazla ağ olması durumunda

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
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.