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