关注分享主机优惠活动
国内外VPS云服务器

linux6.5 udev是什么意思?

本文介绍了关于“linux6.5 udev是什么意思?”在实际案例的操作中,很多人都会遇到这样的困难,那么就让主机频道带领你学习如何应对这些情况吧!希望你能认真阅读,有所收获!

Linux 6.5 udev是Linux内核的设备管理器;它的主要功能是管理“/dev”目录下的设备节点,同时也用于替换devfs(设备文件系统)和hotplug(热插拔)。在传统的Linux系统中,“/dev”目录下的设备节点是一系列静态文件,而“udev”则动态提供系统中的实际设备节点。

什么是linux 6.5 udev?

udev udevadm简介及linux设备重命名和自动挂载应用实例分析

(1) UDEV在维基百科中介绍了UDEV的定义:udev (user space/dev)是Linux内核的设备管理器。作为devfsd和热插拔的继承者,udev主要管理/dev目录中的设备节点。同时,udev还处理所有在系统中添加或删除硬件设备时引发的用户空间事件,包括某些设备所需的固件加载。在中文里,udev是Linux内核的设备管理器。它的主要功能是管理/dev目录下的设备节点。它还用于替换devfs(设备文件系统)和hotplug(热插拔),这意味着在添加/删除硬件时,包括加载固件时,它必须处理/dev目录和所有用户空间的行为。

(1)udev概述:在传统的Linux系统中,/dev目录下的设备节点是一系列静态文件,而UDEV是动态提供系统中实际的设备节点。虽然devfs提供了类似的功能,但udev有比devfs更好的地方:

Udev支持设备的固定命名,不考虑设备插入系统的顺序。默认udev设置提供了存储设备的固定命名。可以用它的vid(厂商)、pid(设备)、设备名称(型号)等属性或者它的父设备的对应属性来确认某个设备。

Udev完全在用户空间执行,而不是像devfs一样在内核空间执行。结果是udev从内核中删除了命名策略,并且可以在创建节点之前使用任何程序在设备属性中命名设备。

(2)udev运行模式:udev是一个通用的内核设备管理器。它在Linux系统中作为一个守护进程运行,当一个新设备被初始化或从系统中删除时,它监听内核(通过netlink套接字)发出的uevent。该系统提供一组规则来匹配可发现设备事件和属性的导出值。匹配规则可以命名和创建设备节点,并运行配置程序来设置设备。Udev规则可以匹配内核子系统、内核设备名称、设备物理或设备序列号等属性。规则还可以请求外部程序提供信息来命名设备,或者指定一个始终相同的自定义名称,无论设备何时被系统发现。

(3)udev系统架构:udev系统可以分为三个部分:

Libudev函数库,可以用来获取设备信息。

Udevd守护进程,在用户空间,用于管理虚拟/开发。

管理命令udevadm用于诊断错误。

系统通过netlink socket获取内核发送的信息。早期版本使用hotplug,并在/etc/hotplug.d/default处添加了一个指向自身的链接来实现目标。

(二)udevadm命令简介在Linux手册页中有描述。udevadm - udev管理工具.也就是说,udevadm命令是管理udev的工具。实际上,如果我们想要重命名设备或自动挂载设备,我们也使用udevadm来查看和跟踪udev的信息。Udevadm可用于监视和控制udev运行时的行为,请求内核事件,管理事件队列,并提供简单的调试机制。

(1)udevadm主命令:info查询sysfs或udev的数据库。

触发器从内核请求事件。

Set检查udev事件队列,如果所有事件都已处理,则退出。

控件修改udev后台的内部状态信息。

Monitor监视内核的事件。

Hwdb处理硬件数据库索引。

测试调试

(2)命令应用:(a)查看设备信息:Udevadm info-query = all-name = sda查询sda的所有信息Udevadm info-query = path-name = sda查看SDA的pathudevadm info-attribute-walk-name =/Dev/nvme0n1查看nvme 0n 1的所有父设备直到sysfs - query=type的根节点从数据库中查询指定类型的设备。指定设备需要- path和- name。合法的查询文件有:设备名、链接、路径、属性-路径=devpath设备路径-名称=文件设备节点或链接-属性-行走打印指定设备的所有sysfs记录的属性,以便使用udev规则匹配特殊设备。该选项打印链中的所有器件信息,直到sys目录。-device-id-of-file = file打印主/从设备号- export-db输出udev数据库的内容。

