一、什么是udev?
udev是linux kernel的設(shè)備管理器,在最新的內(nèi)核版本中kernel_3.10中udev已經(jīng)代替了以前devfs、hotplug等功能,意味著它要處理添加/刪除硬件時(shí),所有的用戶空間行為。
實(shí)際上為什么我關(guān)注這個(gè)udev,因?yàn)榭磗ysfs的源碼時(shí),sysfs完成創(chuàng)建刪除一個(gè)設(shè)備之后,會(huì)通過(guò)netlink的方式發(fā)送uevent通知udevd,udevd守護(hù)進(jìn)程接手sysfs傳過(guò)來(lái)uevent,將完成剩下的工作。(目前我是這么理解的)
二、udev由什么組成
udev由三個(gè)部分組成:
- libudev函數(shù)庫(kù): /usr/include/libudev.h
- udevd守護(hù)進(jìn)程,現(xiàn)在已經(jīng)集成到systemd中,可以使用systemctl命令查看。
- 管理命令udevadm:/usr/bin/udevadm
三、udev在linux的那個(gè)位置
udev的守護(hù)進(jìn)程在linux的位置在systemd中的位置如下所示,舉個(gè)例子:如果向pc中插入一個(gè)usb設(shè)備,kernel在總線上發(fā)現(xiàn)這個(gè)設(shè)備,使用dirver初始化,在sysfs創(chuàng)建device目錄等操作之后,將通知用戶空間的udev,然后上層的顯示層才能看到這個(gè)usb設(shè)備,并最終將它顯示在desktop上:

四、udevadm的使用
udevadm是一個(gè)udev的管理工具,可以用來(lái)監(jiān)視和控制udev運(yùn)行時(shí)的行為,請(qǐng)求內(nèi)核事件,管理事件隊(duì)列,以及提供簡(jiǎn)單的調(diào)試機(jī)制。
udevadm主命令:
- info 查詢sysfs或者udev的數(shù)據(jù)庫(kù)
- trigger 從內(nèi)核請(qǐng)求events
- settle 查看udev事件隊(duì)列,如果所有的events已處理則退出
- control 修改udev后臺(tái)的內(nèi)部狀態(tài)信息
- monitor 監(jiān)控內(nèi)核的uevents
- hwdb 處理硬件數(shù)據(jù)庫(kù)索引
- test
主要學(xué)習(xí)一下info和monitor命令
4.1 udevadm info
這個(gè)命令實(shí)際上和數(shù)據(jù)庫(kù)的sql語(yǔ)句差不多,--query=查詢的內(nèi)容,其他的參數(shù)都是查詢條件
例1:
udevadm info --query=all --name=sda 查詢sda的所有信息
等價(jià)于select * from devicedb where name=sda
例2:
udevadm info --query=path --name=sda
out>>/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
等價(jià)于select path from devicedb where name=sda
例3:查看nvme0和nvme0n1的path
udevadm info --query=path --name=nvme0
out>>/devices/pci0000:00/0000:00:03.0/0000:05:00.0/misc/nvme0
udevadm info --query=path --name=nvme0n1
out>>/devices/pci0000:00/0000:00:03.0/0000:05:00.0/block/nvme0n1
//nvme0n1是一個(gè)塊設(shè)備
例4:查看nvme0n1的所有父設(shè)備一直到sysfs的根節(jié)點(diǎn)
udevadm info --attribute-walk --name=/dev/nvme0n1
out>>nvme0n1-->pci上的nvmedriver-->pci上的pcieport-->pci0000:00
4.2 udevadm monitor
使用ldd3的lddbus模塊編寫(xiě)lddbus.ko,這個(gè)模塊會(huì)向sysfs中注冊(cè)一個(gè)ldd總線和一個(gè)ldd0的device,執(zhí)行
rmmod lddbus.ko
insmod lddbus.ko
同時(shí),打開(kāi)udevadm monitor的監(jiān)控,能夠看到sysfs給用戶空間發(fā)過(guò)來(lái)的uevent消息:
KERNEL[165.870420] remove /bus/ldd (bus)
KERNEL[165.870456] remove /module/lddbus (module)
UDEV [165.875327] remove /bus/ldd (bus)
UDEV [165.876792] remove /module/lddbus (module)
KERNEL[165.880762] add /module/lddbus (module)
KERNEL[165.880788] add /bus/ldd (bus)
UDEV [165.883520] add /bus/ldd (bus)
UDEV [165.885141] add /module/lddbus (module)
可以看到,一個(gè)kernel發(fā)上來(lái)的uevent,udev都會(huì)有一個(gè)動(dòng)作去響應(yīng)。