Home > Linux > Linux: primi passi con UDEV

Linux: primi passi con UDEV

15 Luglio 2009

Ho cominciato ad addentrarmi nei meandri di udev.
Questo il mio primo esercizio:
Dare un nome personalizzato ad un dispositivo usb, quando questo viene connesso.
Nel mio caso si tratta di una “chiavetta” da 2GB.

Il primo passo, dopo aver collegato il dispositivo USB, è consultare il log
degli eventi, per reperirne il “nome” assegnato da udev:

dmesg | tail

banco@banco-desktop:~$ dmesg | tail
[21250.708573] sd 3:0:0:0: [sdb] Write Protect is off
[21250.708609] sd 3:0:0:0: [sdb] Mode Sense: 00 00 00 00
[21250.708649] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[21250.880267] sd 3:0:0:0: [sdb] 3948543 512-byte hardware sectors: (2.02 GB/1.88 GiB)
[21250.927174] sd 3:0:0:0: [sdb] Write Protect is off
[21250.927179] sd 3:0:0:0: [sdb] Mode Sense: 00 00 00 00
[21250.927182] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[21250.927317] sdb: sdb1
[21251.070137] sd 3:0:0:0: [sdb] Attached SCSI removable disk
[21251.070746] sd 3:0:0:0: Attached scsi generic sg2 type 0

sdb è la nostra chiavetta, che, come si noterà, verrà montata molto genericamente così:

/dev/sdb1 on /media/disk type vfat (rw,nosuid,nodev,uhelper=hal,shortname=mixed,uid=1000,utf8,umask=077,flush)

sdb1 è il nome che assume qualsiasi dispositivo di archiviazione di massa usb, quando viene inserito per primo e
media/disk è il punto di mount generico assegnatogli.
Questo è scomodo per chi ha più dispositivi usb e deve accedere ai dati contenuti in essi,
tramite software e link vari, sopratutto se l’ordine di inserimento (e di riconoscimento) dei dispositivi
viene modificato.

Ecco perchè come esercizio, ho deciso di “fissare” nome (/dev/xxxx) e mount-point

Ora si può utilizzare udevadm per aver maggiori dati sul dispositivo in questione.
(per maggiori informazioni sul comando, consultare la man-page: man udevadm)

udevadm info --query=env --name=sdb1

banco@banco-desktop:~$ udevadm info –query=env –name=sdb1
UDEV_LOG=3
DEVPATH=/devices/pci0000:00/0000:00:07.2/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb/sdb1
MAJOR=8
MINOR=17
DEVTYPE=partition
DEVNAME=/dev/sdb1
ID_VENDOR=PEAK_III
ID_VENDOR_ENC=PEAK\x20III
ID_VENDOR_ID=1307
ID_MODEL=Flash_Drive
ID_MODEL_ENC=Flash\x20Drive\x20\x20\x20\x20\x20
ID_MODEL_ID=0163
ID_REVISION=0.00
ID_SERIAL=PEAK_III_Flash_Drive_182212a6a5358c-0:0
ID_SERIAL_SHORT=182212a6a5358c
ID_TYPE=disk
ID_INSTANCE=0:0
ID_BUS=usb
ID_USB_INTERFACES=:080650:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=usb-storage
ID_PATH=pci-0000:00:07.2-usb-0:1:1.0-scsi-0:0:0:0
ID_FS_USAGE=filesystem
ID_FS_TYPE=vfat
ID_FS_VERSION=FAT16
ID_FS_UUID=0000-00CB
ID_FS_UUID_ENC=0000-00CB
DEVLINKS=/dev/block/8:17 /dev/disk/by-id/usb-PEAK_III_Flash_Drive_182212a6a5358c-0:0-part1 /dev/disk/by-path/pci-0000:00:07.2-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/0000-00CB

Altrimenti, per una ricerca ancor più dettagliata:

udevadm info -a -n /dev/sdb1

