linux udev原理分析

合集下载

Linux设备驱动程序原理及框架-内核模块入门篇

Linux设备驱动程序原理及框架-内核模块入门篇

Linux设备驱动程序原理及框架-内核模块入门篇内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块内核模块介绍Linux采用的是整体式的内核结构,这种结构采用的是整体式的内核结构,采用的是整体式的内核结构的内核一般不能动态的增加新的功能。

为此,的内核一般不能动态的增加新的功能。

为此,Linux提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。

利用这个机制“模块”(module)。

利用这个机制,可以)。

利用这个机制,根据需要,根据需要,在不必对内核重新编译链接的条件将可安装模块动态的插入运行中的内核,下,将可安装模块动态的插入运行中的内核,成为内核的一个有机组成部分;成为内核的一个有机组成部分;或者从内核移走已经安装的模块。

正是这种机制,走已经安装的模块。

正是这种机制,使得内核的内存映像保持最小,的内存映像保持最小,但却具有很大的灵活性和可扩充性。

和可扩充性。

内核模块内核模块介绍可安装模块是可以在系统运行时动态地安装和卸载的内核软件。

严格来说,卸载的内核软件。

严格来说,这种软件的作用并不限于设备驱动,并不限于设备驱动,例如有些文件系统就是以可安装模块的形式实现的。

但是,另一方面,可安装模块的形式实现的。

但是,另一方面,它主要用来实现设备驱动程序或者与设备驱动密切相关的部分(如文件系统等)。

密切相关的部分(如文件系统等)。

课程内容内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块应用层加载模块操作过程内核引导的过程中,会识别出所有已经安装的硬件设备,内核引导的过程中,会识别出所有已经安装的硬件设备,并且创建好该系统中的硬件设备的列表树:文件系统。

且创建好该系统中的硬件设备的列表树:/sys 文件系统。

(udev 服务就是通过读取该文件系统内容来创建必要的设备文件的。

)。

linux udev 磁盘盘符 uuid规则

linux udev 磁盘盘符 uuid规则

linux udev 磁盘盘符uuid规则Linux操作系统中的udev是一个用于自动设备管理的子系统。

在Linux 中,磁盘是通过盘符来识别和访问的,而uuid是一个用于唯一标识磁盘的字符串。

本文将逐步介绍Linux udev子系统中如何设置磁盘盘符和uuid规则。

1. udev简介udev(User Device)是Linux操作系统中的一个设备管理子系统,它负责自动检测和识别系统中所有的硬件设备。

udev可以根据设备的属性和规则,动态地创建设备文件,以便用户和应用程序可以方便地访问和使用硬件设备。

在本文中,我们将重点关注udev在磁盘设备管理方面的应用。

2. 磁盘盘符在Linux系统中,磁盘设备的访问和识别是通过盘符来实现的。

常见的磁盘盘符包括/dev/sda、/dev/sdb等。

通常,系统会按照插入顺序给磁盘分配盘符。

例如,第一个插入的磁盘设备可能被分配为/dev/sda,第二个插入的磁盘设备可能被分配为/dev/sdb,以此类推。

然而,磁盘设备的插拔、固件更新等操作会导致磁盘设备的盘符发生变化,这给使用者和应用程序带来了不便。

因此,我们可以使用udev规则来设置磁盘设备的盘符,以便在设备插拔或固件更新后保持一致。

3. uuid规则实际上,使用磁盘的盘符来识别和访问设备有一定的局限性。

当磁盘设备的插拔或者系统重启时,盘符可能会发生变化,从而导致出现错误。

这给系统管理员和应用程序带来了一些麻烦。

为了解决这个问题,Linux系统引入了uuid(Universally Unique Identifier)的概念,用于唯一标识磁盘设备。

uuid是一个字符串,通常由一串字符和数字组成,它的长度为32个字符。

uuid是在磁盘分区时自动生成的,并且在设备插拔和系统重启后保持不变。

通过使用uuid作为磁盘设备的唯一标识,我们可以避免使用盘符来识别设备的局限性,以及磁盘插拔和系统重启时的错误。

4. 设置磁盘盘符和uuid规则为了设置磁盘设备的盘符和uuid规则,我们需要编辑udev的规则文件。

