Personnaliser les noms des devices (règles udev)

Demander un devis
Je souhaite télécharger le programme ou imprimer le programme
  • Imprimer

Introduction

 

Cet article est un complément du tutoriel sur les périphériques. En effet, les périphériques USB sont nommés  (au niveau des devices) en fonction de leur ordre de branchement ce qui peut poser problème pour les monter au bon endroit.

 

Exemple : je veux monter systématiquement le contenu de la carte SD de mon téléphone portable dans /mnt/telephone et le contenu de mon lecteur mp3 systématiquement dans /mnt/mp3. Supposons que mon disque dur soit associé au device /dev/sda. Si je branche en premier le téléphone, celui-ci sera nommé /dev/sdb. Si dans un second temps je branche le lecteur mp3, celui-ci sera nommé /dev/sdc. Si j'associe dans /etc/fstab le device /dev/sdb avec /mnt/telephone et le device /dev/sdc avec /mnt/mp3 tout va bien. Malheureusement, si par la suite je branche d'abord le lecteur mp3 et ensuite le téléphone, ceux-ci apparaîtront dans le mauvais point de montage.

 

Pour régler ce problème, on peut demander à udev (qui crée le device au moment où le périphérique est branché) de donner un nom bien précis au périphérique, par exemple en fonction de son constructeur et de son modèle. On pourra ainsi demander à udev de systématiquement nommer le téléphone sous le nom /dev/telephone et le lecteur mp3 sous le nom /dev/mp3. Pour mettre ceci en place, il suffit de configurer des règles udev.

 

Pour suivre ce tutoriel il est recommandé d'avoir lu au préalable le tutoriel sur le mode texte et la configuration d'applications sous Linux.

Fonctionnement d'udev

 

Concrètement, udev est lancé par le biais du service /etc/init.d/udev. Celui-ci examine au démarrage (ou quand on le relance) les règles configurées dans /etc/udev/rules.d/. Rajouter une règle udev consiste simplement à ajouter un fichier dans ce dossier. ce qui nécessitera des droits root. On peut par exemple utiliser nano pour réaliser cette tâche.

 

Ceci fait, il ne reste plus qu'à relancer udev pour que celui-ci tienne compte des modifications apportés à sa configuration. Ceci se fait en root avec l'une de ces commandes :

 

service udev restart

/etc/init.d/udev restart

 

Définir la règle udev

Récupérer les informations relatives au périphérique

 

Dans cet exemple, on cherche à faire en sorte qu'un archos soit systématiquement nommé /dev/archos. Pour retrouver les informations relatives à ce périphérique (et après l'avoir branché !), on peut utiliser la commande lshal. Comme le résultat de la commande est souvent assez long.

 

lshal > ~/lshal.txt

nano ~/lshal.txt

 

Les lignes pertinentes concernant ce périphérique renvoyées par lshal sont :


udi = '/org/freedesktop/Hal/devices/usb_device_71b_3203_USBV1_00_if0_scsi_host_0_scsi_device_lun0'
  info.linux.driver = 'sd'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_71b_3203_USBV1_00_if0_scsi_host_0'  (string)
  info.product = 'SCSI Device'  (string)
  info.subsystem = 'scsi'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_71b_3203_USBV1_00_if0_scsi_host_0_scsi_device_lun0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'scsi'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-1/3-1:1.0/host6/target6:0:0/6:0:0:0'  (string)
  scsi.bus = 0  (0x0)  (int)
  scsi.host = 6  (0x6)  (int)
  scsi.lun = 0  (0x0)  (int)
  scsi.model = 'Archos3'  (string)
  scsi.target = 0  (0x0)  (int)
  scsi.type = 'disk'  (string)
  scsi.vendor = ''  (string)