banco@banco-desktop:~$ udevadm info -a -n /dev/sdb1

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:07.2/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb/sdb1’:
KERNEL==”sdb1″
SUBSYSTEM==”block”
DRIVER==””
ATTR{partition}==”1″
ATTR{start}==”63″
ATTR{size}==”3948480″
ATTR{stat}==” 140 2826 4022 4596 1 1 2 12 0 3676 4608″

looking at parent device ‘/devices/pci0000:00/0000:00:07.2/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb’:
KERNELS==”sdb”
SUBSYSTEMS==”block”
DRIVERS==””
ATTRS{range}==”16″
ATTRS{ext_range}==”256″
ATTRS{removable}==”1″
ATTRS{ro}==”0″
ATTRS{size}==”3948543″
ATTRS{capability}==”53″
ATTRS{stat}==” 146 3036 4238 5340 1 1 2 12 0 4000 5352″

looking at parent device ‘/devices/pci0000:00/0000:00:07.2/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}==”3″
ATTRS{vendor}==”PEAK III”
ATTRS{model}==”Flash Drive “

……

Soffermiamoci sulla sezione contenente SUBSYSTEMS==”scsi”

adesso creo il file con le mie regole personalizzate.
Ricordo che udev legge le regole in ordine alfabetico e che le regole devono avere una combinazione di MATCH e di ASSIGNMENTS
E’ di uso comune creare nella cartella /etc/udev/rules.d
il file 10-local.rules (che avrà priorità sulel altre regole con quella numerazione),

(per maggiori info su questi ultimi, consultare la man-page di udev)

sudo gedit /etc/udev/rules.d/10-local.rules

all’interno del quale inseriremo i match e gli assignments prima citati.

KERNEL=="sd?1", SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{vendor}=="PEAK III", NAME="hd_Peak3", SYMKINK+="usbHD%1"

dove

KERNEL, SUBSYSTEM, DRVERS, ATTRS{vendor}

sono i match riconoscibili da ==, ovvero udev cerca la corrispondenza di tali valori e solo se verificati tutti, darà i nostri assegnamenti, nel nostro caso, il nome al /dev

NAME="hd_Peak3"

e creerà un link a tale dispositivo

SYMKINK+="usbHD%1"

(ricordo di consultare la man-page)

una volta salvato il file-regola e riavviato udev con il comando

sudo /etc/init.d/udev restart

smontiamo e riconnettiamo il dispositivo usb e verifichiamo con mount:

/dev/hd_Peak3 on /media/disk type vfat (rw,nosuid,nodev,uhelper=hal,shortname=mixed,uid=1000,utf8,umask=077,flush)

il dispositivo viene correttamente rinominato a nostro piacimento.

Se vogliamo che anche il punto di mount sia come mi piace, lo creo

sudo mkdir /media/peak3

poi faccio in modo che si monti in automatico, aggiungendo la solita stringa in fstab

sudo gedit /etc/fstab

ed inseriamo la riga:

/dev/hd_Peak3 /media/peak3 vfat noauto,user,umask=000 0 0
sudo umount -a
sudo mount -a

alla prossima connessione avremo come output di mount:

/dev/hd_Peak3 on /media/peak3 type vfat (rw,noexec,nosuid,nodev,umask=000,user=banco)

Questo è molto comodo nel caso io connetta un altro dispositivo usb, prima di questo.
In tal caso, l’oggetto in questione, non diventerà sdb2 in quanto sdb1 occupato, ma verrà “indirizzato”
nel giusto mount-point e con il nome /dev imposto nella regola.
Questo processo è ripetibile per ogni dispositivo, aggiungendo una riga nel file
/etc/udev/rules.d/10-local.rules

Ovviamente questo è solo un assaggio.
Consultando le man-page ci si renderà conto delle potenzialità….

….continua……

Categorie:Linux Tag:
I commenti sono chiusi.