(转载)linux中设备文件配置程序udev详解

(转载)linux中设备文件配置程序udev详解

(转载)linux中设备⽂件配置程序udev详解如果你使⽤Linux⽐较长时间了,那你就知道,在对待设备⽂件这块,Linux改变了⼏次策略。

在Linux早期,设备⽂件仅仅是是⼀些带有适当的属性集的普通⽂件,它由mknod命令创建,⽂件存放在/dev⽬录下。

后来,采⽤了devfs, ⼀个基于内核的动态设备⽂件系统,他⾸次出现在2.3.46内核中。

Mandrake,Gentoo等Linux分发版本采⽤了这种⽅式。

devfs创建的设备⽂件是动态的。

但是devfs有⼀些严重的限制,从2.6.13版本后移⾛了。

⽬前取代他的便是⽂本要提到的udev--⼀个⽤户空间程序。

⽬前很多的Linux分发版本采纳了udev的⽅式,因为它在Linux设备访问,特别是那些对设备有极端需求的站点(⽐如需要控制上千个硬盘)和热插拔设备(⽐如USB摄像头和MP3播放器)上解决了⼏个问题。

下⾯我我们来看看如何管理udev设备。

实际上,对于那些为磁盘,终端设备等准备的标准配置⽂件⽽⾔,你不需要修改什么。

但是,你需要了解udev配置来使⽤新的或者外来设备,如果不修改配置,这些设备可能⽆法访问,或者说Linux可能会采⽤不恰当的名字,属组或权限来创建这些设备⽂件。

你可能也想知道如何修改RS-232串⼝,⾳频设备等⽂件的属组或者权限。

这点在实际的Linux实施中是会遇到的。

为什么使⽤udev在此之前的设备⽂件管理⽅法(静态⽂件和devfs)有⼏个缺点:*不确定的设备映射。

特别是那些动态设备,⽐如USB设备,设备⽂件到实际设备的映射并不可靠和确定。

举⼀个例⼦:如果你有两个USB 打印机。

⼀个可能称为/dev/usb/lp0,另外⼀个便是/dev/usb/lp1。

但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有⼀⼀对应的关系,因为他可能因为发现设备的顺序,打印机本⾝关闭等原因⽽导致这种映射并不确定。

理想的⽅式应该是:两个打印机应该采⽤基于他们的序列号或者其他标识信息的唯⼀设备⽂件来映射。

udev规则生效

udev规则生效

udev规则生效什么是udev规则?udev是Linux系统中的一个设备管理机制,它负责在设备插入或移除时自动创建或删除设备节点。

udev规则是一组用于定义如何处理设备事件的规则,可以根据设备的属性、类型、ID等信息来触发特定的操作。

udev规则通常用于识别和配置硬件设备,如USB驱动器、网卡、打印机等。

通过编写自定义的udev规则,可以实现自动挂载USB设备、设置网络接口、加载特定驱动程序等功能。

编写udev规则要编写一个udev规则,需要以下几个步骤:1. 确定需要匹配的设备属性首先,需要确定要匹配的设备属性。

可以使用lsusb、lspci等命令查看设备信息,并确定需要使用哪些属性来识别设备。

例如,我们想编写一个规则来识别一个特定厂商ID和产品ID的USB存储设备。

通过运行lsusb命令,我们可以找到这些属性:Bus 001 Device 003: ID 0781:5583 SanDisk Corp.这里的厂商ID是0781,产品ID是5583。

2. 创建udev规则文件在Linux系统中,udev规则文件通常存储在/etc/udev/rules.d/目录下。

可以创建一个新的规则文件,以.rules为后缀,并命名为适当的名称。

例如,我们创建一个名为99-usb-storage.rules的文件来匹配USB存储设备。

sudo touch /etc/udev/rules.d/99-usb-storage.rules3. 编写udev规则打开刚创建的规则文件,并使用文本编辑器编写规则。

每条规则由以下几个部分组成:•规则匹配条件:使用属性来匹配设备。

•规则动作:定义在匹配条件满足时要执行的操作。

对于USB存储设备,我们可以编写如下规则:ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0781", ATTRS{idProduct}==" 5583", RUN+="/path/to/script.sh"这个规则包含以下几个部分:•ACTION=="add":指定当设备插入时触发该规则。