(b)监控设备事件:udevadm monitor[选项]监控udev发送的内核事件和事件事件。打印发出事件的设备。您可以通过比较内核或udev事件的时间戳来分析事件计时。

Udevadm monitor -属性输出事件的属性Udevadm Monitor-kernel-property-subsystem-match = USB过滤和监控合格时间-内核输出内核事件- udev规则执行时udev输出udev事件。-属性输出event-subsystem-match = string = string的属性按子系统或设备类型筛选事件。只有与子系统值匹配的udev设备事件通过。-tag - tag-match=string通过属性过滤事件,只有匹配标记的udev事件通过。

模拟udev事件udevadm测试[选项] devpath模拟udev事件并打印出调试信息。

(d)接收内核发送的设备事件udevadm trigger [options]接收内核发送的设备事件。主要用于重放coldplug事件信息(内核在启动时已经检测到系统的硬件设备,并通过sysfs内核虚拟文件系统导出硬件设备信息)。Udev扫描sysfs文件系统,根据硬件设备信息生成热插拔事件。udev然后读取这些事件并生成相应的硬件设备文件。因为没有实际的硬件插拔动作,所以这个过程被称为coldplug。)- verbose输出要触发的设备列表。-预演不会真正触发事件- type=type触发特殊设备。合法类型:设备、子系统、失败。默认情况下,devices-action =由action触发的事件,默认情况下,change-subsystem-match =由子系统匹配触发的设备事件。该选项可以多次指定,并支持外壳模式匹配。-attr-match = attribute = value触发与sysfs属性匹配的设备事件。如果属性值是用属性指定的,则可以使用外壳模式匹配属性值。如果未指定值,则重新确认现有属性。可以多次指定该选项。-attr-nomatch = attribute = value不触发具有匹配属性的设备事件。如果可以使用模式匹配。您还可以多次指定-property-match = property = value来匹配具有匹配属性的设备。可以指定多个支持模式匹配的设备-标记-标记-匹配=属性匹配标记匹配。可以多次指定。- sysname-match=name = name匹配具有相同sys设备名称的设备。可以多次指定支持模式匹配。

(e)查看udev事件队列udevadm settle[选项]查看udev事件队列,如果所有事件都已处理,则退出。- timeout=seconds等待事件队列为空的最长时间。默认值为180秒。如果是0,立即退出。-seq - seq-start=seqnum只等待给定的序列号。-seq-end = seqnum仅等待给定的序列号。-Exit-if-exists = file Exit if the file exists-quiet不输出任何信息。

(2)应用实例:利用udev实现USB和SD卡设备的重命名、自动挂载和自动卸载。

关于这个函数的简单应用,请参考另一篇博客,udev Rename Device Node Name自动挂载和卸载存储设备分区。

本文主要记录使用中遇到的问题和注意事项。

(3)注意事项:(1)设备冲突:在海思平台上,部分SD卡或USB automounts有时会发生冲突。问题现象是自动挂载时,有时u盘和SD卡自动挂载会互相干扰。主要原因是海思的HI35XX很多设备没有SDIO总线,所以如果要用SD设备,一般都是通过读卡器把SD卡转换成USB总线信号。对于这类问题,可以通过SD卡的读卡器ID来区分USB或者SD卡设备。

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

lsusb:

~ # lsusbBus 001设备002: ID 1c9e:9b3cBus 001设备003: ID 05e3:0610Bus 001设备001: ID 1d6b:0002Bus 002设备001: ID 1d6b:0001Bus 001设备00 8: ID 0951:1642Bus 001设备009: ID 05e3:0716Bus 001设备006:ID 0bda:806