udi = '/org/freedesktop/Hal/devices/storage_serial_ARCHOS_Archos3_USBV1_00_0_0'
  block.device = '/dev/sdb'  (string)
  block.is_volume = false  (bool)
  block.major = 8  (0x8)  (int)
  block.minor = 16  (0x10)  (int)
  block.storage_device = '/org/freedesktop/Hal/devices/storage_serial_ARCHOS_Archos3_USBV1_00_0_0'  (string)
  info.addons = {'hald-addon-storage'} (string list)
  info.capabilities = {'storage', 'block'} (string list)
  info.category = 'storage'  (string)
  info.interfaces = {'org.freedesktop.Hal.Device.Storage.Removable'} (string list)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_71b_3203_USBV1_00_if0_scsi_host_0_scsi_device_lun0'  (string)
  info.product = 'Archos3'  (string)
  info.udi = '/org/freedesktop/Hal/devices/storage_serial_ARCHOS_Archos3_USBV1_00_0_0'  (string)
  info.vendor = ''  (string)
  linux.hotplug_type = 3  (0x3)  (int)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-1/3-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb'  (string)
  storage.automount_enabled_hint = true  (bool)
  storage.bus = 'usb'  (string)
  storage.drive_type = 'disk'  (string)
  storage.firmware_version = '1.00'  (string)
  storage.hotpluggable = true  (bool)
  storage.lun = 0  (0x0)  (int)
  storage.media_check_enabled = true  (bool)
  storage.model = 'Archos3'  (string)
  storage.no_partitions_hint = false  (bool)
  storage.originating_device = '/org/freedesktop/Hal/devices/usb_device_71b_3203_USBV1_00_if0'  (string)
  storage.partitioning_scheme = 'none'  (string)
  storage.removable = true  (bool)
  storage.removable.media_available = true  (bool)
  storage.removable.media_size = 8205107200  (0x1e9100000)  (uint64)
  storage.removable.support_async_notification = false  (bool)
  storage.requires_eject = false  (bool)
  storage.serial = 'ARCHOS_Archos3_USBV1.00-0:0'  (string)
  storage.size = 0  (0x0)  (uint64)
  storage.vendor = ''  (string)


udi = '/org/freedesktop/Hal/devices/volume_uuid_C4EC_172C'
  block.device = '/dev/sdb'  (string)
  block.is_volume = true  (bool)
  block.major = 8  (0x8)  (int)
  block.minor = 16  (0x10)  (int)
  block.storage_device = '/org/freedesktop/Hal/devices/storage_serial_ARCHOS_Archos3_USBV1_00_0_0'  (string)
  info.capabilities = {'volume', 'block'} (string list)
  info.category = 'volume'  (string)
  info.interfaces = {'org.freedesktop.Hal.Device.Volume'} (string list)
  info.parent = '/org/freedesktop/Hal/devices/storage_serial_ARCHOS_Archos3_USBV1_00_0_0'  (string)
  info.product = 'Archos3'  (string)
  info.udi = '/org/freedesktop/Hal/devices/volume_uuid_C4EC_172C'  (string)
  linux.hotplug_type = 3  (0x3)  (int)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb3/3-1/3-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/fakevolume'  (string)
  org.freedesktop.Hal.Device.Volume.method_argnames = {'mount_point fstype extra_options', 'extra_options', 'extra_options'} (string list)
  org.freedesktop.Hal.Device.Volume.method_execpaths = {'hal-storage-mount', 'hal-storage-unmount', 'hal-storage-eject'} (string list)
  org.freedesktop.Hal.Device.Volume.method_names = {'Mount', 'Unmount', 'Eject'} (string list)
  org.freedesktop.Hal.Device.Volume.method_signatures = {'ssas', 'as', 'as'} (string list)
  volume.block_size = 512  (0x200)  (int)
  volume.fstype = 'vfat'  (string)
  volume.fsusage = 'filesystem'  (string)
  volume.fsversion = 'FAT32'  (string)
  volume.ignore = false  (bool)
  volume.is_disc = false  (bool)
  volume.is_mounted = false  (bool)
  volume.is_mounted_read_only = false  (bool)
  volume.is_partition = false  (bool)
  volume.label = 'Archos3'  (string)
  volume.linux.is_device_mapper = false  (bool)
  volume.mount.valid_options = {'ro', 'sync', 'dirsync', 'noatime', 'nodiratime', 'relatime', 'noexec', 'quiet', 'remount', 'exec', 'utf8', 'shortname=', 'codepage=', 'iocharset=', 'umask=', 'dmask=', 'fmask=', 'uid=', 'flush'} (string list)
  volume.mount_point = ''  (string)
  volume.num_blocks = 16025600  (0xf48800)  (uint64)
  volume.size = 8205107200  (0x1e9100000)  (uint64)
  volume.unmount.valid_options = {'lazy'} (string list)
  volume.uuid = 'C4EC-172C'  (string)

 