Linux设备模型浅析之uevent篇

Linux设备模型浅析之uevent篇
}
/* 在本例中是 devices_kset 容器,详细介绍可参照《Linux 设备模型浅析之设备篇》,后 面将列出 devices_kset 的定义 */ kset = top_kobj->kset; uevent_ops = kset->uevent_ops; // 本例中 uevent_ops = &device_uevent_ops
struct sk_buff *skb; size_t len;
/* allocate message with the maximum possible size */ len = strlen(action_string) + strlen(devpath) + 2; skb = alloc_skb(len + env->buflen, GFP_KERNEL); if (skb) {
return 0; }
// 获得用于存放环境变量的 buffer /* environment buffer */ env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL); if (!env)
return -ENOMEM;
/* 获取该 kobj 在 sysfs 的路径,通过遍历其父 kobj 来获得,本例是/sys/devices/platform/ s3c2410-rtc/rtc/rtc0 */ /* complete object path */
goto exit;
/* 如果配置了网络,那么就会通过 netlink socket 向用户空间发送环境标量,而用户空间 则通过 netlink socket 接收,然后采取一些列的动作。这种机制目前用在 udev 中,也就是 pc 机系统中,后面会分析*/ #if defined(CONFIG_NET) /* send netlink message */ /* 如果配置了 net,则会在 kobject_uevent_init()例程中将全局比昂俩 uevent_sock 初试化 为 NETLINK_KOBJECT_UEVENT 类型的 socket。*/ if (uevent_sock) {

linux设备驱动(27)usb驱动-热插拔详解

linux设备驱动(27)usb驱动-热插拔详解

linux设备驱动(27)usb驱动-热插拔详解1 热插拔的基本概念1.1 usb热插拔的硬件原理在USB集线器(hub)的每个下游端⼝的D+和D-上,分别接了⼀个15K欧姆的下拉电阻到地。

这样,在集线器的端⼝悬空时,就被这两个下拉电阻拉到了低电平。

⽽在USB设备端,在D+或者D-上接了1.5K欧姆上拉电阻。

对于全速和⾼速设备,上拉电阻是接在D+上;⽽低速设备则是上拉电阻接在D-上。

这样,当设备插⼊到集线器时,由1.5K的上拉电阻和15K的下拉电阻分压,结果就将差分数据线中的⼀条拉⾼了。

集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上⼀层的集线器报告给USB主控制器),这样就检测到设备的插⼊了。

USB⾼速设备先是被识别为全速设备,然后通过HOST和DEVICE两者之间的确认,再切换到⾼速模式的。

在⾼速模式下,是电流传输模式,这时将D+上的上拉电阻断开。

1.2 热插拔的概念热插拔(hot-plugging或Hot Swap)即带电插拔,热插拔功能就是允许⽤户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,从⽽提⾼了系统对灾难的及时恢复能⼒、扩展性和灵活性等,例如⼀些⾯向⾼端应⽤的磁盘镜像系统都可以提供磁盘的热插拔功能。

具体⽤学术的说法就是:热替换(Hot replacement)、热添加(hot expansion)和热升级(hot upgrade)1.3 热插拔的优点在系统开机情况下将损坏的模块移除,还可以在开机情况下做更新或扩容⽽不影响系统操作。

由于热插拔零件的可靠度提升,还可以将它们⽤做断电器,⽽且因为热插拔能够⾃动恢复,有很多热插拔芯⽚为系统提供线路供电情况的信号,以便系统做故障分析,因此减少了成本。

2 热插拔的实现2.1 Linux下USB HUB的驱动的实现和分析:在系统初始化的时候在usb_init函数中调⽤usb_hub_init函数,就进⼊了hub的初始化。

Udev实现U盘或SD卡的自动挂载

Udev实现U盘或SD卡的自动挂载linux传统上使用静态设备创建的方法,在dev下创建了大量的节点,而不管这些节点相应的硬件设备是否存在。

采用udev的方法,系统检测到设备才会去创建这些设备对应的节点。

