udev使用筆記

一、什么是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è)部分組成:

  1. libudev函數(shù)庫(kù): /usr/include/libudev.h
  2. udevd守護(hù)進(jìn)程,現(xiàn)在已經(jīng)集成到systemd中,可以使用systemctl命令查看。
  3. 管理命令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上:

udev的位置

四、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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容