一、udev 是什么 小伙伴们,你们知道在 Linux 系统里,设备是怎么被管理的吗?其实有个叫 udev 的家伙在帮忙呢。 二、udev 规则文件的重要性 udev 的强大功能很大程度上依赖于其规则文件。udev 规则文件就像是给 udev 制定的操作手册,告诉 udev 当特定设备出现时该如何处理。 五、udev 规则文件的基本结构 udev 规则文件由一系列规则组成,每条规则由多个键值对构成,键值对之间用逗号分隔。 七、编写 udev 规则的步骤 编写 udev 规则并不是一件难事,按照以下步骤来做,就能轻松搞定。 1. 十、udev 规则文件核心内容 通过以上的介绍,相信大家对 udev 规则文件有了更深入的了解。
二、行为准则与自动化脚本 —— udev 规则库 如果 udevd 是大脑和心脏,那么 udev 规则(Rules) 就是它赖以思考和行动的“行为准则”和“剧本”。 udevadm 就是 udev 的“瑞士军刀”,它是一个强大的命令行工具,用于管理、监控和调试udev。 2. udevadm monitor:实时监控udev事件。 它可以让你像看直播一样,看到内核发出的 uevent 和 udev 处理后的信息。 -udev 在你插入一个设备时运行它,你可以清晰地看到整个事件流,对于理解udev的工作流程和调试问题非常有帮助。 工作线程拿着这些属性,去规则库(/etc/udev/rules.d/ 和 /lib/udev/rules.d/)里逐条比对。
这一节接着上一节的openfiler配置,说如何利用udev来绑定路径 以下所有操作都需在两节点都操作 ---- 安装iSCSI (Initiator) Service 两节点相同 查看包有没安装 如果没有请安装 ]# iscsiadm -m node -T iqn.openfiler:crs1 -p 10.65.204.219 --login[root@rac1 udev]# iscsiadm -m node -p 10.65.204.219 --login[root@rac1 udev]# iscsiadm -m node -T iqn.openfiler:crs4 -p 10.65.204.219 -- login[root@rac1 udev]# iscsiadm -m node -T iqn.openfiler:crs5 -p 10.65.204.219 --login[root@rac1 udev /sbin/start_udev 绑定完成后如图: ?
*udev; struct udev_enumerate *enumerate; struct udev_list_entry *devices, *entry; // 创建 udev上下文 udev = udev_new(); if (! = -1; goto err_udev_new; } // 创建udev枚举器 enumerate = udev_enumerate_new(udev); ); struct udev_device *device = udev_device_new_from_syspath(udev, syspath); if (! (enumerate); err_udev_enumerate_new: udev_unref(udev); err_udev_new: return ret; } #ifdef HAVE_DEBUG_SCAN_OTHERS_TYPE
udev配置文件 主要的udev配置文件是/etc/udev/udev.conf。 这个文件通常很短,他可能只是包含几行#开头的注释,然后有几行选项: udev_root="/dev/" udev_rules="/etc/udev/rules.d/" udev_log="err 问:udev的配置文件放在哪里? 答:udev是一个用户模式程序。它的配置文件是/etc/udev/udev.conf。 udev_rules=”/etc/udev/rules.d” ;用于指导udev工作的规则所在目录。 Udev (简体中文) 注意: 如果您是从DevFS升级到Udev, 请查看 DevFS to Udev. 这篇文档将介绍udev的一些新的变化。
udev:用户空间 “独立”,改规则不用动内核 udev 是用户空间的服务程序(udevd),完全运行在 kernel 之外。 udev:规则文件直观,上手简单 udev 的配置放在/etc/udev/rules.d/目录下,后缀为.rules的文件(比如99-usb-serial.rules),规则语法像 “说话” 一样直白, udev:多线程并发,多设备插满也不怕 udev 用netlink(内核与用户空间的高速通信通道)接收热插拔事件,并且是 “多线程处理”—— 同时插 10 个设备,udev 会开 10 个线程分别处理, 而且 udev 会主动 “清理僵尸文件”:设备拔了之后,udev 会立刻删除对应的/dev文件,不会留垃圾,不用手动干预。 devfs 热插拔 “单线程易出错”,udev “多线程稳如狗”。 udev:扩展性强,能联动挂载、通知、日志 udev 能做的远不止管/dev,它可以联动各种工具,实现 “一站式设备管理”: 自动挂载:U 盘插入后,udev 触发mount命令,自动挂载到/media
udev rules Unit Sections What is udev? 使用udev有什么好处: 动态管理:udev的守护进程监听来自内核的uevent(device event),在进行添加/删除device的操作时,udev也通过接收到的uevent来判断删除 udev是如何实现的: ? 2. kernel将发送uevent给udev 3. udev接收到uevent之后,查找/etc/udev/rules.d/下面的规则文件,查找到所匹配的规则,然后根据规则创建一个新的device node Writing Custom udev Rules 编写udev rule在/etc/udev/rules.d/下面添加rule file,当kernel识别到device的时候,将在这里
udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。 udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。 3. udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。 在mdev和udev共存的系统中,需要建立规则,避免mdev和udev重复执行。
一、UDEV是什么? Udev是一个针对Linux内核2.6的可提供自动创建的设备节点和命名的解决方法的一个文件系统;其实与/etc/目录下的fstab文件类似 二、Udev如何获取内核这些模块的变化信息? 新的Linux内核使用udev代替了hotplug作为热拔插管理,虽然有udevd管理热拔插,但有时候我们还是需要在应用程序中检测热拔插事件以便快速地处理,比如在读写SD卡的时候拔下SD卡,那么需要立即检测出该情况 Netlink是面向数据包的服务,为内核与用户层搭建了一个高速通道,是udev实现的基础。
由于udev根据系统中硬件设备的状态动态更新设备文件、进行设备文件的创建和删除等,因此,在使用udev后,在/dev目录下就只包含系统中真正存在的设备了。 devfs与udev的另一个显著区别在于:采用devfs,当一个并不存在的/dev节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。 这是因为udev的设计者认为Linux应该在设备被发现的时候加载驱动模块,而不是当它被访问的时候。 udev的设计者认为devfs所提供的打开/dev节点时自动加载驱动的功能对于一个配置正确的计算机是多余的。 系统中所有的设备都应该产生热插拔事件并加载恰当的驱动,而udev能注意到这点并且为它创建对应的设备节点。
/etc/udev/udev.conf $ cat /etc/udev/udev.conf # Ubuntu # see udev.conf(5) for details # # udevd is (不建议修改) udev_db:udev 信息存放的数据库或者所在目录,默认值是 /dev/.udev.tdb。 udev_rules:udev 规则文件的名字或者所在目录,默认值是 /etc/udev/rules.d/。 规则实例 描述:udev 配置文件是 /etc/udev/udev.conf 该文件内容中有指定udev规则存储目录形如 udev_rules="/etc/udev/rules.d" 该指定的目录中存储一系列以 /dm-0 /etc/udev/udev.conf 描述:该文件为udev主配置文件一般不用进行更改,如需更改请参考udev(5) # 主配置文件:/etc/udev/udev.conf - udev_root
--------------------------------------------------- [root@xxdb01 ~]# 实际上直接使用这些盘也是可以的,但是考虑到规范,参考之前客户udev 不过因为上面这个udev语法是RHEL 6的,在CentOS 7并不适用,换成7对应的语法就是: --ok! done 执行脚本:sh /u01/asmdisk.sh ,结果为: --script-result KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev SYMLINK+="asm-5g-xxxx-grid1",OWNER="grid",GROUP="asmadmin",MODE="0660" 使用带列编辑的文本编辑器快速修改如下,然后复制到/etc/udev 000f-data1",OWNER="grid",GROUP="asmadmin",MODE="0660" KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev
使用下面的命令来获取当前系统中多路径设备的wwid for i in `cat /proc/partitions | awk {'print $4'} |grep sd`; do echo "### $i: `/lib/udev #使用udev来管理raw,编辑raw文件,如下 suse11a:~ # cat /etc/raw | grep -v \# raw1:mapper/mpatha raw2:mapper/mpathb 该权限用于oracle用户访问裸设备 # Author : Leshami # Blog : http://blog.csdn.net/leshami suse11a:~ # more /etc/udev
本例使用udev的方式,将磁盘按照osd[N]的方式进行命名,比如/dev/osd5_filestore_1表示osd5的第一个filestore分区,/dev/osd5_journal_5表示osd5 选取设备的标识码,示例中用的是DEVPATH(DEVPATH= /devices/pci0000:00/0000:00:0d.0/ata6/host5/target) 编写udev rules规则文件 root@demo:~# cat /etc/udev/rules.d/20-persistent-disk.rules KERNEL=="sd?" target5:0:0/5:0:0:0*", SYMLINK+="osd5_journal_%n" LABEL="END_20_PERSISTENT_DISK" 执行以下命令向内核发送event事件,触发udev
说明: 其中/dev/mapper/mpathn 是软件虚拟出来的多路径设备,可以被我们用来挂载使用 /dev/dm-n 这个是软件自身使用的,不能被软件以外使用,不可挂载,但是rac是使用这个配置UDEV 六、UDEV绑定 不用分区! 规则文件 cd /etc/udev/rules.d touch 99-oracle-asmdevices.rules --配置方式1(见下方截图): KERNEL=="dm-*",ENV{DM_UUID 不太明白已经聚合链路为什么还用sd*,留个坑): KERNEL=="sd*", ENV{DEVTYPE}=="disk", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev $major $minor; chown grid:asmdba /dev/asm-arch002; chmod 0660 /dev/asm-arch002'" --【非生产操作】配置完成,重启UDEV
说明: 其中/dev/mapper/mpathn 是软件虚拟出来的多路径设备,可以被我们用来挂载使用 /dev/dm-n 这个是软件自身使用的,不能被软件以外使用,不可挂载,但是rac是使用这个配置UDEV 六、UDEV绑定 不用分区! 规则文件 cd /etc/udev/rules.d touch 99-oracle-asmdevices.rules --配置方式1(见下方截图): KERNEL=="dm-*",ENV{DM_UUID 不太明白已经聚合链路为什么还用sd*,留个坑): KERNEL=="sd*", ENV{DEVTYPE}=="disk", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev $major $minor; chown grid:asmdba /dev/asm-arch002; chmod 0660 /dev/asm-arch002'" --【非生产操作】配置完成,重启UDEV
mdev vs udev:嵌入式与桌面Linux的设备管理对比 核心概念速览 特征 mdev (Mini-udev) udev (Userspace Device) 定位 嵌入式系统的轻量级解决方案 、硬件数据库、热插拔管理 │ └─────────────────────────────────────────────┘ 特点:守护进程、异步处理、功能丰富 详细对比表格 对比维度 mdev udev ", MODE="0660" 复杂动作迁移: # mdev: 执行脚本 ttyACM[0-9]* 0:0 660 @/usr/local/bin/gps_setup.sh # udev: 多种实现方式 桌面开发:直接使用udev,利用其丰富生态 容器环境:考虑更轻量的替代方案(如devtmpfs) 学习路径:先理解mdev原理,再学习udev高级特性 快速记忆口诀 “小快灵,大而全” mdev :小型系统、快速启动、灵活简单 udev:大型系统、而且强大、全面功能 无论选择哪个,理解Linux设备模型(sysfs、devtmpfs、uevent)才是掌握设备管理的关键!
步骤 4:用户空间访问(比如 udev 识别) udev(用户空间设备管理工具)监控 sysfs 的变化,发现新创建的/sys/class/input/mouse0; udev读取mouse0目录下的属性文件 (厂商 ID、产品 ID),确认是 “罗技 USB 鼠标”; udev在/dev/下创建设备文件/dev/input/mouse0,并设置权限 —— 用户此时就能用cat /dev/input/mouse0 为上层工具提供 “基础”:udev、lm-sensors(硬件监控工具)、powertop(功耗分析工具)等,都是通过读取 sysfs 获取硬件信息的 —— 没有 sysfs,这些工具都没法工作。 总线匹配→绑定驱动 │ ├── 3. sysfs创建目录/属性文件 │ └── 4. udev识别→创建/dev设备文件 └── 实际应用 ├── 查信息:MAC地址、CPU频率、USB
msg) 1459 { 1460 int status; 1461 1462 usb_pm_lock(udev); 1463 udev->auto_pm = 0; 1464 status suspend method for @udev itself. ) 1038 goto done; 1039 1040 udev->do_remote_wakeup = device_may_wakeup(&udev->dev); 1041 1042 if (udev->auto_pm) { 1043 status = autosuspend_check(udev); 1044 if (status < 0) 1045 goto done; 1046 } 1047 1048 /* Suspend all the interfaces and then udev itself */ 1049 if (udev->actconfig) {
: if udev.action == 'add': print('Device added: %s' % udev) if udev.action == 'add': if udev.device_node not in devices: print "Device added: %s" % udev try: devices[udev.device_node] = evdev.InputDevice (udev.device_node) except IOError, e: # udev reports MORE devices than if udev.device_node in devices: print "Device removed (udev): %s" % devices[udev.device_node