Maison  >  Article  >  Opération et maintenance  >  Qu'est-ce que Linux 6.5 udev

Qu'est-ce que Linux 6.5 udev

藏色散人
藏色散人original
2023-04-10 11:00:17982parcourir

linux 6.5 udev est le gestionnaire de périphériques du noyau Linux ; 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 devfs (système de fichiers du périphérique) et hotplug (hot). plug) ; Dans les systèmes Linux traditionnels, les nœuds de périphériques dans le répertoire "/dev" sont une série de fichiers existants de manière statique, tandis que "udev" fournit dynamiquement des nœuds de périphériques qui existent réellement dans le système.

Qu'est-ce que Linux 6.5 udev

L'environnement d'exploitation de ce tutoriel : système Linux 6.5, ordinateur Dell G3.

linux 6.5, qu'est-ce qu'udev ?

Introduction à udev udevadm et renommage de périphérique Linux et analyse d'exemples d'application de montage automatique

(1) Introduction à UDEV

La définition de udev dans Wikipédia est : udev (userspace /dev) est un gestionnaire de périphériques pour le Noyau Linux. En tant que successeur de devfsd et hotplug, udev gère principalement les nœuds de périphériques dans le répertoire /dev. En même temps, udev gère également tous les événements de l'espace utilisateur déclenchés lorsque des périphériques matériels sont ajoutés au système ou supprimés de celui-ci, y compris le micrologiciel. chargement requis par certains appareils. En chinois : udev est le gestionnaire de périphériques du noyau Linux. Sa fonction principale est de gérer les nœuds de périphériques sous le répertoire /dev. Il est également utilisé pour reprendre les fonctions devfs (système de fichiers du périphérique) et hotplug (hot plug), ce qui signifie qu'il doit gérer le répertoire /dev et tous les comportements de l'espace utilisateur lors de l'ajout/suppression de matériel, y compris lors du chargement du firmware.

(1) Résumé d'udev :

Dans les systèmes Linux traditionnels, les nœuds de périphérique dans le répertoire /dev sont une série de fichiers existants de manière statique, tandis qu'udev fournit dynamiquement des nœuds de périphérique qui existent réellement dans le système. Bien que devfs fournisse des fonctions similaires, udev présente des avantages par rapport à devfs :

  • udev prend en charge la dénomination fixe des appareils et ne dépend pas de l'ordre dans lequel les appareils sont insérés dans le système. Les paramètres udev par défaut fournissent une dénomination fixe des périphériques de stockage. Un appareil peut être confirmé en utilisant sa vid (fournisseur), son pid (appareil), son nom d'appareil (modèle) et d'autres attributs ou les attributs correspondants de son appareil parent.
  • udev est exécuté entièrement dans l'espace utilisateur, pas dans l'espace noyau comme devfs. Le résultat est qu'udev supprime la politique de dénomination du noyau et permet à n'importe quel programme de nommer le périphérique dans les propriétés du périphérique avant la création du nœud.

(2) mode d'exécution d'udev :

udev est un gestionnaire de périphériques universel du noyau. Il s'exécute comme un démon sur le système Linux et écoute les événements émis par le noyau (via le socket netlink) lorsqu'un nouveau périphérique est initialisé ou que le périphérique est supprimé du système.
Le système fournit un ensemble de règles pour faire correspondre les valeurs exportées des événements et des propriétés des appareils détectables. Les règles de correspondance peuvent nommer et créer des nœuds de périphérique et exécuter des programmes de configuration pour configurer le périphérique. Les règles udev peuvent correspondre à des attributs tels que le sous-système du noyau, le nom du périphérique du noyau, les propriétés physiques du périphérique ou le numéro de série du périphérique. Les règles peuvent également demander des informations à des programmes externes pour nommer l'appareil, ou spécifier un nom personnalisé qui sera toujours le même, quel que soit le moment où l'appareil est découvert par le système

(3) architecture du système udev :

udev. le système peut être divisé en trois parties :

  • bibliothèque de fonctions libudev, qui peut être utilisée pour obtenir des informations sur l'appareil.
  • Le démon udevd, situé dans l'espace utilisateur, est utilisé pour gérer virtual/dev.
  • La commande de gestion udevadm est utilisée pour diagnostiquer les erreurs.