这里我们简单的说一下udev的工作原理:udev是依赖于sysfs的,当系统中添加一个新的设备后,内核检测到后就会产生一个hotplug event并查找/proc/sys/kernel/hotplug去找出管理设备连接的用户空间程序,若udev已经启动,内核会通知udev去检测sysfs中关于这个新设备的信息并创建设备节点。

如/dev/vcs,在/sys/class/tty/vcs/dev存放的是”7:0”,既/dev/vcs的主次设备号。

并且udev还会根据/etc/udev/rules.d中的规则文件实现一些相应的功能。

下面我们介绍一下如何实现设备节点的自动创建及u盘或sd卡的自动挂载。

一、.udev的移植因为文件系统中默认是没有对udev进行支持的,所以我们移植一个udev。

1.下载udev源码udev-080.tar.bz2,并解压网址:/pub/linux/utils/kernel/hotplug</P< p>2.交叉编译。

修改makefile,具体修改如下:cross = arm-softfloat-linux-gnu-保存退出。

执行命令:make 进行编译,然后执行arm-softfloat-linux-gnu-strip udev udevd udevstart udevinfo udevtest。

并拷贝这些文件到rootfs/bin目录下面3.添加udev的支持下面三种方法功能相同(1)并修改etc/init.d/rcs脚本,然后添加如下命令:/bin/mount -t sysfs sysfs /sys(首先创建这个目录)/bin/mount -t tmpfs tmpfs /dev/bin/udevd --daemon/bin/udevstart(2)如果linuxrc是二进制文件的话rm /linuxrcvi /linuxrc添加如下内容/bin/mount -t sysfs sysfs /sys(首先创建这个目录)/bin/mount -t tmpfs tmpfs /dev/bin/udevd --daemon/bin/udevstartexec /sbin/init(3)修改/etc/fstab为#device mount-point type options dump fsck orderproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev tmpfs defaults 0 0修改/etc/init.d/rcs,添加如下内容/bin/udevd --daemon/bin/udevstart有这上面写些,重新启动系统后,我们的文件系统就有了自动创建节点的功能了。

Linux设备模型 热插拔、mdev 与 firmware

Linux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与firmware)热插拔有2 个不同角度来看待热插拔:从内核角度看,热插拔是在硬件、内核和内核驱动之间的交互。

从用户角度看,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev 和mdev)的交互。

当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。

现在的计算机系统,要求Linux 内核能够在硬件从系统中增删时,可靠稳定地运行。

这就对设备驱动作者增加了压力,因为在他们必须处理一个毫无征兆地突然出现或消失的设备。

热插拔工具当用户向系统添加或删除设备时,内核会产生一个热插拔事件,并在/proc/sys/kernel/hotplug文件里查找处理设备连接的用户空间程序。

这个用户空间程序主要有hotplug:这个程序是一个典型的bash 脚本,只传递执行权给一系列位于/etc/hot-plug.d/ 目录树的程序。

hotplug 脚本搜索所有的有 .hotplug 后缀的可能对这个事件进行处理的程序并调用它们, 并传递给它们许多不同的已经被内核设置的环境变量。

(基本已被淘汰,具体内容请参阅《LDD3》)udev :用于linux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。

它通过在sysfs 的/class/ 和/block/ 目录树中查找一个称为dev 的文件,以确定所创建的设备节点文件的主次设备号。

所以要使用udev,驱动必须为设备在sysfs中创建类接口及其dev属性文件,方法和sculld模块中创建dev属性相同。

udev的资料网上十分丰富,我就不在这废话了,给出以下链接有兴趣的自己研究:mdev:一个简化版的udev,是busybox所带的程序,十分适合嵌入式系统。

因为hotplug现在也在被慢慢地淘汰,udev不再依赖hotplug了,所以这里不再介绍;udev较mdev复杂,不太适合嵌入式使用。

Linux设备模型 热插拔mdev 与 firmware

Linux设备模型热插拔、mdev 与 firmwareLinux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与 firmware)热插拔有 2 个不同角度来看待热插拔:从内核角度看,热插拔是在硬件、内核和内核驱动之间的交互。

从用户角度看,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev 和 mdev)的交互。

当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。

现在的计算机系统,要求 Linux 内核能够在硬件从系统中增删时,可靠稳定地运行。