~ # cat/sys/kernel/debug/USB/devices T:Bus = 02 Lev = 00 Prnt = 00 Port = 00 Cnt = 00 Dev # = 1 Spd = 12 MxCh = 2B:Alloc = 0/900 us(0%),#Int= 0,# Iso = 0D:Ver = 1.10 Cls = 09(hub)Sub = 00 Prot = 00 MxPS = 64 # Cfgs = 1P:Vendor = 1d6b ProdID = 0001 Rev = 3.10s)MxPS = 2 Ivl = 255 MST:Bus = 01 Lev = 00 Prnt = 00 Port = 00 Cnt = 00 Dev # = 1 Spd = 480 MxCh = 2B:Alloc = 0/800 us(0%),#Int= 5,# Iso = 0D:Ver = 2.00 Cls = 09(hub)Sub = 00 Prot = 00 MxPS = 64 # Cfgs = 1P:Vendor = 1d6b ProdID = 0002 Rev = 3.10s)MxPS = 4 Ivl = 256 MST:Bus = 01 Lev = 01 Prnt = 01 Port = 00 Cnt = 01 Dev # = 2 Spd = 480 MxCh = 0D:Ver = 2.00 Cls = 00(& gt;IFC)Sub = 00 Prot = 00 MX PS = 64 # Cfgs = 1P:Vendor = 1c 9e ProdID = 9b3c Rev = 3.18s:Manufacturer = long sungs:Product = USB ModemC:* # Ifs = 5 Cfg # = 1 Atr = 80 MX PWR = 500 mai:* 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 = 0 MSE:Ad = 81(I)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MSI:* 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 = 32 MSE:Ad = 82(I)Atr = 02(散装)MxPS = 512 Ivl = 0 MSE:Ad = 02(O)Atr = 02(散装)MxPS = 512 Ivl = 0 MSI:* 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 = 32 MSE:Ad = 84(I)Atr = 02(散装)MxPS = 512 Ivl = 0 MSE:Ad = 03(O)Atr = 02(散装)MxPS = 512 Ivl = 0 MSI:* 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 = 32 MSE:Ad = 86(I)Atr = 02(散装)MxPS = 512 Ivl = 0 MSE:Ad = 04(O)Atr = 02(散装)MxPS = 512 Ivl = 0 MSI:* If # = 4 Alt = 0 # EPs = 3 Cls = ff(vend。)Sub = ff Prot = ff Driver = Gobi nete:Ad = 89(I)Atr = 03(Int。)MxPS= 8 Ivl=32msE: Ad=88(I) Atr=02(批量)MxPS = 512 Ivl = 0 MSE:Ad = 05(O)Atr = 02(批量)MxPS = 512 Ivl = 0 MST:Bus = 01 Lev = 01 Prnt = 01 Port = 01 Cnt = 02 Dev # = 3 Spd = 480 MxCh = 4D:Ver = 2.00 Cls = 09(hub)Sub = 00 Prot)MxPS = 1 Ivl = 256 MSI:* If # = 0 Alt = 1 # EPs = 1 Cls = 09(hub)Sub = 00 Prot = 02 Driver = hubE:Ad = 81(I)Atr = 03(Int。)MxPS = 1 Ivl = 256 MST:Bus = 01 Lev = 02 Prnt = 03 Port = 00 Cnt = 01 Dev # = 8 Spd = 480 MxCh = 0D:Ver = 2.00 Cls = 00(& gt;IFC)Sub = 00 Prot = 00 MxPS = 64 # Cfgs = 1P:Vendor = 0951 ProdID = 1642 Rev = 1.00s:Manufacturer = KingstonS:Product = DT 101 G2S:serial number = 001 cc 0 EC 32 f 7 bb 40 f 71300 bfc:* # Ifs = 1 Cfg # = 1 Atr = 80 MX PWR = 200 mai:* If # = 0 Alt = 0 # EPs = 2 Cls = 08(stor .)Sub = 06 Prot = 50 Driver = USB-storageE:Ad = 81(I)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MSE:Ad = 02(O)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MST:Bus = 01 Lev = 02 Prnt = 03 Port = 02 Cnt = 02 Dev # = 9 Spd = 480 MxCh = 0D:Ver = 2.00 Cls = 00(& gt;IFC)Sub = 00 Prot = 00 MxPS = 64 # Cfgs = 1P:Vendor = 05 E3 ProdID = 0716 Rev = 97.27s:Manufacturer = gene syss:Product = USB ReaderS:serial number = 0000000013 c:* # Ifs = 1 Cfg # = 1 Atr = 80 MX PWR = 500 mai:* If # = 0 Alt = 0 # EPs = 2 Cls = 08(stor。)Sub = 06 Prot = 50 Driver = USB-storageE:Ad = 81(I)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MSE:Ad = 02(O)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MST:Bus = 01 Lev = 02 Prnt = 03 Port = 03 Cnt = 03 Dev # = 6 Spd = 480 MxCh = 0D:Ver = 2.00 Cls = 00(& gt;IFC)Sub = 00 Prot = 00 MxPS = 64 # Cfgs = 1P:Vendor = 0 BDA ProdID = 8176 Rev = 2.00s:Manufacturer = RealtekS:Product = 802.11n WLAN适配器:serial number = 00 e04c 000001 c:* # Ifs = 1 Cfg # = 1 Atr = 80 MX PWR = 500 mai:* If # = 0 Alt = 0 # EPs = 4 Cls = ff(vend .)Sub = ff Prot = ff Driver = RTL 8192 cue:Ad = 81(I)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MSE:Ad = 02(O)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MSE:Ad = 03(O)Atr = 02(Bulk)MxPS = 512 Ivl = 0 MSE:Ad = 84(I)Atr = 03(Int。)MxPS= 64 Ivl=125us~ #看上面的信息可以知道,USB相关的设备有:Product=HIUSB EHCI #海思USB总线产品=USB Modem #互联网模块产品=USB 2.0 hub # usbhubproduct = dt 101g 2 #u盘产品= USB读卡器# usb读卡器产品=802.11n WLAN适配器# USB网卡。