Le système obtient les informations envoyées par le noyau via le socket netlink. Les versions antérieures utilisaient hotplug et ajoutaient un lien vers lui-même dans /etc/hotplug.d/default pour atteindre cet objectif.

(2) Introduction à la commande udevadm

Elle est décrite ainsi dans la page de manuel Linux. udevadm - outil de gestion udev. En d'autres termes, la commande udevadm est un outil de gestion d'udev. En fait, si nous souhaitons renommer le périphérique ou monter automatiquement le périphérique, nous utilisons également udevadm pour afficher et suivre les informations udev.
udevadm peut être utilisé pour surveiller et contrôler le comportement d'exécution d'udev, demander des événements au noyau, gérer les files d'attente d'événements et fournir un mécanisme de débogage simple.

(1) Commande principale udevadm :

  • info Interroge la base de données sysfs ou udev
  • trigger Demander des événements au noyau
  • settle Afficher la file d'attente des événements udev, quitter si tous les événements ont été traités
  • control Modifier l'état interne de les informations d'arrière-plan udev
  • monitor surveille les événements du noyau
  • hwdb Traite l'index de la base de données matérielle
  • test Débogage

(2) Application de commande :

(a) Afficher les informations sur le périphérique :

udevadm info --query=all --name=sda 查询sda的所有信息
udevadm info --query=path --name=sda 查看sda的path
udevadm info --attribute-walk --name=/dev/nvme0n1  查看nvme0n1的所有父设备一直到sysfs的根节点

--query=type   Interroge le spécifié à partir de la base de données type d'équipement. --path et --name sont requis pour spécifier le périphérique. Les fichiers de requête légaux sont : nom de l'appareil, lien, chemin, attribut
--path=devpath   Chemin de l'appareil
--name=file   Nœud ou lien de l'appareil
--attribute-walk   Imprimer les attributs de tous les enregistrements sysfs du périphérique spécifié pour utiliser les règles udev pour faire correspondre des appareils spécifiques. Cette option imprime toutes les informations sur le périphérique sur la chaîne, jusqu'au répertoire sys possible.
--device-id-of-file=file Imprimer le numéro de périphérique maître/esclave
--export-db Afficher le contenu de la base de données udev

(b) Surveiller les événements du périphérique : udevadm monitor [options] Surveiller les événements du noyau et événements envoyés par udev. Périphérique à partir duquel l’événement d’impression a été émis. La synchronisation des événements peut être analysée en comparant les horodatages des événements du noyau ou de l'udev.

udevadm monitor --property   输出事件的属性
udevadm monitor --kernel --property --subsystem-match=usb    过滤监听符合条件的时间

--kernel Événements du noyau de sortie

--udev Événements udev lorsque les règles udev sont exécutées

--property Propriétés de l'événement de sortie
--subsystem-match=string Filtrer les événements par sous-système ou type de périphérique. Seuls les événements de périphérique udev qui correspondent à la valeur du sous-système sont transmis.
--tag-match=string  Filtrez les événements par attributs, et seuls les événements udev qui correspondent à la balise seront transmis.

(c) Simuler un événement udev

udevadm test [options] devpath Simulez un événement udev et imprimez les informations de débogage.

(d) Recevoir les événements de périphérique envoyés par le noyau

Déclencheur udevadm [options] Recevoir les événements de périphérique envoyés par le noyau. Principalement utilisé pour relire les informations sur les événements coldplug