这就对设备驱动作者增加了压力,因为在他们必须处理一个毫无征兆地突然出现或消失的设备。

热插拔工具当用户向系统添加或删除设备时,内核会产生一个热插拔事件,并在/proc/sys/kernel/hotplug 文件里查找处理设备连接的用户空间程序。

这个用户空间程序主要有hotplug:这个程序是一个典型的 bash 脚本,只传递执行权给一系列位于 /etc/hot-plug.d/ 目录树的程序。

hotplug 脚本搜索所有的有 .hotplug 后缀的可能对这个事件进行处理的程序并调用它们, 并传递给它们许多不同的已经被内核设置的环境变量。

(基本已被淘汰,具体内容请参阅《LDD3》)udev :用于linux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。

它通过在 sysfs 的 /class/ 和/block/ 目录树中查找一个称为 dev 的文件,以确定所创建的设备节点文件的主次设备号。

所以要使用udev,驱动必须为设备在sysfs中创建类接口及其dev属性文件,方法和sculld模块中创建dev属性相同。

udev的资料网上十分丰富,我就不在这废话了,给出以下链接有兴趣的自己研究:《UDEV Primer》(英文),地址:/decibelshelp/LinuxHelp_UDEVPrimer.html 《udev规则编写》(luofuchong翻译),地址:/luofuchong/archive/2021/12/18/37831.html 《什么是udev》地址:/steganography/archive/2021/04/10/657620.aspx《udev-FAQ 中文翻译》地址:/3225765.html 《udev轻松上路》地址:/user1/3313/archives/2021/1635169.shtml 《Udev (简体中文)》地址:/index.php/Udev_(????????-???) Udev官方主页:/pub/linux/utils/kernel/hotplug/udev.html 下载地址:/pub/linux/utils/kernel/hotplug/ 在《LFS》中也有介绍udev的使用,很值得参考!下载地址:/lfs/downloads/stable/mdev:一个简化版的udev,是busybox所带的程序,十分适合嵌入式系统。

android系统vold透析

android系统vold分析USB Storage1. Vold 简介1.1 udev的由来udev 是Linux2.6 内核里的一个功能,它替代了原来的devfs,成为当前Linux 预设的设备管理工具。

udev 以守护进程的形式运行,通过侦听内核发出来的uevent 来管理/dev目录下的设备文件。

不像之前的设备管理工具,udev 在用户空间(user space) 运行,而不在内核空间(kernel space) 运行。

devfs 存在的主要的问题是它处理设备检测、创建和命名的方式,其中设备节点的命名可能是最严重的问题。

一般可接受的方式是,如果设备名是可配置的,那么设备命名策略应该由系统管理员决定,而不是由某些开发者强制规定。

devfs 文件系统还存在竞争条件(race conditions) 的问题,这是它天生的设计缺陷,不对内核做彻底的修改就无法修正这个问题。

所以udef应运而生。

udev能够实现所有devfs实现的功能。

具有以下优点:1)dynamic replacement for /dev。

作为devfs的替代者,传统的devfs不能动态分配major和minor的值,而major和minor非常有限,很快就会用完了。

udev能够像DHCP动态分配IP地址一样去动态分配major和minor。

2)device naming。

提供设备命名持久化的机制。

传统设备命名方式不具直观性,像/dev/hda1这样的名字肯定没有boot_disk这样的名字直观。

udev能够像DNS解析域名一样去给设备指定一个有意义的名称。

3)API to access info about current system devices 。

提供了一组易用的API去操作sysfs,避免重复实现同样的代码,但udev运行在用户模式中,而devfs运行在内核中。

