[Udev] Avoir un /dev/sdblabla fixe pour un périphérique

Reconnaissance et configuration du matériel / kernel linux
Elrohir
archer
Messages : 134
Inscription : sam. 16 sept. 2006, 19:46

[Udev] Avoir un /dev/sdblabla fixe pour un périphérique

Message par Elrohir »

Hello,

J'aurais une question, et les wikis/docs que j'ai lu sur Udev ne m'ont pas trop aidé... :-/

J'aimerais que, au démarrage de mon système, que le DD externe soit reconnu en tant que /dev/sdblabla de manière fixe. C'est à dire que l'emplacement /dev/sdblabla lui soit dédié.

Udev me permet-il de faire ça ? Avec une Rules je pense ? Si oui, comment procéder ? :)

Merci ;)

Nicolas
Avatar de l’utilisateur
warnaud
Maître du Kyudo
Messages : 1640
Inscription : ven. 11 août 2006, 17:05
Localisation : Rolle (CH)

Message par warnaud »

Salut, ouais c'est possible ! Mais les règles ne sont pas par défaut sous arch.
Sous Sourcemage :respect: j'ai ces 2 fichiers :
/etc/udev/rules.d/60-persistent-storage.rules

Code : Tout sélectionner

# persistent storage links: /dev/{disk,tape}/{by-id,by-uuid,by-label,by-path,by-name}
# scheme based on "Linux persistent device names", 2004, Hannes Reinecke <hare@suse.de>

ACTION!="add", GOTO="persistent_storage_end"
SUBSYSTEM!="block", GOTO="persistent_storage_end"

# skip rules for inappropriate block devices
KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-*", GOTO="persistent_storage_end"

# never access non-cdrom removable ide devices, the drivers are causing event loops on open()
KERNEL=="hd*[!0-9]", ATTRS{removable}=="1", DRIVERS=="ide-cs|ide-floppy", GOTO="persistent_storage_end"
KERNEL=="hd*[0-9]", ATTRS{removable}=="1", GOTO="persistent_storage_end"

# for partitions import parent information
KERNEL=="*[0-9]", IMPORT{parent}="ID_*"

# by-id (hardware serial number)
KERNEL=="hd*[!0-9]", IMPORT{program}="ata_id --export $tempnode"
KERNEL=="hd*[!0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/ata-$env{ID_MODEL}_$env{ID_SERIAL}"
KERNEL=="hd*[0-9]", SYMLINK+="disk/by-id/ata-$env{ID_MODEL}_$env{ID_SERIAL}-part%n"

KERNEL=="sd*[!0-9]|sr*|st*", ATTRS{ieee1394_id}=="?*", ENV{ID_SERIAL}="$attr{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="usb_id -x"
KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="scsi_id -g -x -s %p -d $tempnode"
KERNEL=="sd*[!0-9]|sr*|st*", ENV{ID_SERIAL}=="", IMPORT{program}="scsi_id -g -x -a -s %p -d $tempnode"
KERNEL=="dasd*[!0-9]", IMPORT{program}="dasd_id --export $tempnode"
KERNEL=="sd*[!0-9]|sr*|dasd*[!0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
KERNEL=="sd*[0-9]|dasd*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
KERNEL=="st*", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}"

# by-path (shortest physical path)
KERNEL=="*[!0-9]|sr*", IMPORT{program}="path_id %p", SYMLINK+="disk/by-path/$env{ID_PATH}"
KERNEL=="st*", IMPORT{program}="path_id %p", SYMLINK+="tape/by-path/$env{ID_PATH}"
KERNEL=="sr*|st*", GOTO="persistent_storage_end"
KERNEL=="*[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"

# by-label/by-uuid (filesystem properties)
KERNEL=="*[!0-9]", ATTR{removable}=="1", GOTO="persistent_storage_end"
IMPORT{program}="vol_id --export $tempnode"
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID}"
ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_SAFE}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_SAFE}"

# BIOS Enhanced Disk Device
KERNEL=="*[!0-9]", IMPORT{program}="edd_id --export $tempnode"
KERNEL=="*[!0-9]", ENV{ID_EDD}=="?*", SYMLINK+="disk/by-id/edd-$env{ID_EDD}"
KERNEL=="*[0-9]", ENV{ID_EDD}=="?*", SYMLINK+="disk/by-id/edd-$env{ID_EDD}-part%n"

