Udev: differenze tra le versioni

m
verificata, compatibile per tutte le versioni
(completamento guida)
m (verificata, compatibile per tutte le versioni)
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 3: Riga 3:
|successivo=LVM:_Logical_Volume_Manager
|successivo=LVM:_Logical_Volume_Manager
}}
}}
 
{{Versioni compatibili}}
{{Versioni compatibili|Jessie}}
 
== Introduzione ==
== Introduzione ==
'''Udev''' si occupa della gestione dinamica dei dispositivi per il kernel Linux ed è una componente importante di Debian, il cui [[pacchetto]] omonimo è quindi installato di default. In particolare gestisce i file di tipo dispositivo nella directory <code>/dev</code>, ossia tutti gli eventi relativi all'aggiunta e rimozione di hardware, incluso l'eventuale caricamento dei relativi firmware, e tutti i cambiamenti di stato di un dispositivo.
'''Udev''' si occupa della gestione dinamica dei dispositivi per il kernel Linux ed è una componente importante di Debian, il cui [[pacchetto]] omonimo è quindi installato di default. In particolare gestisce i file di tipo dispositivo nella directory <code>/dev</code>, ossia tutti gli eventi relativi all'aggiunta e rimozione di hardware, incluso l'eventuale caricamento dei relativi firmware, e tutti i cambiamenti di stato di un dispositivo.
Riga 49: Riga 47:
Tutti questi eventi sono stati generati dal solo inserimento della memoria. L'ultimo riguarda la generazione del file di tipo dispositivo a blocchi <code>/dev/sdb1</code>, corrispondente alla partizione della memoria USB, mentre il penultimo la creazione del file a blocchi <code>/dev/sdb</code>, corrispondente all'intero dispositivo, inclusa la tabella delle partizioni. Si noti che gli eventi sono prodotti dal più generale, riguardante un generico dispositivo USB, al più particolare, riguardante la creazione di un file a blocchi che può essere montato per accedere alla partizione della memoria di massa.
Tutti questi eventi sono stati generati dal solo inserimento della memoria. L'ultimo riguarda la generazione del file di tipo dispositivo a blocchi <code>/dev/sdb1</code>, corrispondente alla partizione della memoria USB, mentre il penultimo la creazione del file a blocchi <code>/dev/sdb</code>, corrispondente all'intero dispositivo, inclusa la tabella delle partizioni. Si noti che gli eventi sono prodotti dal più generale, riguardante un generico dispositivo USB, al più particolare, riguardante la creazione di un file a blocchi che può essere montato per accedere alla partizione della memoria di massa.


Per ottenere maggiori informazioni su ciascun evento, si può utilizzare l'opzione <code>--property</code> (abbreviata: <code>-p</code>).Quindi per esempio:
Per ottenere maggiori informazioni su ciascun evento, si utilizza l'opzione <code>--property</code> (abbreviata: <code>-p</code>).<br/>Quindi per esempio:
<pre>
<pre>
$ udevadm monitor -u -p
$ udevadm monitor -u -p
Riga 190: Riga 188:
$ udevadm info -q path -n sdb1
$ udevadm info -q path -n sdb1
</pre>
</pre>
Restituisce il percorso (a partire da <code>/sys/<code>):
Restituisce il percorso (a partire da <code>/sys/</code>):
<pre>
<pre>
/devices/pci0000:00/0000:00:1a.7/usb6/6-1/6-1:1.0/host10/target10:0:0/10:0:0:0/block/sdb/sdb1
/devices/pci0000:00/0000:00:1a.7/usb6/6-1/6-1:1.0/host10/target10:0:0/10:0:0:0/block/sdb/sdb1
</pre>
</pre>


=== Testare regole ===
=== Testare le regole ===
Con il percorso a partire da <code>/sys</code> di un dato dispositivo e [[privilegi di amministrazione]], è sufficiente:
Con il percorso a partire da <code>/sys</code> di un dato dispositivo, è sufficiente:
<pre>
<pre>
# udevadm test /percorso
$ udevadm test /percorso
</pre>
</pre>
Saranno testati ricorsivamente tutti gli eventi contenuti a partire dal percorso scelto.
Saranno simulati ricorsivamente tutti gli eventi contenuti a partire dal percorso scelto. Possono essere richiesti [[privilegi di amministrazione]], a seconda delle azioni necessarie per gli eventi.


È possibile specificare azioni (come per esempio ''add'' o ''remove'') con l'opzione <code>--action=ACTION</code> (abbreviata: <code>-a</code>).
È possibile specificare azioni (come per esempio ''add'' o ''remove'') con l'opzione <code>--action=ACTION</code> (abbreviata: <code>-a</code>).