udev只支持linux-2.6内核,因为udev严重依赖于sysfs文件系统提供的信息,而sysfs文件系统只在linux-2.6内核中才有。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一.udev简介在linux系统中,/dev目录用来保存设备文件的.每个文件指向一个系统设备.用户的程序可以通过使用这些设备文件,对真实的硬件的设备进行操作.如: hda是第1个IDE硬盘,sda是第1个SCSI硬盘.在2.4内核时代,在/dev下保存了所有kernel可以支持的硬件设备的设备文件,将近有1万个.而这些设备中,大多数是没有连接的设备.这样就大大的浪费了系统资源,而且/dev目录也显得非常混乱.udev就是用了解决这些问题的.在2.6内核中,采用udev方式来管理/dev目录.它可以动态的建立/删除设备文件(设备连接到系统时,它会自动建立相应的设备文件,设备断开连接后,它会自动删除相应的设备文件).这样使/dev目录简化了许多.而且,udev还可以允许用户编写命名规则,为不同设备指定设备文件名.这样,对设备的管理也方便了许多.例如:你有2个U盘,1个容量是1G的,1个容量是2G的.一般情况下,你先接上的U盘会是sdb,后接上的U盘会是sdc.这样对使用很不方便.每次U盘的设备名可能不一样.但通过udev命名规则,你可以自己指定的设备命名,可以将1G的U盘命名为1g,将2G的U盘命名为2g.设备名不会再变化.使用和管理都会很方便.二.udev安装1.Turbolinux发行版在Turbolinux 10,10.5和11等版本中,都已集成了udev包.你也可以手动安装udev的rpm包.# rpm -ivh udev-<版本号>.rpm2.从源码包安装你可以从官方网站下载源码包:/pub/linux/utils/kernel/hotplug/udev.html 我们下载0.39版的udev.然后进行安装:#tar jxf udev-039.tar.bz2# cd udev-039# make# make install三.udev命名规则1.查看硬件信息当你将一个硬件连接到系统时,会在/sys下生成这个设备的相应信息.U盘信息会保存在/sys/block下,USB打印机则会保存在/sys/class/usb下.使用udevinf o命令可以查看硬件的相关信息.# udevinfo -a -p /sys/block/sda/sda1looking at class device '/sys/block/sda/sda1':SYSFS{dev}="8:1"SYSFS{size}="2045147"SYSFS{start}="61"SYSFS{stat}=" 0 0 0 0"follow the class device's "device"looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6:1.0/host2/target2: 0:0/2:0:0:0':BUS="scsi"ID="2:0:0:0"SYSFS{detach_state}="0"SYSFS{device_blocked}="0"SYSFS{max_sectors}="240"SYSFS{model}="Flash Disk "SYSFS{queue_depth}="1"SYSFS{rev}="4.00"SYSFS{scsi_level}="3"SYSFS{state}="running"SYSFS{timeout}="30"SYSFS{type}="0"SYSFS{vendor}=" "输出信息包括硬件的产品类型,厂商信息,序列号等,依据这些信息,你就可以编写命名规则了.2.命名规则udev的命名规则保存在/etc/udev/rules.d中,脚本按照文件的编号顺序,由小到大执行.当规则匹配时,将不再继续向下执行.下面以Turbolinux 10为例,编写一个U盘命名规则.# vi /etc/udev/rules.d/05-users.rules根据硬件的序列号(serial)编写规则.在文件中添加下面内容:BUS="usb", SYSFS{serial}="033446747503", KERNEL="sd?1", NAME="bruce-%k", SYMLINK="bruce3-%n"BUS 表示设备使用的总线.SYSFS 表示指定硬件信息中,我们需要使用的哪一项值,这里我们使用U盘的序列号作为识别.KERNEL 表示内核对这个设备进行的命名.内核对U盘的命名为sd a1,sdb1…,所以这里我们使用”sd?1”.NAME 设备名,即我们要改变的设备名称.我们使用bruce-%k.%k代表内核对这个设备的命名.SYMLINK 表示建立一个连接,连接到这个设备上.这个连接的名称是”bruce3-%n”.%n代表kernel号,即设备名后面的数字.现在将U盘拔出,然后再重新连接到计算机上.# ls /dev/sd* -hlbrw-rw---- 1 root disk 8, 0 Aug 17 20:11 /dev/sda# ls /dev/bruce* -hllrwxrwxrwx 1 root root 10 Aug 17 20:11 /dev/bruce3-1 -> bruce-sda1 brw------- 1 root root 8, 1 Aug 17 20:11 /dev/bruce-sda1可以看到,U盘设备名变成了bruce-sda1,并且有一个bruce3-1的连接指向它.四.udev工作原理当系统添加设备时,/sys目录下会生成设备的相应信息.udev就是通过读取/sys下的信息来识别硬件设备的.udev有3部分组成: namedev,libsysfs,udevnamedev 负责解析/etc/udev/rules.d中的命名规则,遇到匹配规则后,会返回一个设备名.libsysfs 负责读取/sys下的硬件信息.udev程序负责协调namedev和libsysfs,来完成指定的命名策略.当有设备添加或移出时,/sbin/hotplug由内核调用.提供相应设备的特征信息.如:设备类型,sysfs中的哪个设备等.udev获得这些信息,然后调用namedev,为设备指定一个名称.如果这是一个已经增加的新设备,则udev使用libsysfs来获得设备的主从设备号,然后在/dev下建立设备文件.如果这个设备已经移出,则将从/dev下删除理解和认识udev【转】2011-07-15 15:48:22| 分类:linux 基础Basic | 标签:|字号大中小订阅本文来自:/u/6541/showart_396425.html因为本身从事存储行业,在工作中多次碰到用户有这样的要求:我的linux系统中原来有一块SCSI硬盘,系统分配的设备文件是/dev/sda。

