Linux: udev 介紹
在談論udev之前,先要知道/dev這目錄. /dev在linux用途是存放device node(file-like device nodes). 程式可以透過device node來與系統上的裝置溝通.
e.g. /dev/input/mice 為滑鼠
那誰負責管理/dev底下的device node? 沒錯,那就是udev最主要的工作.
kernel會把裝置相關的events(add/remove/etc.)傳送至udev(藉由netlink). udev根據寫好的rules,在/dev底下建立對應的device node. 而這些rules會根據裝置的屬性去撰寫相關設定條件. 針對符合規則的裝置做對應的處理
到這時候應該會好奇要怎麼去得知道裝置的屬性呢? 而這邊就要談到 /sys (file type: sysfs), 這個是由kernel所維護的device資訊, kernel會把連接上的裝置資訊給放在這邊. udev在建立device node的時候也會參考這邊相關的屬性
e.g.
udevadm info -a --name /dev/input/mice
or
udevadm info -a --path $(udevadm info --query=path --name=/dev/input/mice)
接下來談的部分是udev rules. 基本上rule是由match keys和assignment keys這兩個部分構成.
match key主要是作為條件判斷用. assignment keys則是用來設定數值與執行相關操作. 每一條rule至少都要有一個 match key 和 assignment key. 在 rule 中的這些keys則使用逗號(,)來做隔離, 並不允許由多行的keys來成一條rule. 這意味著udev rule file中的每一行就是一條rule.
KERNEL=="sda", ATTR{size}=="234441648", NAME="sda", SYMLINK+=disk/by-id/ata-VBOX_HARDDISK_VBa2440069-7fdbc2ad
這一個例子是判斷KERNEL是否符合sda和ATTR{size}是否符合對應大小. 條件成立就建立device node以及一個指向device node的soft link.
以下是另一個範例, 針對usb的裝置建立一個對應的symlink
KERNEL=="sd*", SUBSYSTEM=="block", ACTION=="add", SYMLINK+="test/usbhd%n"
這邊再額外補充rule的限制一下. 下方是經由udevadm指令抓出關於device的屬性. 而在參考attr撰寫規則有一點需要特別注意. 只允許混合device本身屬性和某一層parent的屬性而已. 也是只允許 '黑, 黑金 或 黑紅'' 的組合.
looking at device '.../target2:0:0/2:0:0:0/block/sda':
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{alignment_offset}=="0"
...
looking at parent device '.../target2:0:0/2:0:0:0':
KERNELS=="2:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
...
looking at parent device '.../target2:0:0':
KERNELS=="target2:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
以下為match keys與assignment keys的列表
Key Type | Key Name |
---|---|
match key | KERNEL/SUBSYSTEM/DRIVER/ATTR{key}/ENV{key}/ACTION/TEST |
assigment key | NAME/GROUP/MODE/OPTIONS/OWNER/OWN/RUN/SYMLINK/ENV{key}/IMPORT{type}/ATTR{key}/GOTO/LABEL/WAIT_FOR |
留言
張貼留言