Per esempio, sempre con la memoria USB, per testare gli eventi di aggiunta e rimozione del dispositivo:
Per esempio, sempre con la memoria USB, per simulare gli eventi di aggiunta e rimozione del dispositivo:
<pre>
<pre>
# udevadm test $(udevadm info -q path -n sdb1) -a add
$ udevadm test $(udevadm info -q path -n sdb1) -a add
# udevadm test $(udevadm info -q path -n sdb1) -a remove
$ udevadm test $(udevadm info -q path -n sdb1) -a remove
</pre>
</pre>


Riga 228: Riga 226:
{{Box | Dispositivi di memoria e interfacce di rete | Per il montaggio automatico di dispositivi di memoria di massa, si deve fare riferimento a [[udisks]], e non creare una regola per '''udev''', che si deve occupare soltanto dei nomi e delle proprietà dei file dispositivo nella directory <code>/dev</code>, ma non deve interferire con le funzionalità degli altri demoni di sistema.
{{Box | Dispositivi di memoria e interfacce di rete | Per il montaggio automatico di dispositivi di memoria di massa, si deve fare riferimento a [[udisks]], e non creare una regola per '''udev''', che si deve occupare soltanto dei nomi e delle proprietà dei file dispositivo nella directory <code>/dev</code>, ma non deve interferire con le funzionalità degli altri demoni di sistema.


Per lo stesso motivo non si deve occupare della gestione delle connessioni di rete. Inoltre i nomi da assegnare alle interfacce di rete sono gestiti dalle regole scritte in <code>/etc/udev/rules.d/70-persistent-net.rules</code>, generato automaticamente.}}
Per lo stesso motivo non si deve occupare della gestione delle connessioni di rete. Inoltre i nomi da assegnare alle interfacce di rete sono gestiti dalle regole scritte in <code>/etc/udev/rules.d/70-persistent-net.rules</code>, generato automaticamente. Il file non esiste più a partire da Debian 9 ([[Stretch]]), in quanto le interfacce di rete sono già persistenti di default con le recenti versioni di '''udev'''.}}


È sufficiente creare nella directory <code>/etc/udev/rules.d</code> un nuovo file con estensione <code>.rules</code>, uno per ciascun dispositivo.
È sufficiente creare nella directory <code>/etc/udev/rules.d</code> un nuovo file con estensione <code>.rules</code>, uno per ciascun dispositivo.
Riga 239: Riga 237:
* condizioni e azioni sono distinguibili soltanto dall'operatore utilizzato e dalle chiavi utilizzabili, e inoltre il valore di una condizione può essere un pattern con <code>*</code> per rappresentare qualsiasi stringa.
* condizioni e azioni sono distinguibili soltanto dall'operatore utilizzato e dalle chiavi utilizzabili, e inoltre il valore di una condizione può essere un pattern con <code>*</code> per rappresentare qualsiasi stringa.


Per una descrizione esaustiva si rimanda al manuale (<code>man udev</code>), di seguito qualche semplice esempio.
Per una descrizione esaustiva si rimanda al manuale (<code>man udev</code>), di seguito sono introdotte soltanto le condizioni e le azioni principali.


