设为首页 加入收藏

TOP

Linux工作原理3设备(四)
2023-07-23 13:29:49 】 浏览:110
Tags:Linux 设备
lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part5 -> ../../sda5

udevd进程按接口类型命名链接,然后按制造商和型号信息、序列号和分区(如果适用)命名。

注意:devtmpfs中的 "tmp "表示文件系统驻留在主内存中,具有用户空间进程的读/写能力;这个特性使udevd能够创建这些符号链接。我们将在第4.2.12节看到更多细节。

但udevd如何知道要创建哪些符号链接,以及如何创建它们?下一节将描述udevd是如何工作的。然而,你不需要知道这些或本章中的任何其他材料来继续阅读本书。事实上,如果这是你第一次研究Linux设备,我们强烈建议你跳到下一章,开始学习如何使用磁盘。

udevd的操作和配置

udevd守护进程的运作方式如下:

  • 内核通过内部网络链接向udevd发送通知事件,称为uevent。
  • udevd加载uevent中的所有属性。
  • udevd解析其规则,根据这些规则过滤和更新uevent,并采取相应的行动或设置更多属性。
    udevd从内核收到的传入的uevent可能是这样的(你会在第3.5.4节学习如何用udevadm monitor --property命令获得这个输出):

ACTION=change
DEVNAME=sde
DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host4/
target4:0:0/4:0:0:3/block/sde
DEVTYPE=disk
DISK_MEDIA_CHANGE=1
MAJOR=8
MINOR=64
SEQNUM=2752
SUBSYSTEM=block
UDEV_LOG=3

这个特殊的事件是对设备的改变。在接收到uevent后,udevd知道了设备的名称、sysfs设备路径和其他一些与属性相关的属性;它现在准备开始处理规则。
规则文件在/lib/udev/rules.d和/etc/udev/rules.d目录下。/lib中的规则是默认的,而/etc中的规则是重写的。对规则的全面解释会很乏味,你可以从udev(7)手册中了解更多,但这里有一些关于udevd如何读取规则的基本信息:

  • udevd从规则文件的开始到结束读取规则。
  • 在读完一条规则并可能执行其动作后,udevd 继续阅读当前的规则文件,寻找更多适用的规则。
  • 有一些指令(如GOTO)可以在必要时跳过规则文件的部分内容。这些指令通常放在规则文件的顶部,如果它与udevd正在配置的特定设备无关,就跳过整个文件。

让我们看一下第3.5.1节中/dev/sda例子中的符号链接。这些链接是由/lib/udev/rules.d/60-persistent-storage.rules中的规则定义的。在里面,你会看到以下几行:


# ATA
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", IMPORT{program}="ata_id --export $devnode"

# ATAPI devices (SPC-3 or later)
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{type}=="5",ATTRS{scsi_level}=="[6-9]*", IMPORT{program}="ata_id --export $devnode"

这些规则与通过内核的SCSI子系统(见第3.6节)呈现的ATA磁盘和光学介质相匹配。你可以看到有一些规则来捕捉设备可能的不同表现方式,但想法是udevd将尝试匹配以sd或sr开头但没有数字的设备(用KERNEL"sd[!0-9]|sr"表达式),以及子系统(SUBSYSTEMS"scsi"),最后还有一些其他属性,取决于设备的类型。如果所有这些条件表达式在任何一条规则中都为真,udevd就会转到下一个也是最后表达式:


IMPORT{program}="ata_id --export $tempnode"

这不是一个条件。相反,它是一个指令,从/lib/udev/ata_id命令中导入变量。如果你有这样一个磁盘,自己在命令行上试试。它看起来会像这样:


# /lib/udev/ata_id --export /dev/sda
ID_ATA=1
ID_TYPE=disk
ID_BUS=ata
ID_MODEL=WDC_WD3200AAJS-22L7A0
ID_MODEL_ENC=WDC\x20WD3200AAJS22L7A0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_REVISION=01.03E10
ID_SERIAL=WDC_WD3200AAJS-22L7A0_WD-WMAV2FU80671
--snip--

现在,导入设置了环境,使这个输出中的所有变量名都被设置为所示的值。例如,接下来的任何规则现在都会将 ENV{ID_TYPE} 识别为磁盘。

在我们到目前为止看到的两条规则中,特别值得注意的是ID_SERIAL。在每条规则中,这个条件都出现在第二条:

env{id_serial}!="?*"

如果ID_SERIAL没有被设置,这个表达式会评估为真。因此,如果ID_SERIAL被设置了,条件就是假的,整个当前规则就不适用,udevd就会转到下一条规则。
为什么会出现在这里?这两条规则的目的是运行ata_id来查找磁盘设备的序列号,然后将这些属性添加到uevent的当前工作副本中。你会在许多udev规则中发现这个一般模式。
设置了ENV{ID_SERIAL}后,udevd现在可以在后面的规则文件中评估这个规则,它寻找任何连接的SCSI磁盘:

KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*",SYMLINK+=&quo
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇INFINI Labs 产品更新 | Console .. 下一篇shell 常用命令3

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目