Come si dovrebbero ricaricare le regole udev, in modo che una nuova creazione possa funzionare?
Sto eseguendo Arch Linux e non ho un udevstart
comando qui.
Anche controllato /etc/rc.d
, nessun servizio udev lì.
udev
? È il manager di /dev
?
Come si dovrebbero ricaricare le regole udev, in modo che una nuova creazione possa funzionare?
Sto eseguendo Arch Linux e non ho un udevstart
comando qui.
Anche controllato /etc/rc.d
, nessun servizio udev lì.
udev
? È il manager di /dev
?
Risposte:
# udevadm control --reload-rules && udevadm trigger
udevtrigger
dopo?
udevtrigger
(o meglio udevadm trigger
nella maggior parte delle distribuzioni) invece (quello, o collegare il dispositivo e ripristinarlo). --reload-rules
è quasi sempre inutile come accade automaticamente.
udevadm trigger
ha fatto il trucco su CentOS 6 per me.
udevtrigger
o udevadm trigger
non ha funzionato per me. Ho scoperto che alcuni dispositivi funzioneranno dopo aver scaricato e caricato il modulo per lo stesso (supponendo che sia un modulo caricabile). Quello che ho scoperto è che non è necessario riavviare il sistema. Esempio di un dispositivo di rete, faccio rmmod ixgbe
, rmmod tg3
, rmmod e1000
quindi modprobe ixgbe
, modprobe tg3
, modprobe e1000
a seconda del tipo di driver di rete.
ip link set $oldname name $newname
menzionata qui . Nel mio caso, avevo bisogno di sostituire un iface di nome lan
con un iface ponte (per KVM), e, quindi, l'originale - ora sottostante - iface dovuto ottenere il suo vecchio nome, eth1
, indietro. Quindi il trucco era: 1) abbattere iface; 2) correggere la configurazione della rete; 3) aggiorna il file delle regole di denominazione udev; 4) rinominare l'iface usando ip link...
; 5) solleva il ponte.
Udev utilizza il meccanismo inotify per controllare le modifiche nella directory delle regole, sia nella libreria che negli alberi di configurazione locali (generalmente situati in /lib/udev/rules.d
e /etc/udev/rules.d
). Quindi la maggior parte delle volte non è necessario fare nulla quando si modifica un file delle regole.
Devi solo avvisare esplicitamente il demone udev se stai facendo qualcosa di insolito, ad esempio se hai una regola che include file in un'altra directory. Quindi puoi usare la solita convenzione per chiedere ai demoni di ricaricare la loro configurazione: invia un SIGHUP ( pkill -HUP udevd
). Oppure si può utilizzare il udevadm
comando: udevadm control --reload-rules
.
Tuttavia, attenzione che diverse versioni di udev hanno storicamente avuto diversi trigger per ricaricare automaticamente le regole. Quindi, in caso di dubbio, chiama udevadm control --reload-rules
: non farà comunque alcun danno.
Le regole udev vengono applicate solo quando viene aggiunto un dispositivo. Se si desidera applicare nuovamente le regole a un dispositivo già connesso, è necessario farlo esplicitamente, chiamando udevadm trigger
le opzioni giuste per abbinare i dispositivi la cui configurazione è cambiata, ad es udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'
.
inotify
meccanismo non rileva sempre una modifica di un file di regole udev. Ad esempio, quando uso cat > 10-name.rules
per modificare il file delle regole incollando il contenuto, devo ricaricare le regole manualmente usando udevadm
. Testato su Raspbian Stretch.
--reload-rules
era necessario solo in casi non comuni.
inotify
meccanismo ha funzionato.
Sto aggiungendo questo perché un giorno ne avrò bisogno ... di nuovo.
A volte si ottiene una corrispondenza errata dei numeri di dispositivo Ethernet e degli indirizzi MAC. A volte questo è davvero importante, come quando si esegue in una macchina virtuale e ogni dispositivo è assegnato a una VLAN diversa.
/etc/udev/rules.d/70-persistent-net.rules
(o suo equivalente)udevadm control --reload-rules
udevadm trigger --attr-match=subsystem=net
Sono rimasto sorpreso da quanto funzionasse.
service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
Non sono sicuro se questo si applica, e questo è sicuramente un post più vecchio, ma è arrivato piuttosto in alto la mia ricerca web per informazioni su udev, quindi ho pensato di condividere alcune conoscenze.
È possibile attivare manualmente le regole udev per dispositivi specifici. Questo vale solo per le distribuzioni relative a redhat (centos fedora ecc ecc ecc)
Dopo aver apportato le modifiche pertinenti nel file delle regole ( /etc/udev/rules.d/whateveryoucalledyourrules
), è possibile echeggiare change
nell'event del dispositivo.
echo change > /sys/block/devname/partname1/uevent
Questo forzerà la lettura di una regola udev SOLO per questo dispositivo. Molto meglio e più mirato secondo me.
Per me, la sequenza di comandi di seguito ha funzionato come desiderato.
Ho apportato modifiche /etc/udev/rules.d/70-persistent-net.rules
per modificare il eth
numero e ricaricarli senza riavviare.
/etc/init.d/networking stop
/etc/init.d/udev stop
udevadm control --reload-rules
/etc/init.d/udev start
/etc/init.d/networking start
In seguito, è stato caricato correttamente in fase di esecuzione senza riavviare la macchina.
Qualsiasi suggerimento o consiglio su questo è il benvenuto, come ho scoperto da solo leggendo le pagine man.
Sto aggiungendo la risposta corretta qui perché mi ci è voluto un po 'di tempo per notarla nel commento di @enthusiasticgeek. Tutto quello che devi fare (supponendo che tu sia sulla console del server - chiaramente questo è male da fare se sei entrato!):
cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq
Nel mio caso, lo è igb
, quindi stampa proprio quello.
sudo rmmod igb
(sostituire igb
con il driver della scheda ottenuto dal passaggio 1.quindi, modifica /etc/udev/rules.d/70-persistent-net.rules
secondo necessità, quindi carica nuovamente il modulo utilizzando modprobe igb
, nuovamente sostituendolo igb
con il tuo.
in caso di più reti
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