Per le condizioni si considera l'operatore di equivalenza (<code>==</code>) con alcune chiavi comuni (si controlli per un esempio i valori restituiti in precedenza con la chiave USB):
Per le condizioni si considera soltanto l'operatore di equivalenza (<code>==</code>) con alcune chiavi comuni (si controlli per un esempio i valori restituiti in precedenza con la chiave USB):
* <code>ACTION</code> per determinare le azioni a cui la regola va applicata, come osservati monitorando gli eventi;
* <code>ACTION</code> per determinare le azioni a cui la regola va applicata, come osservati monitorando gli eventi;
* <code>KERNEL</code> il nome del file di tipo dispositivo, come sarebbe scelto senza l'attuale regola. Vista la scelta dinamica è in genere consigliabile utilizzare un pattern con <code>*</code> (per esempio in <code>/etc/udev/rules.d/70-persistent-net.rules</code> è utilizzata la condizione <code>KERNEL=="eth*"</code>);
* <code>KERNEL</code> il nome del file di tipo dispositivo, come sarebbe scelto senza l'attuale regola. Vista la scelta dinamica è in genere consigliabile utilizzare un pattern con <code>*</code> (per esempio in <code>/etc/udev/rules.d/70-persistent-net.rules</code> era utilizzata la condizione <code>KERNEL=="eth*"</code>), a meno che si intenda solo cambiare le proprietà di un dispositivo esistente, il cui nome è già determinato staticamente e univoco;
* <code>SUBSYSTEMS</code> per identificare il sottosistema dell'evento, in base ai valori monitorati e alla granularità desiderata;
* <code>SUBSYSTEMS</code> per identificare il sottosistema dell'evento, in base ai valori monitorati e alla granularità desiderata (''block'', ''scsi'', ''usb'', ''pci'', ecc...);
* <code>DRIVERS</code> per filtrare gli eventi in base al modulo del kernel utilizzato (per esempio nel caso della memoria USB dell'esempio sarebbe stato ''usb-storage'', ma dipende dalla granularità desiderata dal filtro);
* <code>DRIVERS</code> per filtrare gli eventi in base al modulo del kernel utilizzato (per esempio nel caso della memoria USB dell'esempio sarebbe stato ''usb-storage'', ma dipende dalla granularità desiderata dal filtro);
* <code>ENV{proprietà}</code> per confrontare i valori di una data proprietà, come ottenuti dal monitoraggio di un dato evento.
* <code>ENV{proprietà}</code> per confrontare i valori di una data proprietà, come ottenuti dal monitoraggio di un dato evento.


Per le azioni si considera l'operatore di assegnamento (<code>=</code>) con alcune chiavi comuni:
Per le azioni si considera soltanto l'operatore di assegnamento (<code>=</code>) con alcune chiavi comuni:
* <code>NAME</code> per determinare il nome del file di tipo dispositivo da creare, permesso solo per interfacce di rete;
* <code>NAME</code> per determinare il nome del file di tipo dispositivo da creare, permesso solo per interfacce di rete;
* <code>SYMLINK</code> per creare un link simbolico personalizzato, permesso per tutti i dispositivi, purché il nome non interferisca con quelli riservati dal kernel;
* <code>SYMLINK</code> per creare un link simbolico personalizzato, azione permessa per tutti i dispositivi, purché il nome non interferisca con quelli riservati dal kernel;
* <code>OWNER</code> per determinare l'utente proprietario;
* <code>OWNER</code> per determinare l'utente proprietario;
* <code>GROUP</code> per determinare il gruppo proprietario;
* <code>GROUP</code> per determinare il gruppo proprietario;
Riga 258: Riga 256:
== Esempi ==
== Esempi ==
=== Utilizzo di nomi persistenti per memorie rimovibili ===
=== Utilizzo di nomi persistenti per memorie rimovibili ===
Riprendendo l'esempio della memoria USB, basta creare un file <code>/etc/udev/rules.d/99-my-usb.rules</code>:
Riprendendo l'esempio della memoria USB, basta creare un file in <code>/etc/udev/rules.d</code> con estensione <code>.rules</code>, per esempio <code>/etc/udev/rules.d/99-my-usb.rules</code>, con questo contenuto:
<pre>
<pre>
ACTION=="add", SUBSYSTEMS=="usb", DRIVERS=="usb-storage", ENV{ID_VENDOR}=="TDKMedia", ENV{ID_FS_UUID}="...", SYMLINK="myusb"
ACTION=="add", SUBSYSTEMS=="usb", DRIVERS=="usb-storage", ENV{ID_VENDOR}=="TDKMedia", ENV{ID_FS_UUID}="...", SYMLINK="myusb"
Riga 272: Riga 270:
Si noti l'utilizzo di <code>SYMLINK</code> in luogo di <code>NAME</code>, in quanto è possibile soltanto creare un link simbolico personalizzato per file che non sono relativi a interfacce di rete. Si ricorda nuovamente che per effettuare il mount vero e proprio l'uso di '''udev''' è caldamente sconsigliato.
Si noti l'utilizzo di <code>SYMLINK</code> in luogo di <code>NAME</code>, in quanto è possibile soltanto creare un link simbolico personalizzato per file che non sono relativi a interfacce di rete. Si ricorda nuovamente che per effettuare il mount vero e proprio l'uso di '''udev''' è caldamente sconsigliato.


Un simile risultato si può ottenere impostando una regola personalizzata in <code>/etc/fstab</code>, che legga l'[[UUID]] della partizione, riservando una directory allo scopo come punto di mount personalizzato. Lo scopo di questa sezione è solo esemplificare il funzionamento di '''udev''', stesso motivo per cui si sono scritte più condizioni di quelle strettamente necessarie.
Un simile risultato si può ottenere impostando una regola personalizzata in <code>/etc/fstab</code>, che legga l'[[UUID]] della partizione, creando una directory allo scopo da riservarsi come punto di mount personalizzato. Lo scopo di questa sezione comunque è solo di esemplificare il funzionamento di '''udev''' e i risultati ottenibili, stesso motivo per cui si sono scritte più condizioni di quelle strettamente necessarie.


=== Permettere lettura e scrittura su una memoria esterna a tutti gli utenti di un dato gruppo ===
=== Permettere lettura e scrittura su una memoria esterna a tutti gli utenti di un dato gruppo ===
Riga 294: Riga 292:
Le prime tre condizioni filtrano gli eventi '''udev''', e si attivano durante la creazione (azione: ''add'') dei file dispositivo relativi al sottosistema ''usb'' e al modulo del kernel ''usb-storage''. Le restanti azioni assegnano al file come proprietario l'utente ''root'', il gruppo ''usbstorage'' e come permessi <code>0660</code>, corrispondente a permessi di lettura e scrittura per solo utente e gruppo.
Le prime tre condizioni filtrano gli eventi '''udev''', e si attivano durante la creazione (azione: ''add'') dei file dispositivo relativi al sottosistema ''usb'' e al modulo del kernel ''usb-storage''. Le restanti azioni assegnano al file come proprietario l'utente ''root'', il gruppo ''usbstorage'' e come permessi <code>0660</code>, corrispondente a permessi di lettura e scrittura per solo utente e gruppo.


Ora, in modo analogo a come funzionava il gruppo ''floppy'', sarà possibile formattare e copiare un'immagine CD direttamente sui supporti rimovibile anche senza privilegi di amministrazione, se si è membri del gruppo ''usbstorage''.
Ora, in modo analogo a come funzionava il gruppo ''floppy'', sarà possibile formattare e copiare un'immagine CD direttamente sui supporti rimovibili anche senza privilegi di amministrazione, se si è membri del gruppo ''usbstorage''.


{{Warningbox | Si noti invece che aggiungere il proprio utente al gruppo '''disk''', quello utilizzato di default a partire da Debian 8 ([[Jessie]]), gli darebbe permessi di lettura e scrittura anche sui dischi fissi utilizzati dal sistema, il che sarebbe praticamente equivalente (quanto a pericolosità dell'impostazione) a essere [[root]].}}
{{Warningbox | Si noti invece che aggiungere il proprio utente al gruppo '''disk''', quello utilizzato di default a partire da Debian 8 ([[Jessie]]), gli darebbe permessi di lettura e scrittura anche sui dischi fissi utilizzati dal sistema, il che sarebbe praticamente equivalente (quanto a pericolosità dell'impostazione) a essere [[root]].}}
Riga 325: Riga 323:
=== Manuali e file Leggimi ===
=== Manuali e file Leggimi ===
* Per la scrittura delle regole: <br /><code>$ man udev</code>
* Per la scrittura delle regole: <br /><code>$ man udev</code>
* Per i parametri del kernel e la sintassi del file di configurazione <code>/etc/udev/udev.conf</code>: <br /><code>$ man udevd</code>
* Per i parametri del kernel e la sintassi del file di configurazione <code>/etc/udev/udev.conf</code>: <br /><code>$ man udevd</code>
* Per la gestione degli eventi udev: <br /><code>$ man udevadm</code>
* Per la gestione degli eventi udev: <br /><code>$ man udevadm</code>
* Informazioni aggiuntive, relative alla sola integrazione in Debian: <br /><code>$ pager /usr/share/doc/udev/README.debian</code><br />(con note sulle interfacce di rete per <code>/etc/udev/rules.d/70-persistent-net.rules</code>, e uso di '''udev''' con utenti non locali tramite LDAP o NIS)
 
* Informazioni aggiuntive, relative alla sola integrazione in Debian: <br /><code>$ zless /usr/share/doc/udev/README.Debian.gz</code><br />(con note sulle interfacce di rete per <code>/etc/udev/rules.d/70-persistent-net.rules</code>, non più necessarie a partire da Debian 9 [[Stretch]] perché già persistenti di default, e uso di '''udev''' con utenti non locali tramite LDAP o NIS)


=== Collegamenti esterni ===
=== Collegamenti esterni ===
Riga 334: Riga 335:


{{Autori
{{Autori
|Autore = [[Utente:HAL 9000|HAL 9000]] 17:33, 24 ott 2015 (CEST)
|Autore = [[Utente:HAL 9000|HAL 9000]] 11:27, 21 lug 2019 (CEST)
|Estesa_da =
|Estesa_da =
:
|Verificata_da =
|Verificata_da =
:
|Numero_revisori = 0
|Numero_revisori = 0
}}
}}


[[Categoria:Servizi di sistema]]
[[Categoria:Servizi di sistema]]
3 581

contributi