LABEL="persistent_storage_end"
et /etc/udev/rules.d/60-persistent-input.rules

Code : Tout sélectionner

ACTION!="add", GOTO="persistent_input_end"
SUBSYSTEM!="input", GOTO="persistent_input_end"
KERNEL=="input[0-9]*", GOTO="persistent_input_end"

# usb devices
SUBSYSTEMS=="usb", IMPORT{program}="usb_id -x"
SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="01", ENV{ID_CLASS}="kbd"
SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="02", ENV{ID_CLASS}="mouse"

# other devices
DRIVERS=="pcspkr", ENV{ID_CLASS}="spkr"
DRIVERS=="atkbd", ENV{ID_CLASS}="kbd"
DRIVERS=="psmouse", ENV{ID_CLASS}="mouse"
ATTRS{name}=="*dvb*|*DVB*|* IR *", ENV{ID_CLASS}="ir"
ATTRS{modalias}=="input:*-*a[068],*|input:*-*a*,[68],*m*", ATTRS{modalias}!="input:*-*k*14A,*r*", ENV{ID_CLASS}="joystick"

ENV{ID_SERIAL}=="", ENV{ID_SERIAL}="noserial"

# by-id links
KERNEL=="mouse*", ENV{ID_BUS}=="?*", ENV{ID_CLASS}=="?*", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-$env{ID_CLASS}"
KERNEL=="event*", ENV{ID_BUS}=="?*", ENV{ID_CLASS}=="?*", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-event-$env{ID_CLASS}"

# by-path
IMPORT{program}="path_id %p"
ENV{ID_PATH}=="?*", KERNEL=="mouse*", SYMLINK+="input/by-path/$env{ID_PATH}-$env{ID_CLASS}"
ENV{ID_PATH}=="?*", KERNEL=="event*", SYMLINK+="input/by-path/$env{ID_PATH}-event-$env{ID_CLASS}"

LABEL="persistent_input_end"
A tester, mais ça devrait faire ce que tu veux :-)
Il est aussi à noter que pour éviter d'avoir des interfaces éthernet qui s'amusent à changer de numéro il y'a une règle toute faite :

Code : Tout sélectionner