(2)多属性匹配问题如果一个设备想要匹配它的多个属性,或者同一个属性,在不同的级别有不同的值,那么这个时候就需要使用GOTO函数。例如,要重命名设备中的USB设备,其命令如下:

内核= = & quotsd * & quot,KERNELS = = & quot*:0:0:1,ATTRS { scsi _ level } = = & quot0 & gt;,ATTRS { product } = = & quotUSB读卡器& quot,ATTRS { idVendor } = = & quot05e3 & quot,ATTRS { idProduct } = = & quot0716 & quot,SYMLINK+= & quot;usbsda % n & quot,OPTIONS = & quot忽略_删除& quot这涉及到多个属性的ATTRS值的匹配。此外,由于部分USB通过usbHUB,因此存在多个idVendor和idProduct,包括总线、集线器和USB设备。在这种情况下,它无法匹配设备。具体原因我找不到合理的解释,但是我有另外一个可用的解决方法,就是使用GOTO。只需将上面的命令改为下面的命令。

内核= = & quotsd * & quot,KERNELS = = & quot*:0:0:1,ATTRS { scsi _ level } = = & quot0 & gt;GOTO = & quothisi _ end & quotATTRS { product } = = & quotUSB读卡器& quot,ATTRS { idVendor } = = & quot05e3 & quot,ATTRS { idProduct } = = & quot0716 & quot,SYMLINK+= & quot;usbsda % n & quot,OPTIONS = & quot忽略_删除& quotLABEL = & quothisi _ end & quot(3)监控设备事件udev的一些匹配规则有时候很费解,我也没发现哪里有更详细的解释。网上介绍的太简单,实际应用还是有很多问题。例如,如果你想写一个卸载设备的命令,你可以使用下面的语句:

ACTION = = & quot删除& quot,KERNELS = = & quot*:0:0:1,ATTRS { idVendor } = = & quot05e3 & quot,ATTRS { idProduct } = = & quot0716 & quot,运行+= & quot;/bin/umount-l/opt/USB _ sd1 _ 1 & quot;但在实际使用中,它们并不匹配,ACTION = = & quot删除& quot,KERNELS = = & quot*:0:0:1和ATTRS { idVendor } = = & quot05e3 & quot,ATTRS { idProduct } = = & quot0716 & quot不能同时使用,如果直接改成:

ACTION = = & quot删除& quot,KERNELS = = & quot*:0:0:1,运行+= & quot;/bin/umount-l/opt/USB _ sd1 _ 1 & quot;命令功能可以实现,但是在设备冲突的情况下会出现。拔出设备时,内核= = " *:0:0:1 & quot;其他设备也会被卸载。

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

[10:00:33]内核[1555639338.737818]删除/设备/平台/hi USB-ehci . 0/USB 1/1-2/1-2.3(USB)[10:00:33]UDEV _ LOG = 3[10:00:33]操作=删除[10:00:33]dev path =/设备/平台/hiusb-ehci.0/usb1/1-2/1-2.3[1拉出来就有一个产品,是idVendor和idProduct值的组合,可以用来区分不同的设备。最终可以正常卸载设备的命令如下:

ACTION = = & quot删除& quot,子系统= = & quotusb & quot,ENV { PRODUCT } = = & quot5e3/716/9727&quot,运行+= & quot;/bin/umount-l/opt/USB _ sd1 _ 1 & quot;

未经允许不得转载:主机频道 » linux6.5 udev是什么意思?

评论 抢沙发

评论前必须登录!