udev
是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及热插拔的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载固件时Linux 2.6.13内核。udev的最新版本依赖于升级后的的uevent接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev参数来禁用udev并使用传统的/dev来进行设备读取。
基本信息
Udev:动态管理设备文件的方法
Linux中一切皆文件。
Udev管理设备文件。如,主机连接U盘出现新的文件(sdb),移除U盘,磁盘文件消失。
硬件文件的信息写入到了/sys目录下,这个目录与proc类似。
我们用udev可以为设备改名,或执行自定义操作。
在/etc/udev/rules.d目录下创建规则文件
接入新设备,如果满足规则,就会按管理员的规则应用
规则文件名:数字-名字.rules
规则文件中,管理员指定硬件满足或不满足哪些条件,就执行什么操作
- 实例:新碰盘接入时,创建一个捷链接的设备文件(相当于创建快捷方式)
1) 查看设备信息(先查看设备完整路径,再查看地完整信息)
[root@pc1 ~]# udevadm info --query=path --name=/dev/vdb //查看设备的完整路径信息,vdb为磁盘
/devices/pci0000:00/0000:00:0d.0/virtio8/block/vdb
[root@pc1 ~]# udevadm info --query=all --attribute-walk >path=/devices/pci0000:00/0000:00:0e.0/virtio9/block/vdc/vdc1 //两行是一起的,写不了这么长
...........
looking at device '/devices/pci0000:00/0000:00:0d.0/virtio8/block/vdb':
KERNEL=="vdb"
..........
looking at parent device '/devices/pci0000:00/0000:00:0d.0/virtio8':
KERNELS=="virtio8"
SUBSYSTEMS=="virtio"
DRIVERS=="virtio_blk" //如果里是U盘,一般会显示成DRIVERS=="usb-storage"
......
looking at parent device '/devices/pci0000:00/0000:00:0d.0':
KERNELS=="0000:00:0d.0"
SUBSYSTEMS=="pci"
DRIVERS=="virtio-pci" //找到一些有特征的信息,在自定义规则时作为检测条件使用
ATTRS{irq}=="10"
ATTRS{subsystem_vendor}=="0x1af4"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x010000"
ATTRS{driver_override}=="(null)"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="1"
ATTRS{device}=="0x1001"
ATTRS{enable}=="1"
ATTRS{msi_bus}==""
ATTRS{local_cpulist}=="0"
ATTRS{vendor}=="0x1af4"
ATTRS{subsystem_device}=="0x0002"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="0"
......
2) 创建规则
[root@pc1 rules.d]# cd /etc/udev/rules.d/ //设备链接规则存放目录
[root@pc1 rules.d]# ls
70-persistent-ipoib.rules
[root@pc1 rules.d]# cp 70-persistent-ipoib.rules 80-persistent-ipoib.rules
[root@pc1 rules.d]# vim 80-persistent-ipoib.rules //编写规则,删除全部,编写内容如下
ACTION=="add", KERNEL=="vd[a-z]*", DRIVERS=="virtio_blk",SYMLINK+="lcfvdb%n"
//将设备连到主机,ACTION(行为)就是add,KERNEL的意思是没有人为干预内核给它起的名。SYMLINIK是创建快捷方式,+=是额外增加。%n是分区号
[root@pc1 rules.d]# ls /dev/lcf*
ls: 无法访问/dev/lcf*: 没有那个文件或目录
//重启电脑后再查看一次
[root@pc1 ~]# ls /dev/lcf*
/dev/lcfvdb /dev/lcfvdb1 /dev/lcfvdb2
//这样就出来了
3) udevadm 工具简介
概要:
udevadm [--debug] [--version] [--help]
udevadm info options
udevadm trigger [options]
udevadm settle [options]
udevadm control command
udevadm monitor [options]
udevadm test [options] devpath
描述:
udevadm 后接一个命令和命令指定选项。它控制了udev运行的行为,处理内核事件,控制事件队列,并且提供简单的调试机制。
选项:
--debug 打印错误信息
--version 打印版本信息
--help 帮助文档
udevadm info options
查询udev数据库中的设备信息。也可以从sysfs文件系统中查询到设备的属性以辅助创建udev规则。
--query=type
从数据库中查询指定类型的设备。需要--path和--name来指定设备。合法的查询文件是:设备名,链接,路径,属性
--path=devpath
设备的路径
--name=file
设备节点或者链接
--attribute-walk
打印指定设备的所有sysfs记录的属性,以用来udev规则匹配特殊的设备。该选项打印链上的所有设备信息,最大可能到sys目录。
--device-id-of-file=file
打印主/从设备号
--export-db
输出udev数据库中的内容
--version
输出版本信息
--help
打印帮助文档
udevadm trigger [options]
接收内核发送来的设备事件。主要用于重放coldplug事件信息
(译者补充:内核在启动时已经检测到了系统的硬件设备,并把硬件设备信息通过sysfs内核虚拟文件系统导出。udev扫描sysfs文件系统,根据硬件设备信息生成热插拔(hotplug)事件,udev再读取这些事件,生成对应的硬件设备文件。由于没有实际的硬件插拔动作,所以这一过程被称为coldplug。)
--verbose 输出将要被触发的设备列表。
--dry-run 不真的触发事件
--type=type 触发一个特殊的设备。合法的类型:devices,subsystem,failed.默认是devices
--action=action
被触发的事件,默认是change
--subsystem-match=subsystem
触发匹配子系统的设备事件。这个选项可以被多次指定,并且支持shell模式匹配。
--attr-match=attribute=value
触发匹配sysfs属性的设备事件。如果属性值和属性一起指定,属性的值可以使用shell模式匹配。如果没有指定值,会重新确认现有属性。这个选项可以被多次指定。
--attr-nomatch=attribute=value
不要触发匹配属性的设备事件。如果可以使用模式匹配。也可以多次指定
--property-match=property=value
匹配属性吻合的设备。可以多次指定支持模式匹配
--tag-match=property
匹配标签吻合的设备。可以多次指定。
--sysname-match=name
匹配sys设备名相同的设备。可以多次指定支持模式匹配。
udevadm settle [options]
查看udev事件队列,如果所有事件全部处理完就退出。
--timeout=seconds
等待事件队列空的最大时间。默认是180秒。如果是0则立即退出。
--seq-start=seqnum
只等待到给定的顺序号。
--seq-end=seqnum
只等待到给定顺序号之前。
--exit-if-exists=file
如果文件存在就退出
--quiet
不输出任何信息
--help
输出帮助文档
udevadm monitor [options]
监听内核事件和udev发送的events事件。打印事件发出的设备。可以通过比较内核或者udev事件的时间戳来分析事件时序。
--kernel
输出内核事件
--udev
输出udev规则执行时的udev事件
--property
输出事件的属性
--subsystem-match=string
通过子系统或者设备类型过滤事件。只有匹配了子系统值的udev设备事件通过。
--tag-match=string
通过属性过滤事件,只有匹配了标签的udev事件通过。
--help
udevadm test [options] devpath
模拟一个udev事件,打印出debug信息。
--action=string
--subsystem=string
`--help