1. 程式人生 > >udev -- 規則 工具 原理

udev -- 規則 工具 原理

1. udev 規則

http://reactivated.net/writing_udev_rules.html

規則在哪裡?

系統中有兩個地方存放udev規則

/etc/udev/rules.d/         本機規則

/lib/udev/rules.d/          系統規則

手冊中建議如果需要覆蓋系統規則,在/etc/udev/rules.d/下增加規則,

並且保證該規則的序號比系統規則序號優先順序高。

語義

每一行是一條規則,不能跨行

每個規則檔案優先順序是檔名的詞典順序,數字越小優先順序越高。

一個裝置可以被多條規則匹配到

語法

每條規則由key-value pair組成,每個key-value pair由逗號分開

key-value pair分為兩類 match,  assignment,前者用 == , 後者用 = 或者 +=

每條規則必須至少包含一個match 一個assignment key-value pair

匹配規則

關鍵字

KERNEL             匹配核心給的名字,或者任何父節點核心名字

SUBSYSTEM    匹配自己或父節點的subsystem名字

DRIVERS           匹配自己或父節點驅動的名字

ATTRS                匹配自己或父節點sysfs屬性

字串匹配

*           匹配任何字元,0 或 多次

?          匹配任何字元一次

[]          匹配在括號內的字元一次

KERNEL="fd[0-9]", NAME="floppy/%n", SYMLINK+="%k"

軟盤裝置在/dev/floppy/0,同事生成一個連結在/dev/fd0

命名規則

字串替換

%k    核心名字

%n    核心名字中的數字

KERNEL="mice", NAME="input/%k"        滑鼠裝置就生成在/dev/input/mice

KERNEL="loop0", NAME="loop/%n", SYMLINK+="%k"   loop0裝置會出現在/dev/loop/0,   同事生成一個連結在/dev/loop0

如何匹配sysfs中的attributes?


上面提到了在規則中用ATTRS來匹配sysfs中的屬性,但是具體對於一個裝置它的屬性和值都是什麼呢?

可以用下面這個命令來得到。

udevadm info --attribute-walk --name=/dev/sda

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="976773168"
    ATTR{stat}=="   96534    33362  8190706  1253628   141845    82330 12138250  6339276        0   899440  7594276"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}==""
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="0"
    ATTR{capability}=="50"
    ATTR{events_async}==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="PC4Z"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{model}=="HITACHI HTS72505"
    ATTRS{state}=="running"
    ATTRS{unload_heads}=="0"
    ATTRS{queue_type}=="none"
    ATTRS{iodone_cnt}=="0x3d8c6"
    ATTRS{iorequest_cnt}=="0x3d8c6"
    ATTRS{device_busy}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{ioerr_cnt}=="0x55"
    ATTRS{queue_depth}=="1"
    ATTRS{vendor}=="ATA     "
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{device_blocked}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{dh_state}=="detached"
    ATTRS{iocounterbits}=="32"
    ATTRS{vpd_pg80}==""
    ATTRS{vpd_pg83}==""
    ATTRS{eh_timeout}=="10"


同時這個命令可以得到devpath,忘了有什麼用了,先留著。

udevadm info --query=path --name=/dev/sda

2. udev 除錯

觀察kernel uevent和udev傳送的訊息

udevadm monitor

udevadm monitor --kernel --property