1. Qu'est-ce que udev?
udev est le gestionnaire de périphériques de la série Linux Kernel 2.6. Sa fonction principale est de gérer les nœuds de périphériques sous le répertoire / dev. Il est également utilisé pour remplacer les fonctions de devfs et hotplug, ce qui signifie qu'il doit gérer le comportement du répertoire / dev et de tout l'espace utilisateur lors de l'ajout / suppression de matériel, y compris lors du chargement du firmware.
La dernière version d'udev dépend de la dernière version de l'interface uevent du noyau Linux 2.6.13 mis à niveau. Le système utilisant la nouvelle version d'udev ne peut pas être démarré sous la version 2.6.13, à moins que le paramètre noudev ne soit utilisé pour désactiver udev et que le / dev traditionnel soit utilisé pour la lecture de périphérique.
Deuxièmement, les avantages de l'utilisation d'udev
- Lorsqu'un périphérique est ajouté ou supprimé, le cadre du démon d'udev écoute l'uevent du noyau pour ajouter ou supprimer des fichiers de périphérique sous / dev, donc udev ne génère que des fichiers de périphérique pour les périphériques connectés, pas sous / dev Un grand nombre de fichiers de périphérique virtuel.
- Les utilisateurs Linux peuvent générer de manière flexible des noms de fichiers de périphériques avec une identification forte via des fichiers de règles personnalisés, et ne dépend pas de l'ordre dans lequel les périphériques sont insérés dans le système.
- udev peut définir les autorisations du fichier de périphérique et le propriétaire et le groupe du fichier de périphérique selon certaines conditions.
Trois, fichier de configuration udev
[inbi @ debian ~] #cat /etc/udev/udev.conf # La priorité initiale de syslog (3): "err", "info", "debug" ou son # équivalent numérique. Pour le débogage à l'exécution, l' état # interne des démons peut être modifié avec: "udevcontrol log_priority =". udev_log = "err"
- udev_log: niveau de journalisation syslog, la valeur par défaut est err. S'il est changé en info ou debug, un long journal udev sera enregistré.
- udev_root: répertoire dans lequel le périphérique généré par udev est stocké. La valeur par défaut est / dev /. Il est recommandé de ne pas modifier les paramètres, cette option n'est donc pas affichée par défaut.
Quatrièmement, les règles et les fichiers de règles d'udev
Le fichier de règles est la partie la plus importante d'udev et est stocké par défaut dans /etc/udev/rules.d/. Tous les fichiers de règles doivent porter le suffixe ".rules" et les fichiers de règles sont exécutés dans l'ordre de la première lettre ou du premier chiffre.
Dans le fichier de règles, à l'exception de la ligne (commentaire) commençant par "#", toutes les lignes non vides sont considérées comme une règle, mais une règle ne peut pas être étendue à plusieurs lignes. Les règles sont composées de plusieurs paires clé-valeur, séparées par des virgules. Les paires clé-valeur peuvent être divisées en paires clé-valeur conditionnelles correspondantes (ci-après dénommées "clés correspondantes") et en paires clé-valeur d'affectation (ci-après dénommées " Clé d'affectation "), une règle peut avoir plusieurs clés correspondantes et plusieurs clés d'affectation. La clé correspondante doit correspondre à toutes les conditions d'un attribut d'appareil. Lorsque l'attribut d'un appareil correspond à toutes les clés correspondantes de la règle, la règle est considérée comme effective, puis l'attribution de la règle est exécutée en fonction du contenu de la clé d'affectation. Voici une règle simple:
KERNEL == "sdb", NAME = "disque racine", MODE = "0660"
KERNEL est la clé correspondante, et NAME et MODE sont les clés d'assignation. La signification de cette règle est la suivante: s'il y a un périphérique dont le nom de périphérique du noyau est sdb, la condition prendra effet et l'affectation suivante sera exécutée: un fichier de périphérique nommé root_disk est généré sous / dev, et les autorisations de fichier de périphérique sont réglé sur 0660.
== | Comparez la clé et la valeur, si elles sont égales, la condition est satisfaite |
! = | Comparez les clés et les valeurs, si elles ne sont pas égales, la condition est satisfaite |
= | Attribuer une valeur à une clé |
+ = | Attribuer une valeur à une clé qui représente plusieurs entrées |
: = | Attribuer une valeur à une clé et rejeter toutes les modifications ultérieures de la clé |
ACTION | Comportement d'événement: ajouter (ajouter un appareil), supprimer (supprimer un appareil) |
NOYAU | Nom du périphérique du noyau, par exemple: sda, cdrom |
DEVPATH | Chemin Devpath de l'appareil |
SOUS-SYSTÈME | Le nom du sous-système de l'appareil, par exemple, le sous-système de sda est block |
BUS | Le nom de bus du périphérique dans devpath, par exemple: usb |
CHAUFFEUR | Le nom du pilote de périphérique du périphérique dans devpath, par exemple: ide-cdrom |
identifiant | Le numéro d'identification de l'appareil dans devpath |
SYSFS {nom de fichier} | Le contenu du fichier de propriétés "filename" du périphérique sous le chemin devpath du périphérique. Par exemple: SYSFS {mode} == "ST936701SS" signifie: si le modèle de l'appareil est ST936701SS, l'appareil correspond à la clé correspondante. Dans une règle, vous pouvez définir jusqu'à cinq clés correspondantes SYSFS |
ENV (clé) | Variables d'environnement. Dans une règle, vous pouvez définir jusqu'à cinq clés correspondantes pour les variables d'environnement |
PROGRAMME | Appeler des commandes externes |
RÉSULTAT | Le résultat de retour de la commande externe PROGRAM. 例 : PROGRAM == ”/ lib / udev / scsi_id -g -s $ devpath”, RESULT == ”35000c50000a7ef67 ″ |
NOM | Le nom du fichier de périphérique généré sous / dev. Seule la première attribution au NOM d'un appareil prend effet, puis l'attribution au NAME de l'appareil par les règles de correspondance sera ignorée. S'il n'y a pas de règle pour attribuer une valeur au nom du périphérique, udev utilisera le nom du périphérique du noyau pour générer le fichier du périphérique. |
SYMLINK | Créez des liens symboliques pour les fichiers de périphériques sous / dev /. Comme udev ne peut générer qu'un seul fichier de périphérique pour un certain périphérique, il est recommandé d'utiliser des liens symboliques afin de ne pas écraser les fichiers générés par les règles udev par défaut du système. |
PROPRIÉTAIRE | Utilisateur par defaut |
GROUPER | Groupe d'utilisateurs par défaut |
MODE | Autorisations de l'appareil |
ENV {clé} | Importer une variable d'environnement |
$ noyau,% k | Le nom de périphérique du noyau du périphérique, par exemple: sda, cdrom |
$ nombre,% n | Le numéro de noyau de l'appareil, par exemple: le numéro de noyau de sda3 est 3 |
$ devpath,% p | Chemin Devpath de l'appareil |
$ id,% b | Numéro d'identification de l'appareil dans devpath |
$ sysfs {fichier},% s {fichier} | Le contenu du fichier dans le sysfs de l'appareil. En fait, il s'agit de la valeur d'attribut de l'appareil. Par exemple: Par exemple: $ sysfs {size} indique la taille du périphérique (disque). |
$ env {clé},% E {clé} | La valeur d'une variable d'environnement |
$ majeur,% M | Numéro majeur de l'appareil |
$ mineur,% m | Numéro mineur de l'appareil |
$ résultat,% c | PROGRAM 返回的结果。 |
$parent,%P | 父设备的设备文件名 |
$root,%r | udev_root 的值,默认是 /dev/。 |
$tempnode,%N | 临时设备名 |
%% | 符号 % 本身 |
$$ | 符号 $ 本身 |
devpath:是指一个设备在 sysfs 文件系统(/sys)下的相对路径,该路径包含了设备的属性文件。udev 里的多数命令都是针对 devpath 操作的。例如:sda 的 devpath 是 /block/sda,sda2 的 devpath 是 /block/sda/sda2。
五、udev 规则文件实例
KERNEL=="sd*", PROGRAM="/lib/udev/scsi_id -g -s %p",
RESULT=="35000C50000A7EF67", SYMLINK="%k_%c"
该规则的执行:如果有一个内核设备名称以 sd 开头,且 SCSI ID 为 35000c50000a7ef67,则为设备文件产生一个符号链接 “sda_35000c50000a7ef67”。
SUBSYSTEM=="net", SYSFS{address}=="00:1E:6E:00:36:F1", NAME="public_NIC"
如果存在设备的子系统为 net,并且地址(MAC address)为 “00:1E:6E:00:36:F1”,为该设备产生一个名为 public_NIC 的设备文件。
SUBSYSTEM=="block", SYSFS{size}=="71096640", SYMLINK="my_disk"
如果存在设备的子系统为 block,并且大小为 71096640(block),则为该设备的设备文件名产生一个名为 my_disk 为符号链接。
六、查询设备信息
查询 sysfs 文件系统
设备 sda 的 SYSFS{size} 可以通过 cat /sys/block/sda/size 得到;
SYSFS{model} 信息可以通过 cat /sys/block/sda/device/model 得到。查询磁盘的 SCSI_ID
scsi_id -g -s /block/sda
参考文献:
http://zh.wikipedia.org/wiki/Udev
http://www.reactivated.net/writing_udev_rules.html
http://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html?ca=drs-cn-0304