mv /etc/udev/rules.d/75-persistent-net-generator.rules.optional /etc/udev/rules.d/75-persistent-net-generator.rules
Bon, c'est quand même clair et simple, je pense qu'à l'avenir on fera nos règles udev seuls tellement la syntaxe est limpide :brice: :fou: :faittourner:
Plus ça rate, plus ça a de chance de réussir. En somme, un succès n'est qu'une erreur qui a finit par réussir (même par erreur). Ne déséspérez donc pas et perseverez. Utilisez La Rache™
Patientia quod lard quod barrus planto diligo ut licentia
—¤÷(`[¤*Powered By *¤]´)÷¤—
Archlinux ~ Fvwm ~ Irssi ~ URxvt
Elrohir
archer
Messages : 134
Inscription : sam. 16 sept. 2006, 19:46

Message par Elrohir »

Oulà, j'ai pas compris grand chose ! Ca a l'air compliqué !
Je m'y plongerai plus tard ;)

Merci :)
Avatar de l’utilisateur
kozaki
Chu Ko Nu
Messages : 422
Inscription : mer. 13 sept. 2006, 22:49
Localisation : London > . < Paris
Contact :

Message par kozaki »

Heu j'ai jamais réussi à configurer udev pour qu'il réponde 100 à mes attentes.
Par contre, je monte tous les périphériques amovibles (clés, cartes mémoire & partitions de disques externes) toujours au même endroit grâce aux labels de disques :
$ ls -l /dev/disk/by-label/
total 0
lrwxrwxrwx 1 root root 10 jan 26 02:19 boot -> ../../sdb2
lrwxrwxrwx 1 root root 10 jan 26 01:19 MAXTOR1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 jan 26 01:19 maxtor5 -> ../../sdc5
lrwxrwxrwx 1 root root 10 jan 26 01:19 maxtor6 -> ../../sdc6
lrwxrwxrwx 1 root root 10 jan 26 01:19 maxtor7 -> ../../sdc7
lrwxrwxrwx 1 root root 10 jan 28 20:42 skymedi -> ../../sde1
Et les indique dans /etc/fstab :

Code : Tout sélectionner

/dev/data/1                     /home           ext3 defaults           1 2
/dev/disk/by-label/MAXTOR1      /media/maxtor1  vfat users,noauto,exec  0 0
/dev/disk/by-label/maxtor5      /media/maxtor5  ext2 users,noauto       0 0
/dev/disk/by-label/maxtor6      /media/maxtor6  ext3 users,noauto       0 0
/dev/disk/by-label/maxtor7      /media/maxtor7  ext2 users,noauto       0 0
/dev/disk/by-label/samsung1     /media/samsung1 vfat users,noauto       0 0
/dev/disk/by-label/samsung2     /media/samsung2 ext2 users,noauto       0 0
/dev/disk/by-label/MMC512       /media/MMC512   vfat umask=0,user       0 0
/dev/disk/by-label/skymedi      /media/skymedi  vfat users,noauto,exec  0 0
/dev/disk/by-label/MSduo64      /media/MSduo64  vfat users,noauto,noexec 0 0
/dev/disk/by-label/MSduo128     /media/MSduo128 vfat users,noauto,noexec 0 0
Ainsi mes périphériques amovibles sont *toujours* montés au même endroit :)
Cactus
Maître du Kyudo
Messages : 2073
Inscription : sam. 16 sept. 2006, 10:39
Localisation : 31 - Toulouse Nord

Message par Cactus »

J'y étais arrivé en utilisant un programme en python, qui donnait la syntaxe à insérer (et qui le faisait seul aussi !).
Je ne me souviens du nom... kudev peut-être ?

Sinon, il existe une méthode, un peu compliquée, mais qui marche.
Déjà, le ficher de règle :

Code : Tout sélectionner

SUBSYSTEMS=="usb", ATTRS{serial}=="00000000000116", NAME="cle_1Go", Mode=="0777"


SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Sony", ATTRS{product}=="Sony Handycam", NAME="camescope", Mode=="0777"

SUBSYSTEMS=="usb", ATTRS{product}=="USB TO IDE", NAME="hd-externe", Mode=="0777"
Comme tu le vois, on peut renseigner le n° de série, ou le nom du matériel... et c'est là que j'ai oublié comment faire (à part kudev), je reposte dès que je retrouve la solution. :wink:

Tu remarques aussi que ma clé usb est montée sur /dev/cle_1Go, mon camescope sur /dev/camescope, mon disque dur externe sur /dev/hd-externe... très pratique pour les scripts ensuite... :wink:

EDIT : On obtient les infos via la commande udevinfo, mais c'est compliqué, je sais qu'il faut le lancer en 2 fois... je cherche...

EDIT 2 : voici comment avoir les infos :

Code : Tout sélectionner

$ udevinfo --query=all --name=/dev/cle_1Go
P: /block/sda/sda1
N: cle_1Go
S: disk/by-id/-USB2.0_USB_Flash_Disk_00000000000116-part1
S: disk/by-path/pci-0000:00:1d.7-usb-0:3.3:1.0-scsi-0:0:0:0-part1
S: disk/by-uuid/6CFF-7B84
S: disk/by-label/USB_DISK
E: ID_VENDOR=USB2.0
E: ID_MODEL=USB_Flash_Disk
E: ID_REVISION=0.00
E: ID_SERIAL=USB2.0_USB_Flash_Disk_00000000000116
E: ID_TYPE=disk
E: ID_BUS=usb
E: ID_PATH=pci-0000:00:1d.7-usb-0:3.3:1.0-scsi-0:0:0:0
E: ID_FS_USAGE=filesystem
E: ID_FS_TYPE=vfat
E: ID_FS_VERSION=FAT16
E: ID_FS_UUID=6CFF-7B84
E: ID_FS_LABEL=USB
E: ID_FS_LABEL_SAFE=USB_DISK
On y retrouve le n° de série à la fin du ID_SERIAL... :wink:
Tu peux ensuite creuser les autres infos via udevinfo... (man udevinfo)
Répondre