现在新增加了一个外置的磁盘阵列,通过SCSI卡连接。

但接上这个磁盘阵列后,/dev/sda变成了磁盘阵列的硬盘了,原来内置的SCSI硬盘变成了/dev/sdb,我希望将设备文件固定下来。

过去,我总是对用户说,这个比较麻烦,因为/dev/sda等文件都是linux内核自动分配的。

很难固定下来,除非你更改加载SCSI卡驱动程序的顺序,让内置硬盘连接的SCSI卡比外接磁盘阵列连接的SCSI卡的驱动模块先加载到内核,这样就能保证/dev/sda总是指向内置的硬盘。

但这种解决方法毕竟不太完美,而且对于其他的即插即用设备,如USB设备等都不适用。

近来,通过安装和升级linux-2.6内核,发现这个问题已经可以通过2.6内核新的sysfs文件系统和udev程序得到解决。

下面就是我在学习了udev 配置后的一点心得。

我喜欢用FAQ的形式来说明。

问:什么是udev?答:udev是一种工具,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。

设备文件通常放在/dev目录下。

使用udev后,在/dev目录下就只包含系统中真正存在的设备。

问:udev支持什么内核?答:udev只支持linux-2.6内核,因为udev严重依赖于sysfs文件系统提供的信息,而sysfs文件系统只在linux-2.6内核中才有。

问:udev是一个内核程序还是用户程序?答:udev是一个用户程序(user-mode daemon)。

问:udev和devfs有什么差别?答:udev能够实现所有devfs实现的功能。

但udev运行在用户模式中,而devfs运行在内核中。

据称:devfs具有一些不太容易解决的先天缺陷。

问:udev的配置文件放在哪里?答:udev是一个用户模式程序。

它的配置文件是/etc/udev/udev.conf。

这个文件一般缺省有这样几项:udev_root="/dev" ; udev产生的设备文件的根目录是/devudev_db="/dev/.udevdb" ; 通过udev产生的设备文件形成的数据库udev_rules="/etc/udev/rules.d" ;用于指导udev工作的规则所在目录。

udev_log="err" ;当出现错误时,用syslog记录错误信息。

问:udev的工作过程是怎样的?答:由于没有研究过udev的源程序,不敢贸然就说udev的工作过程。

我只是通过一些网上的资料和udev的说明文档,大致猜测它的工作过程可能是这样的。

1. 当内核检测到在系统中出现了新设备后,内核会在sysfs文件系统中为该新设备生成一项新的记录,一般sysfs文件系统会被mount到/sys目录中。

新记录是以一个或多个文件或目录的方式来表示。

每个文件都包含有特定的信息。

(信息是如何表述的,还要另外研究?)2. udev在系统中是以守护进程的方式udev d在运行,它通过某种途径(到底什么途径,目前还没搞懂。

)检测到新设备的出现,通过查找设备对应的sysfs中的记录得到设备的一些信息。

3. udev会根据/etc/udev/udev.conf文件中的udev_rules指定的目录,逐个检查该目录下的文件,这个目录下的文件都是针对某类或某个设备应该施行什么措施的规则文件。

相关文档
最新文档