Ecco una brevissima, incompleta e -purtroppo- poco precisa guida su udev. Ero nella necessita’
di creare una regola che all’inserimento di una chiavetta usb, eseguisse il mount ed un
rsync. Son riuscito nell’impresa, ma onestamente non ho capito molto di udev
Chi vuole aggiungere qualcosa di sua fonte e’ il benvenuto.
Ecco una parziale traduzione
udev – Linux gestione dinamica dei devices
DESCRIZIONE
udev e’ il punto di congiunzione tra gli eventi dei devie e l’ambiente software di sistema. Esso amministra i permessi dei device
e puo’ creare symlink aggiuntivi, oppure rinominare le schede di rete. Il kernel assegna nomi-device a volte imprevedibili,
basati sull’ordine col quale vengono riconosciuti. E’ sicuramente piu’ comodo utilizzare nomi-device significativi in sostituzione
di cio’ che assegna il kernel
il demone udevd riceve gli eventi-devices direttamente dal kernel, ed esegue delle azioni in base a delle regole, locate in
/etc/udev/rules.d , oppure in /lib/udev/rules.d . In caso di conflitto le regole locare sotto /etc/udev/rules.d hanno la
priorita’.
CONFIGURAZIONE
i files di configurazione di udev son locati in /etc/udev ed in /lib/udev . Le linee vuote e le linee che iniziano con ” # “
vengono ignorate
Files di configurazione:
udev si aspetta di trovare la configurazione principale in /etc/udev/udev.conf. Essa consiste in un gruppo di regole e di
variabili che consentono di sovrascrivere i nomi predefiniti dei dispositivi. Le seguenti variabili possono assumere i
seguenti valori:
udev_root
Indica dove inserire i nodi nel filesystem. Il valore predefinito e’ /dev .
udev_log
The logging priority. Valid values are the numerical syslog priorities or their textual representations: err, info and debug.
Rules files
Le regole sono lette dai files posizionati della directory di default delle regole /lib/udev/rules.d, le regole personalizzate
son lette da /etc/udev/rules.d e le regole temporanee son lette da /run/udev/rules.d . Tutti i files son processati in ordine
alfabetico, indipendentemente da quale directory siano contenute. Le regole presenti in /etc/udev/rules.d han la preceedenza in
caso di conflitto. Cio’ puo’ essere utile per ignorare le regole predefinite (per esempio). I files delle regole devono
obbligatoriamente avere l’estensione .rules . Altre estensioni sono ignorate.
All’interno dei files delle regole possiamo trovare due tipi di direttive: confronti ed assegnazioni. Se tutti i confronti presenti
nella linea sono soddisfatti ecco che la direttiva assegnazione viene eseguita. Tramite le regole e’ possibile rinominare le schede
di rete, creare link ai dispositivi, oppure lanciare specifici comandi. Gli operatori validi all’interno del file delle regole
sono:
==
compara un’uguaglianza.
!=
compara una differenza .
=
assegna un valore .
+=
Aggiungere il valore di una chiave che contiene un elenco di voci. (traduzione letterale di google)
:=
Assign a value to a key finally; disallow any later changes, which may be used to prevent changes by any later rules.
Le seguenti direttive servono per effettuare una comparazione sulla periferica, controllandone le caratteristiche al
fine di ottenere l’identificazione della periferica e di applicare la regola.
ACTION
confronta il nome dell’azione-evento . puo’ essere “add” o “remove”
DEVPATH
confronta il path del device cui l’evento si riferisce
KERNEL
confronta il nome che il kernel assegna al device cui l’evento si riferisce
NAME
assegna il nome all’interfaccia di rete (e solo a lei, se ho capito bene)
SYMLINK
crea un link ad un determinato device. In pratica /dev/sdb1 puo’ essere (anche) chiamata ” DISCO_2 ” , O con
altro nome.
SUBSYSTEM
confronta il subsystem in riferimento ad un evento/device
DRIVER
confronta il nome del driver, e l’evento del device. Utilizzabile solo per i dispositivi che obbligatoriamente utilizzano
un determinato ed unico driver.
ATTR{filename}
confronta i valori degli attributi sys riferiti all’evento/device. Gli spazi bianchi vengono ignorati.
KERNELS
cerca il path del device e controlla un’eventuale corrispondenza
SUBSYSTEMS
cerca il path del device e controlla un’eventuale corrispondenza del subsystem
DRIVERS
cerca il path del device e controlla un’eventuale corrispondenza del driver utilizzato.
ATTRS{filename}
confronta il devpath di un determinato device riferito ai valori del sysfs . Qualora vengano specificati diversi ATTRS
tutti devono corrispondere a quanto specificato. Non deve contenere spazi bianchi.
ENV{key}
confronta il valore della proprieta’ del device
TAG
Match against a device tag.
TEST{octal mode mask}
controlla l’esistenza di un file, la notazione ottale puo’ essere specificata se occorre.
PROGRAM
esegue un programma. Il valore di ritorno e’ ” vero ” se il programma viene eseguito con successo.
RESULT
Trova (individua) la stringa restituita dall’esecuzione di un programma precedente. La stessa (sringa) puo’ essere
utilizzata nella medesima regole oppure in regole successive.
La maggior parte dei campi e’ in stile bash, sono supportate le seguenti caratteristiche:
*
corrisponde a nessuna oppure ad un numero imprecisato (qualunque) di caratteri.
?
Corrisponde ad un solo carattere (qualunque)
[]
corrisponde ad una qualsiasi occorrenza, i caratteri contenuti all’interno delle parentesi quadre indicano un inervallo.
Per esempio la sequenza ” tty[SR] puo’ indicare ttyS oppure ttyR , mentre sd[c-e] puo’ indicare sdc , sdd , sde .
il punto esclamativo ” ! ” , inverte il significato, esattamente come nella bash.
I seguenti nomi possono assumere i seguenti significati:
NAME
Il nome col quale un’interfaccia di rete viene rinominata. Il kernel assegna un nome al dispositivo di rete prima dell’intervento
di udev, tramite la direttiva NAME (all’interno di una regola) ecco che possiamo cambiare tale nome.
SYMLINK
Crean un link ad un determinato dispositivo (identificato dalla regola opportuna), senza modificare il nome primario
del dispositivo stesso. E’ possibile specificare piu’ di un SYMLINK ed assegnare quindi piu’ di un link al medesimo
dispositivo.
OWNER, GROUP, MODE
Specifica le “permission” (i permessi di accesso/utilizzo) di un determinato device.
ATTR{key}
The value that should be written to a sysfs attribute of the event device.
ENV{key}
Set a device property value. Property names with a leading ´.´ are not stored in the database or exported to external tool or
events.
TAG
Attach a tag to a device. This is used to filter events for users of libudev´s monitor functionality, or to enumerate a group
of tagged devices. The implementation can only work efficiently if only a few tags are attached to a device. It is only meant
to be used in contexts with specific device filter requirements, and not as a general-purpose flag. Excessive use might result
in inefficient event handling.
RUN
Esegue un determinato programma (script, eseguibile) nel momento in cui una determinata regola viene soddisfatta.
Qualora l’esecuzione di tale programma (script, eseguibile) risulti onerosa, ecco che le altre regole udev potrebbero
subire dei ritardi nella loro esecuzione. Occorre specificare il path assoluto del programma (script, eseguibile) , in assenza
di questo ecco che viene ritenuto valido il path /lib/udev/
LABEL
Identifica una zona di codice ove e’ possibile “saltare” ( = dirigere il corse della regola in esecuzione )
GOTO
Salta ( = si dirige) nella zona di codice identificata con LABEL
IMPORT{type}
Import a set of variables as device properties, depending on type:
program
Execute an external program specified as the assigned value and import its output, which must be in environment key format.
Path specification, command/argument separation, and quoting work like in RUN.
file
Import a text file specified as the assigned value, which must be in environment key format.
db
Import a single property specified as the assigned value from the current device database. This works only if the database
is already populated by an earlier event.
cmdline
Import a single property from the kernel commandline. For simple flags the value of the property will be set to ´1´.
parent
Import the stored keys from the parent device by reading the database entry of the parent device. The value assigned to
IMPORT{parent} is used as a filter of key names to import (with the same shell-style pattern matching used for
comparisons).
If no option is given, udev will choose between program and file based on the executable bit of the file permissions.
WAIT_FOR
Wait for a file to become available or until a 10 seconds timeout expires. The path is relative to the sysfs device, i. e. if
no path is specified this waits for an attribute to appear.
OPTIONS
Rule and device options:
link_priority=value
Specify the priority of the created symlinks. Devices with higher priorities overwrite existing symlinks of other devices.
The default is 0.
event_timeout=
Number of seconds an event will wait for operations to finish, before it will terminate itself.
string_escape=none|replace
Usually control and other possibly unsafe characters are replaced in strings used for device naming. The mode of
replacement can be specified with this option.
static_node=
Apply the permissions specified in this rule to a static device node with the specified name. Static device nodes might be
provided by kernel modules, or copied from /lib/udev/devices. These nodes might not have a corresponding kernel device at
the time udevd is started, and allow to trigger automatic kernel module on-demand loading.
watch
Watch the device node with inotify, when closed after being opened for writing, a change uevent will be synthesised.
nowatch
Disable the watching of a device node with inotify.
The NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE and RUN fields support simple printf-like string substitutions. The RUN format chars
gets applied after all rules have been processed, right before the program is executed. It allows the use of device properties set
by earlier matching rules. For all other fields, substitutions are applied while the individual rule is being processed. The
available substitutions are:
$kernel, %k
il nome che il kernel assegna al device
$number, %n
il numero che il kernel assegna al devie. “dev/sda3″ ha come numero del kernel ” 3 ”
$devpath, %p
Il devpath del device
$id, %b
The name of the device matched while searching the devpath upwards for SUBSYSTEMS, KERNELS, DRIVERS and ATTRS.
$driver
The driver name of the device matched while searching the devpath upwards for SUBSYSTEMS, KERNELS, DRIVERS and ATTRS.
$attr{file}, %s{file}
The value of a sysfs attribute found at the device, where all keys of the rule have matched. If the matching device does not
have such an attribute, and a previous KERNELS, SUBSYSTEMS, DRIVERS, or ATTRS test selected a parent device, use the attribute
from that parent device. If the attribute is a symlink, the last element of the symlink target is returned as the value.
$env{key}, %E{key}
A device property value.
$major, %M
The kernel major number for the device.
$minor, %m
The kernel minor number for the device.
$result, %c
The string returned by the external program requested with PROGRAM. A single part of the string, separated by a space character
may be selected by specifying the part number as an attribute: %c{N}. If the number is followed by the ´+´ char this part plus
all remaining parts of the result string are substituted: %c{N+}
$parent, %P
The node name of the parent device.
$name
The current name of the device node. If not changed by a rule, it is the name of the kernel device.
$links
The current list of symlinks, separated by a space character. The value is only set if an earlier rule assigned a value, or
during a remove events.
$root, %r
The udev_root value.
$sys, %S
The sysfs mount point.
$tempnode, %N
The name of a created temporary device node to provide access to the device from a external program before the real node is
created.
%%
The ´%´ character itself.
$$
The ´$´ character itself.
AUTHOR
Written by Greg Kroah-Hartman greg@kroah.com and Kay Sievers kay.sievers@vrfy.org. With much help from Dan Stekloff and many
others.
SEE ALSO
udevd(8), udevadm(8)
UDEVADM(8) udevadm UDEVADM(8)
NAME
udevadm – strumento di gestione di udev
SYNOPSIS
udevadm [–debug] [–version] [–help]
udevadm info options
udevadm trigger [options]
udevadm settle [options]
udevadm control command
udevadm monitor [options]
udevadm test [options] devpath
DESCRIPTION
udevadm si aspetta un comando e le opzioni di tale comando. Esso controlla
il comportamento di runtime di udev, eventi/richieste del kernel, gestisce
l’evento e fornisce un debug semplice.
OPTIONS
–debug
stampa l’output del debug sullo standard error.
–version
mostra il numero di versione
–help
mostra un messaggio di aiuto
udevadm info options
interroga il database udev in riferimento al dispositivo indicato,
allo scopo di ottenere informazioni utili alla scrittura delle
regole [1]
–query=type
Query the database for specified type of device data. It needs the
–path or –name to identify the specified device. Valid queries
are: name, symlink, path, property, all.
–path=devpath
The devpath of the device to query.
–name=file
The name of the device node or a symlink to query
–root
The udev root directory: /dev. If used in conjunction with a name
or symlink query, the query returns the absolute path including the
root directory.
–run
The udev runtime directory: /run/udev.
–attribute-walk
Print all sysfs properties of the specified device that can be used
in udev rules to match the specified device. It prints all devices
along the chain, up to the root of sysfs that can be used in udev
rules.
–export
Print output as key/value pairs. Values are enclosed in single
quotes.
–export-prefix=name
Add a prefix to the key name of exported values.
–device-id-of-file=file
Print major/minor numbers of the underlying device, where the file
lives on.
–export-db
Export the content of the udev database.
–version
Print version.
–help
Print help text.
udevadm trigger [options]
chiede al kernel gli eventi (le risposte?) dei dispositivi,
lo scopo e’ di raccogliere informazioni per usi successivi.
–verbose
Print the list of devices which will be triggered.
–dry-run
Do not actually trigger the event.
–type=type
Trigger a specific type of devices. Valid types are: devices,
subsystems. The default value is devices.
–action=action
Type of event to be triggered. The default value is change.
–subsystem-match=subsystem
Trigger events for devices which belong to a matching subsystem.
This option can be specified multiple times and supports shell
style pattern matching.
–subsystem-nomatch=subsystem
Do not trigger events for devices which belong to a matching
subsystem. This option can be specified multiple times and supports
shell style pattern matching.
–attr-match=attribute=value
Trigger events for devices with a matching sysfs attribute. If a
value is specified along with the attribute name, the content of
the attribute is matched against the given value using shell style
pattern matching. If no value is specified, the existence of the
sysfs attribute is checked. This option can be specified multiple
times.
–attr-nomatch=attribute=value
Do not trigger events for devices with a matching sysfs attribute.
If a value is specified along with the attribute name, the content
of the attribute is matched against the given value using shell
style pattern matching. If no value is specified, the existence of
the sysfs attribute is checked. This option can be specified
multiple times.
–property-match=property=value
Trigger events for devices with a matching property value. This
option can be specified multiple times and supports shell style
pattern matching.
–tag-match=property
Trigger events for devices with a matching tag. This option can be
specified multiple times.
–sysname-match=name
Trigger events for devices with a matching sys device name. This
option can be specified multiple times and supports shell style
pattern matching.
udevadm settle [options]
osserva (controlla) la coda degli eventi di udev, e termina (esce) se
tutti gli eventi son terminati
–timeout=seconds
Maximum number of seconds to wait for the event queue to become
empty. The default value is 180 seconds. A value of 0 will check if
the queue is empty and always return immediately.
–seq-start=seqnum
Wait only for events after the given sequence number.
–seq-end=seqnum
Wait only for events before the given sequence number.
–exit-if-exists=file
Stop waiting if file exists.
–quiet
Do not print any output, like the remaining queue entries when
reaching the timeout.
–help
Print help text.
udevadm control command
Modify the internal state of the running udev daemon.
–log-priority=value
Set the internal log level of udevd. Valid values are the numerical
syslog priorities or their textual representations: err, info and
debug.
–stop-exec-queue
Signal udevd to stop executing new events. Incoming events will be
queued.
–start-exec-queue
Signal udevd to enable the execution of events.
–reload-rules
Signal udevd to reload the rules files. The udev daemon detects
changes automatically, this option is usually not needed. Reloading
rules does not apply any changes to already existing devices.
–property=KEY=value
Set a global property for all events.
–children-max=value
Set the maximum number of events, udevd will handle at the same
time.
–help
Print help text.
udevadm monitor [options]
Listens to the kernel uevents and events sent out by a udev rule and
prints the devpath of the event to the console. It can be used to
analyze the event timing, by comparing the timestamps of the kernel
uevent and the udev event.
–kernel
Print the kernel uevents.
–udev
Print the udev event after the rule processing.
–property
Also print the properties of the event.
–subsystem-match=string[/string]
Filter events by subsystem[/devtype]. Only udev events with a
matching subsystem value will pass.
–tag-match=string
Filter events by property. Only udev events with a given tag
attached will pass.
–help
Print help text.
udevadm test [options] devpath
Simulate a udev event run for the given device, and print debug output.
–action=string
The action string.
–subsystem=string
The subsystem string.
–help
Print help text.
AUTHOR
Written by Kay Sievers kay.sievers@vrfy.org.
SEE ALSO
udev(7) udevd(8)
udev 03/30/2011 UDEVADM(8)
[1]
ipotizziamo di consultare le caratteristiche di /dev/sda , ecco alcune sintassi possibili:
[operiamo su una distribuzione fedora core 15 virtuale]
udevadm info –query=all –name=sda
udevadm info –query=all –attribute-walk –name=sda
udevadm info -a -n /dev/sda
Ecco il file /etc/udev/udev.con originale della distribuzione slackware 14
# udev.conf
# The main config file for udev
#
# This file can be used to override some of udev’s default values for where it
# looks for files, and where it places device nodes.
# udev_root – where in the filesystem to place the device nodes
udev_root=”/dev/”
# udev_log – The initial syslog(3) priority: “err”, “info”, “debug” or
# its numerical equivalent. For runtime debugging, the daemons
# internal state can be changed with: udevadm control log_priority=<value>
udev_log=”err”
Come notiamo c’e’ la diretiva udev_root=”/dev/” la quale indica la posizione ove verranno posizionati i files-dispositivo.
NOTA BENE !! nella distribuzione slackware 14 ad ogni inserimento di regole nuove (o modifica di regole esistenti) occorre
riavviare il servizio tramite la sintassi
/etc/rc.d/rc.udev force-restart
Senza questa precauzione le modifiche non vengono considerate. Pare che il riavvio del servizio non sia necessario
su fedora core 15. Perlomeno, dalle mie prove e’ apparso cosi’.
Ora arriva la parte “pratica”, la molla che mi ha portato a scrivere queste righe. La necessita’ era di riconoscere
al volo una chiavetta usb da 2 gb di marca kingston , montarla correttamente in /mnt/2gb ed avviare uno script di rsync.
Mi limito a riportare le regole udev che si incaricano del riconoscimento della chiavetta. Operiamo su una fedora core 15
virtuale e su una slackware 14 virtuale. La chiavetta viene riconosciuta come /dev/sdb . Lo capiamo osservando il file
/var/log/messages . Inoltre in /dev/ vengono aggiunti due devices: /dev/sdb e /dev/sdb1 . Ora analizziamo la chiavetta
e cerchiamo di scrivere la regola. Primo passo e’ ottenere le informazioni specifiche della chiavetta:
udevadm info -a -n /dev/sdb
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device ‘/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb’:
KERNEL==”sdb”
SUBSYSTEM==”block”
DRIVER==””
ATTR{range}==”16″
ATTR{ext_range}==”256″
ATTR{removable}==”1″
ATTR{ro}==”0″
ATTR{size}==”3966976″
ATTR{alignment_offset}==”0″
ATTR{discard_alignment}==”0″
ATTR{capability}==”51″
ATTR{stat}==” 341 6 2776 3408 0 0 0 0 0 3405 3405″
ATTR{inflight}==” 0 0″
ATTR{events}==”media_change”
ATTR{events_async}==””
ATTR{events_poll_msecs}==”-1″
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0’:
KERNELS==”3:0:0:0″
SUBSYSTEMS==”scsi”
DRIVERS==”sd”
ATTRS{device_blocked}==”0″
ATTRS{type}==”0″
ATTRS{scsi_level}==”0″
ATTRS{vendor}==”Kingston”
ATTRS{model}==”DataTraveler 2.0″
ATTRS{rev}==”PMAP”
ATTRS{state}==”running”
ATTRS{timeout}==”30″
ATTRS{iocounterbits}==”32″
ATTRS{iorequest_cnt}==”0x19a”
ATTRS{iodone_cnt}==”0x19a”
ATTRS{ioerr_cnt}==”0x1″
ATTRS{evt_media_change}==”0″
ATTRS{dh_state}==”detached”
ATTRS{queue_depth}==”1″
ATTRS{queue_type}==”none”
ATTRS{max_sectors}==”240″
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host3/target3:0:0’:
KERNELS==”target3:0:0″
SUBSYSTEMS==”scsi”
DRIVERS==””
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host3’:
KERNELS==”host3″
SUBSYSTEMS==”scsi”
DRIVERS==””
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0’:
KERNELS==”1-1:1.0″
SUBSYSTEMS==”usb”
DRIVERS==”usb-storage”
ATTRS{bInterfaceNumber}==”00″
ATTRS{bAlternateSetting}==” 0″
ATTRS{bNumEndpoints}==”02″
ATTRS{bInterfaceClass}==”08″
ATTRS{bInterfaceSubClass}==”06″
ATTRS{bInterfaceProtocol}==”50″
ATTRS{supports_autosuspend}==”1″
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0/usb1/1-1’:
KERNELS==”1-1″
SUBSYSTEMS==”usb”
DRIVERS==”usb”
ATTRS{configuration}==””
ATTRS{bNumInterfaces}==” 1″
ATTRS{bConfigurationValue}==”1″
ATTRS{bmAttributes}==”80″
ATTRS{bMaxPower}==”200mA”
ATTRS{urbnum}==”1223″
ATTRS{idVendor}==”0930″
ATTRS{idProduct}==”6545″
ATTRS{bcdDevice}==”0100″
ATTRS{bDeviceClass}==”00″
ATTRS{bDeviceSubClass}==”00″
ATTRS{bDeviceProtocol}==”00″
ATTRS{bNumConfigurations}==”1″
ATTRS{bMaxPacketSize0}==”64″
ATTRS{speed}==”480″
ATTRS{busnum}==”1″
ATTRS{devnum}==”2″
ATTRS{devpath}==”1″
ATTRS{version}==” 2.00″
ATTRS{maxchild}==”0″
ATTRS{quirks}==”0x0″
ATTRS{avoid_reset_quirk}==”0″
ATTRS{authorized}==”1″
ATTRS{manufacturer}==”Kingston”
ATTRS{product}==”DataTraveler 2.0″
ATTRS{serial}==”001D0F0CAAB55B8909141484″
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0/usb1’:
KERNELS==”usb1″
SUBSYSTEMS==”usb”
DRIVERS==”usb”
ATTRS{configuration}==””
ATTRS{bNumInterfaces}==” 1″
ATTRS{bConfigurationValue}==”1″
ATTRS{bmAttributes}==”e0″
ATTRS{bMaxPower}==” 0mA”
ATTRS{urbnum}==”44″
ATTRS{idVendor}==”1d6b”
ATTRS{idProduct}==”0002″
ATTRS{bcdDevice}==”0206″
ATTRS{bDeviceClass}==”09″
ATTRS{bDeviceSubClass}==”00″
ATTRS{bDeviceProtocol}==”00″
ATTRS{bNumConfigurations}==”1″
ATTRS{bMaxPacketSize0}==”64″
ATTRS{speed}==”480″
ATTRS{busnum}==”1″
ATTRS{devnum}==”1″
ATTRS{devpath}==”0″
ATTRS{version}==” 2.00″
ATTRS{maxchild}==”8″
ATTRS{quirks}==”0x0″
ATTRS{avoid_reset_quirk}==”0″
ATTRS{authorized}==”1″
ATTRS{manufacturer}==”Linux 2.6.38.6-26.rc1.fc15.i686.PAE ehci_hcd”
ATTRS{product}==”EHCI Host Controller”
ATTRS{serial}==”0000:00:0b.0″
ATTRS{authorized_default}==”1″
looking at parent device ‘/devices/pci0000:00/0000:00:0b.0’:
KERNELS==”0000:00:0b.0″
SUBSYSTEMS==”pci”
DRIVERS==”ehci_hcd”
ATTRS{vendor}==”0x8086″
ATTRS{device}==”0x265c”
ATTRS{subsystem_vendor}==”0x0000″
ATTRS{subsystem_device}==”0x0000″
ATTRS{class}==”0x0c0320″
ATTRS{irq}==”10″
ATTRS{local_cpus}==”ffffffff,ffffffff”
ATTRS{local_cpulist}==”0-63″
ATTRS{dma_mask_bits}==”32″
ATTRS{consistent_dma_mask_bits}==”32″
ATTRS{enable}==”1″
ATTRS{broken_parity_status}==”0″
ATTRS{msi_bus}==””
ATTRS{companion}==””
looking at parent device ‘/devices/pci0000:00’:
KERNELS==”pci0000:00″
SUBSYSTEMS==””
DRIVERS==””
Ora abbiamo gli elementi sufficienti per scrivere la nostra regola:
ACTION==”add”, KERNEL==”sd[b-z][0-9]”, ATTRS{vendor}==”Kingston”, ATTRS{model}==”DataTraveler 2.0″, SYMLINK+=”kingston”
Tramite questa regola la chiavetta “kingston” modello DataTravel 2.0 viene riconosciuta in modo univoco , e viene generato
il link /dev/kingston che si riferisce a /dev/sdb1 , in questo caso la chiavetta. La regola si applica SOLO ED UNIVOCAMENTE
alla chiavetta in oggetto, oppure ad una chiavetta uguale identica, medesimo modello e medesima marca. Potremmo ottenere
un risultato simile con la regola seguente:
ACTION==”add”, KERNEL==”sdb1″, SYMLINK+=”chiavetta”
con questa regola il sistema udev crea il link /dev/chiavetta all’atto del riconoscimento DI UN QUALUNQUE DISPOSITIVO
riconosciuto come /dev/sdb1 . Quindi un hard disk esterno, una chiavetta o simili. Attenzione, la regola si applica
solo a /dev/sdb1 . Se in seguito utilizziamo un ulteriore hard disk esterno che prende come device /dev/sdc1 , ecco che
nessuna regola viene applicata.
Ora vogliamo che allinserimento della chiavetta “kingston” si generi il link /dev/kingston e che venga eseguito uno script
locato in /bin/script . Ecco la regola
ACTION==”add”, KERNEL==”sd[b-z][0-9]”, ATTRS{vendor}==”Kingston”, ATTRS{model}==”DataTraveler 2.0″, SYMLINK+=”kingston”, RUN+=”/bin/script”
Il funzionamento della regola e’ stato verificato su slackware 14 e fedora core 15. Ovviamente lo script /bin/script eseguira’
tutto quello che ci interessa.
E’ possibile personalizzare la regola e renderla migliore in molte maniere, soprattutto leggendo la parte (del presente documento)
riguardante le varibili cui udev fa riferimento alla periferica. Es , %p , %n , %k .
Inoltre ricordate che su slackware (la prima, l’unica e la migliore), ad ogni modifica delle regole occorre informare il servizio oppure
riavviarlo. /etc/rc.d/rc.udev reload , oppure /etc/rc.d/rc.udev force-restart .
Io ho ottenuto quanto mi prefiggevo, quindi la guida termina qui. Chi vuole aggiungere del suo e’ il benvenuto.