lshal nous informe que pour le moment ce périphérique est nommé /dev/sdb, mais ce qui nous intéresse ici, ce sont des champs qui vont le distinguer de n'importe quel périphérique USB (marqué en gras).

 

Note : par le passé on pouvait aussi utiliser udevinfo.

 

udevinfo -a -p $(udevinfo -q path -n /dev/sdb)

 

Écrire la règle

 

Nous allons mettre les règles que l'on ajoute dans un fichier spécifique : /etc/udev/010_local.rules. Il suffira de compléter ce fichier si on a d'autres règles à définir ultérieurement.

 

Dans notre exemple, le "manufacturer" est "" (comme cette chaîne et vide on ne la fait pas figurer dans la règle udev) et le "model" est "Archos3". On souhaite nommer ce périphérique /dev/archos. On crée (si besoin) le fichier /etc/udev/010_local.rules, par exemple à l'aide de nano :

 

nano /etc/udev/010_local.rules

 

À présent on rajoute dans ce fichier la règle :

 

# Archos
BUS=="usb", SYSFS{product}=="Archos3", NAME="archos"

 

On relance udev :

 

service udev restart

 

Débranchons à présent le périphérique (il ne faut pas oublier de démonter le périphérique s'il a été monté) et vérifions qu'il est correctement nommé par udev.

 

(root@silk) (~) # dmesg | tail
[23216.658473] sd 9:0:0:0: [sdb] 16025600 512-byte logical blocks: (8.20 GB/7.64 GiB)
[23216.658480] sd 9:0:0:0: [sdb] Assuming Write Enabled
[23216.658484] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[23216.660257] sd 9:0:0:0: [sdb] Assuming Write Enabled
[23216.660262] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[23216.660267]  sdb:
[23216.661969] sd 9:0:0:0: [sdb] Assuming Write Enabled
[23216.661974] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[23216.661979] sd 9:0:0:0: [sdb] Attached SCSI removable disk
[23250.337124] rtl8192_hw_wakeup(): RF Change in progress! schedule wake up task again


(root@silk) (~) # ls -l /dev/archos
brw-rw---- 1 root floppy 8, 16 17 sept. 17:23 /dev/archos

 

Il est temps de corriger la ligne correspondante dans /etc/fstab. La ligne passe de :

 

/dev/sdb     /mnt/archos     vfat         user,umask=0022,noauto,quiet  0  0

 

... à la ligne :

 

/dev/archos     /mnt/archos     vfat         user,umask=0022,noauto,quiet  0  0

 

Une fois le périphérique monté (éventuellement via l'applet KDE ou gnome), on vérifie que tout s'est passé comme prévu (le device manipulé est /dev/archos et le point de montage est bien /mnt/archos) :

 

(root@silk) (~) # mount
/dev/sda4 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/home/mando/ftp on /home/ftp type none (rw,bind)
/dev/sda2 on /mnt/windows type fuseblk (rw,noexec,nosuid,nodev,allow_other,blksize=4096,default_permissions)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
/dev/archos on /mnt/archos type vfat (rw,noexec,nosuid,nodev,umask=0022,quiet,user=mando)

 

Quelques exemples complémentaires

 

  • Téléphone Sony Ericsson :
BUS=="usb", SYSFS{manufacturer}=="Sony Ericsson", SYSFS{product}=="Memory Stick", NAME="phone"
  • Appareil photo Pentax :
BUS=="usb", SYSFS{manufacturer}=="PENTAX", SYSFS{product}=="PENTAX OPTIO A30", NAME="camera".
X
 
 
 
 
 

You havecharacters left.