(Le noyau a détecté les périphériques matériels du système au démarrage et a exporté les informations sur les périphériques matériels via le système de fichiers virtuel du noyau sysfs. udev analyse le système de fichiers sysfs et génère un branchement à chaud en fonction des informations sur le périphérique matériel ( hotplug), udev lit ensuite ces événements et génère le fichier de périphérique matériel correspondant. Puisqu'il n'y a pas d'action réelle de branchement et de débranchement du matériel, ce processus est appelé coldplug)

--verbose   Affiche la liste des périphériques qui seront déclenchés.
--dry-run    Ne déclenche pas réellement d'événement
--type=type    Déclenche un appareil spécial. Types légaux : appareils, sous-système, échec. La valeur par défaut est devices
--action=action  L'événement déclenché, la valeur par défaut est change
--subsystem-match=subsystem  L'événement de périphérique qui déclenche le sous-système correspondant. Cette option peut être spécifiée plusieurs fois et prend en charge la correspondance de modèles de shell.
--attr-match=attribute=value   Déclenchez des événements de périphérique qui correspondent aux attributs sysfs. Si une valeur d'attribut est spécifiée avec un attribut, la valeur de l'attribut peut être mise en correspondance à l'aide de modèles de shell. Si aucune valeur n'est spécifiée, les propriétés existantes sont revalidées. Cette option peut être spécifiée plusieurs fois.
--attr-nomatch=attribute=value  Ne déclenchez pas d'événements d'appareil qui correspondent aux attributs. Si possible, utilisez la correspondance de modèles. Vous pouvez également spécifier
--property-match=property=value plusieurs fois pour faire correspondre les appareils avec les propriétés correspondantes. Vous pouvez spécifier plusieurs fois pour prendre en charge la correspondance de modèles
--tag-match=property    Faites correspondre les appareils avec les balises correspondantes. Peut être spécifié plusieurs fois.
--sysname-match=name Correspond aux appareils portant le même nom d'appareil système. La correspondance des modèles de support peut être spécifiée plusieurs fois.

(e) Afficher la file d'attente des événements udev

udevadm réglez [options] Affichez la file d'attente des événements udev et quittez si tous les événements sont traités.

--timeout=seconds  Temps maximum d'attente pour que la file d'attente des événements soit vide. La valeur par défaut est de 180 secondes. Si c'est 0, quittez immédiatement.

--seq-start=seqnum  Attendez seulement le numéro de séquence donné.
--seq-end=seqnum  Attendez seulement le numéro de séquence donné.
--exit-if-exists=file   Quitter si le fichier existe
--quiet  Ne produire aucune information

(2) Exemples d'application :

Utilisez udev pour implémenter l'USB, le renommage des périphériques de carte SD, le montage automatique, la désinstallation automatique .

Pour une application simple de cette fonction, vous pouvez vous référer à un autre blog "udev renomme le nom du nœud du périphérique et monte et démonte automatiquement la partition du périphérique de stockage"

Cet article enregistre principalement les problèmes et précautions rencontrés lors de l'utilisation.

(三)注意事项:

(1)设备冲突问题:

    在海思平台,对于有些SD卡或是USB自动挂载有些时候会出现冲突的问题,问题现象就是自动挂载的时候有时候有时候U盘和SD卡自动挂载相互干扰。主要原因点是因为海思的HI35XX的很多设备不具备SDIO总线,所以如果要使用SD的设备,一般都是将SD卡通过读卡器转换为USB总线信号。对于对于这类问题,可以通过SD卡的读卡器ID来区分是USB还是SD卡设备。

在海思平台可以使用下面命令查看USB设备信息:

lsusb:

~ # lsusb
Bus 001 Device 002: ID 1c9e:9b3c
Bus 001 Device 003: ID 05e3:0610
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0001
Bus 001 Device 008: ID 0951:1642
Bus 001 Device 009: ID 05e3:0716
Bus 001 Device 006: ID 0bda:8176
~ #

cat device 

~ # cat /sys/kernel/debug/usb/devices 
T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=12   MxCh= 2
B:  Alloc=  0/900 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 1.10 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0001 Rev= 3.10
S:  Manufacturer=Linux 3.10.0 ohci_hcd
S:  Product=HIUSB OHCI
S:  SerialNumber=hiusb-ohci
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=255ms

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 2
B:  Alloc=  0/800 us ( 0%), #Int=  5, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 3.10
S:  Manufacturer=Linux 3.10.0 ehci_hcd
S:  Product=HIUSB EHCI
S:  SerialNumber=hiusb-ehci
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1c9e ProdID=9b3c Rev= 3.18
S:  Manufacturer=LONGSUNG
S:  Product=USB Modem
C:* #Ifs= 5 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=option
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiNet
E:  Ad=89(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
E:  Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=480  MxCh= 4
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=02 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0610 Rev=32.98
S:  Product=USB2.0 Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=01 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms
I:* If#= 0 Alt= 1 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=02 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms

T:  Bus=01 Lev=02 Prnt=03 Port=00 Cnt=01 Dev#=  8 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0951 ProdID=1642 Rev= 1.00
S:  Manufacturer=Kingston
S:  Product=DT 101 G2
S:  SerialNumber=001CC0EC32F7BB40F71300BF
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=03 Port=02 Cnt=02 Dev#=  9 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0716 Rev=97.27
S:  Manufacturer=Genesys
S:  Product=USB Reader
S:  SerialNumber=000000000013
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=03 Port=03 Cnt=03 Dev#=  6 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0bda ProdID=8176 Rev= 2.00
S:  Manufacturer=Realtek
S:  Product=802.11n WLAN Adapter
S:  SerialNumber=00e04c000001
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 4 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtl8192cu
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=125us
~ #

查看上面信息可以知道USB相关的设备有:
Product=HIUSB EHCI   #海思USB总线
Product=USB Modem  #上网模块
Product=USB2.0 Hub   #USB HUB
Product=DT 101 G2    # U盘
Product=USB Reader # usb 读卡器
Product=802.11n WLAN Adapter #USB网卡

(2)多属性匹配问题

    对于一个设备如果要匹配他的多个属性,或者是同一个属性,它在不同的层级中有不同的值,那么这个时候需要使用GOTO功能。比如在一个设备中要重名名一个USB设备,它的命令如下:

KERNEL=="sd*",KERNELS=="*:0:0:1",ATTRS{scsi_level}=="0" ,ATTRS{product}=="USB Reader",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",SYMLINK+="usbsda%n",OPTIONS="ignore_remove"

这里涉及到多个属性ATTRS 值的匹配,另外该USB因为有些经过了usbHUB,所以他的idVendor 和 idProduct 有多个,就有总线的,也有HUB的,还有USB设备的,这样的情况下是匹配不上设备的。具体是什么原因我没有找到一个合理的解释,但是我又一个可用的解决方案,那就是使用GOTO。将上面命令改成如下就可以了。

KERNEL=="sd*",KERNELS=="*:0:0:1",ATTRS{scsi_level}=="0" GOTO="hisi_end"
ATTRS{product}=="USB Reader",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",SYMLINK+="usbsda%n",OPTIONS="ignore_remove"
LABEL="hisi_end"

(3)监控设备事件

    udev的一些匹配规则有些时候比较的莫名其妙,我也没有找到哪里有比较详细的说明,网上的介绍都它过于简单,实际应用的时候还是很多的问题,比如针对上面介绍的设备,如果要写一条卸载设备的命令,可以使用下面语句:

ACTION=="remove",KERNELS=="*:0:0:1",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",RUN+="/bin/umount -l /opt/usb_sd1_1"

但是在实际使用的时候,他们匹配不上,ACTION=="remove",KERNELS=="*:0:0:1"与ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716" 不能同时使用,如果直接改成:

ACTION=="remove",KERNELS=="*:0:0:1",RUN+="/bin/umount -l /opt/usb_sd1_1"

命令功能可以实现,但是这样会出现于设备冲突的情况,在拔出该设备的时候,会把KERNELS=="*:0:0:1" 的其他设备也卸载掉。

在这个时候,我们可以使用 devadm monitor --property  去监控设备拔出的时候它有哪些事件,有哪些属性可以被捕捉到并且与其他的设备属性不同以便区分不同的设备。下面是截取到的一部分数据:

[10:00:33]KERNEL[1555639338.737818] remove   /devices/platform/hiusb-ehci.0/usb1/1-2/1-2.3 (usb)
[10:00:33]UDEV_LOG=3
[10:00:33]ACTION=remove
[10:00:33]DEVPATH=/devices/platform/hiusb-ehci.0/usb1/1-2/1-2.3
[10:00:33]SUBSYSTEM=usb
[10:00:33]DEVNAME=bus/usb/001/007
[10:00:33]DEVTYPE=usb_device
[10:00:33]PRODUCT=5e3/716/9727
[10:00:33]TYPE=0/0/0
[10:00:33]BUSNUM=001
[10:00:33]DEVNUM=007
[10:00:33]SEQNUM=1024
[10:00:33]MAJOR=189
[10:00:33]MINOR=6

从上面可以看出,拔出的时候有个PRODUCT ,它是 idVendor 和 idProduct 值的一个组合,可以使用它来区分不同的设备。最终可以正常卸载设备的命令如下:

ACTION=="remove",SUBSYSTEM=="usb",ENV{PRODUCT}=="5e3/716/9727",RUN+="/bin/umount -l /opt/usb_sd1_1"

相关推荐:《Linux视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:qu'est-ce que Linux VCSArticle suivant:qu'est-ce que Linux VCS