`
desert3
  • 浏览: 2158577 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

(转)udev、给硬盘分配固定设备名(符号链接)

 
阅读更多
man udev - 动态设备管理

為什麼採用 udev(sysfs? 因為 udev(sysfs) 採用比較彈性而且較有效的方式管理 /dev/ 裝置,所以 Linux 在 2.6.15 kernel 之後採用了 udev(sysfs) .原因很多大可以瓜括下面幾個:
  • 從前的裝置名稱是固定的 sda 代表第一個 SCSI 的硬碟,但是 udev 可以依據需求將 sda 任意改成你想要的名稱 如:my_first_scsi_disk
  • 採用連結(symbolic link)的方式儲存裝置的別名.
  • 在 /sys 可以看到依據 id / label / path / uuid 所對應出來的名稱.
  • 裝置(device node)的permissions and ownership 也都可以修改.
  • 當裝置在連接或移除時,可以執行相對應的程式(script).
  • network 裝置可以依需求修改成想要命名的方式.

因为本身从事存储行业,在工作中多次碰到用户有这样的要求:我的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产生的设备文件的根目录是/dev
  • udev_db="/dev/.udevdb" ; 通过udev产生的设备文件形成的数据库
  • udev_rules="/etc/udev/rules.d" ;用于指导udev工作的规则所在目录。
  • udev_log="err" ;当出现错误时,用syslog记录错误信息。

问:udev的工作过程是怎样的?
答:由于没有研究过udev的源程序,不敢贸然就说udev的工作过程。我只是通过一些网上的资料和udev的说明文档,大致猜测它的工作过程可能是这样的。
    当内核检测到在系统中出现了新设备后,内核会在sysfs文件系统中为该新设备生成一项新的记录,一般sysfs文件系统会被mount到 /sys目录中。新记录是以一个或多个文件或目录的方式来表示。每个文件都包含有特定的信息。(信息是如何表述的,还要另外研究?)
    udev在系统中是以守护进程的方式udevd在运行,它通过某种途径(到底什么途径,目前还没搞懂。)检测到新设备的出现,通过查找设备对应的sysfs中的记录得到设备的一些信息。
    udev会根据/etc/udev/udev.conf文件中的udev_rules指定的目录,逐个检查该目录下的文件,这个目录下的文件都是针对某类或某个设备应该施行什么措施的规则文件。udev读取文件是按照文件名的ASCII字母顺序来读取的,如果udev一旦找到了与新加入的设备匹配的规则,udev就会根据规则定义的措施对新设备进行配置。同时不再读后续的规则文件。

问:udev的规则文件的语法是怎样的?
答:udev的规则文件以行为单位,以"#"开头的行代表注释行。其余的每一行代表一个规则。每个规则分成一个或多个“匹配”和“赋值”部分。“匹配”部分用“匹配“专用的关键字来表示,相应的“赋值”部分用“赋值”专用的关键字来表示。“匹配”关键字包括:ACTION,KERNEL,BUS, SYSFS等等,“赋值”关键字包括:NAME,SYMLINK,OWNER等等。具体详细的描述可以阅读udev的man文档。
    下面举个例子来说明一下,有这样一条规则:
SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:0d:87:f6:59:f3", IMPORT="/sbin/rename_netiface %k eth0"
    这个规则中的“匹配”部分有三项,分别是SUBSYSTEM,ACTION和SYSFS。而"赋值"部分有一项,是IMPORT。这个规则就是说,当系统中出现的新硬件属于net子系统范畴,系统对该硬件采取的动作是加入这个硬件,且这个硬件在SYSFS文件系统中的“address”信息等于“00: 0d..."时,对这个硬件在udev层次施行的动作是调用外部程序/sbin/rename_netiface,传递的参数有两个,一个是“%k”,代表内核对该新设备定义的名称。另一个是”eth0“。
    从上面这个例子中可以看出,udev的规则的写法比较灵活的,尤其在“匹配”部分中,可以通过诸如”*“, ”?“,[a-c],[1-9]等shell通配符来灵活匹配多个匹配项。具体的语法可以参考udev的man文档。

问:udev怎样做到不管设备连接的顺序而维持一个统一的设备名?
答:实际上,udev是通过对内核产生的设备名增加别名的方式来达到上述目的的。前面说过,udev是用户模式程序,不会更改内核的行为。因此,内核依然会我行我素地产生设备名如sda,sdb等。但是,udev可以根据设备的其他信息如总线(bus),生产商(vendor)等不同来区分不同的设备,并产生设备文件。udev只要为这个设备文件取一个固定的文件名就可以解决这个问题。在后续对设备的操作中,只要引用新的设备名就可以了。但为了保证最大限度的兼容,一般来说,新设备名总是作为一个对内核自动产生的设备名的符号链接(link)来使用的。
    例如:内核产生了sda设备名,而根据信息,这个设备对应于是我的内置硬盘,那我就可以制定udev规则,让udev除了产生/dev/sda设备文件外,另外创建一个符号链接叫/dev/internalHD。这样,我在fstab文件中,就可以用/dev/internalHD来代替原来的 /dev/sda了。下次,由于某些原因,这个硬盘在内核中变成了sdb设备名了,那也不用着急,udev还会自动产生/dev/internalHD这个链接,并指向正确的/dev/sdb设备。所有其他的文件像fstab等都不用修改。

问:怎样才能找到这些设备信息,并把他们放到udev的规则文件中来匹配呢?
答:这个问题比较难,网上资料不多,我只找到一篇文章来介绍如何写udev的规则。他的基本方法是通过udevinfo这个实用程序来找到那些可以作为规则文件里的匹配项的项目。有这样两种情况可以使用这个工具:
    第一种情况是,当你把设备插入系统后,系统为设备产生了设备名(如/dev/sda)。那样的话,你先用udevinfo -q path -n /dev/sda,命令会产生一个该设备名对应的在sysfs下的路径,如/block/sda。然后,你再用udevinfo -a -p /sys/block/sda,这个命令会显示一堆信息,信息分成很多块。这些信息实际来自于操作系统维护的sysfs链表,不同的块对应不同的路径。你就可以用这些信息来作为udev规则文件中的匹配项。但需要注意的是,同一个规则只能使用同一块中显示的信息,不能跨块书写规则。
    第二种情况是,不知道系统产生的设备名,那就只有到/sys目录下去逐个目录查找了,反复用udevinfo -a -p /sys/path...这个命令看信息,如果对应的信息是这个设备的,那就恭喜你。否则就再换个目录。当然,在这种情况下,成功的可能性比较小。

转自:理解和认识udev
分享到:
评论

相关推荐

    利用udev处理U盘信息,得到U盘路径等

    当我们插入一个U盘时,udev会自动检测到这个事件,并为U盘分配一个设备节点,提供访问U盘的路径。这个过程涉及到了Linux内核、USB驱动程序、udev规则以及用户空间的应用程序交互。 首先,USB(Universal Serial Bus...

    udev管理linux设备

    配置udev主要是通过修改/etc/udev/rules.d/目录下的规则文件,这些文件以`.rules`为扩展名,每条规则以ACTION和KERNEL关键字开始,定义了对特定设备的操作。 例如,若要将一个特定的硬盘命名为`/dev/data_disk`,...

    linux设备管理工具--udev

    这里的关键在于使用`KERNEL`和`ATTRS`来匹配设备,并使用`SYMLINK`来创建符号链接。 **3. 设置设备权限** 同样在规则文件中,可以设置设备文件的权限: ```bash ACTION=="add", KERNEL=="sd[a-z]", ATTRS{vendor}...

    利用Udev在linux设备装载时实现易于识别的设备文件名.pdf

    随着计算机技术的发展和应用的广泛,计算机挂载的设备越来越多,虽然 Linux 依据设备类型分配了设备文件名,比如 eth0、eth1、sda、sdb,但是人们不查看具体的设备信息,无法从这类名字上判断那是哪一个硬件设备。...

    利用udev、sys动态创建linux设备结点

    动态创建 Linux 设备结点使用 udev 和 sys Linux 设备结点是指操作系统中的一种抽象概念,它是操作系统中的一种文件系统,用于管理和组织设备文件。udev 是 Linux 中的一个设备管理器,它可以动态创建设备结点,而 ...

    udev_wing基础

    udev创建一个兼容设备参考,udev无论类型和连接总线创建一个附属的CD符号链接,例如 /dev/cdrom。/dev/cdom是由udev参考附属的CD兼容驱动器创建的一个符号链接,CD兼容驱动器可以是 CD-ROM,DVD-ROM,DVD-RW 等等,...

    Redhat7 Udev绑定(DM multipath)多路径设备.docx

    它可以将一个设备文件符号链接到另一个设备文件上,从而实现设备的绑定关系。 6. OWNER和GROUP:OWNER和GROUP是Udev规则文件中的一种指令。它们可以设置设备的所有者和组所有者,从而控制设备的访问权限。 7. MODE...

    linux下udev的使用

    这个脚本函数可以实现对 U 盘的自动挂载和卸载,并创建相应的设备文件符号链接。 udev 是 Linux 系统中的一种重要的设备管理机制,可以实时监控和管理系统中的设备事件,并提供了灵活和可靠的设备管理功能。

    编写udev规则中文版-writing_udev_rules

    Udev 是 Linux 操作系统中的一种设备管理系统,它可以对设备进行自动检测、加载驱动程序、分配设备文件名等操作。Udev 规则是 udev 系统的核心组件,它定义了设备的行为和属性。本文档将详细介绍如何编写 udev 规则...

    Red Hat Enterprise Linux 6使用udev配置Oracle ASM总结文档

    使用udev的好处包括:能够在系统重启后保持设备文件的一致性,可以基于硬件的特定属性动态分配设备名,减少系统管理员的手动干预,提升系统的自动化水平和可靠性。 3. 配置udev 配置udev通常涉及编写udev规则文件,...

    linux udev配置规则

    这个目录中存放的是以 `.rules` 结尾的文件,每个文件都包含了一系列规则,用于帮助 udev 分配名称给设备文件,确保内核能够正确识别它们。 - `udev_log="err"`:设置了 udev 日志记录的级别,默认只记录错误日志。 ...

    udev-182 库源码下载

    总之, udev 探测外设和热插拔,将设备控制权传递给内核,例如加载内核模块或设备固件。 作为 devfsd 和 hotplug 的替代品, udev 还负责管理 /dev 中的设备节点,即添加、链接和重命名,因此也取代了 hotplug 和 ...

    linux用户空间程序udev使用总结

    udev的出现提供了更优的解决方案,尤其是对于热插拔设备(如USB设备)和大量设备的系统(如服务器),它能基于设备的序列号或其他标识信息为设备分配唯一的设备文件,解决了设备映射不确定的问题。此外,udev还允许...

    LINUX UDEV学习心得

    UDEV 是一个基于规则的设备管理器,它可以根据设备的唯一标识符(如 UUID)来分配固定的设备名称。这样即使硬件设备顺序变化,操作系统也能始终以相同的方式识别它们,确保应用程序(如 Oracle 数据库)的稳定运行。...

    udev移植到arm板上

    - 规则文件(通常位于/etc/udev/rules.d/)定义了针对不同设备的处理逻辑,如分配设备号、设置权限等。 2. **移植准备**: - 确保目标ARM板的Linux内核版本支持udev,大多数现代内核版本已经包含udev的支持。 - ...

    Writing_udev_rules.tar.gz

    udev是Linux系统中用于管理设备节点的动态设备管理系统,它替代了传统的devfs。udev规则是udev用来控制设备节点创建、命名以及附加属性的关键机制。这些规则定义在/etc/udev/rules.d目录下的文本文件中,通常以"....

    使用 udev 高效、动态地管理 Linux 设备文件

    Linux 系统中的设备管理是操作系统与硬件交互的关键部分,其中udev是现代Linux发行版中用于动态管理设备文件的核心组件。udev替代了早期的devfs,提供了更为灵活和高效的设备命名及管理机制。 udev的核心功能在于它...

    掌握udev 掌握udev

    udev 是 Linux 系统中用于管理设备文件的用户空间程序,它取代了早期的静态设备文件管理和内核驱动的 devfs。udev 的出现解决了设备映射不确定性、设备号不足、/dev 目录文件过多以及命名不灵活等问题,特别是在处理...

Global site tag (gtag.js) - Google Analytics