Linux Udev

在我入門udev的時候,看着各類各樣的資料以爲這個東西很高深的時候,忽然瞄到一篇文章裏面說道: 要樹立一個信念:udev很簡單,當時不覺得然,如今可以理解,其實稍做研究就能理解了,看起來很高端很遙遠的Title,好比Linux Kernel,好比軟硬件交互,好比熱插拔等等,其實掌握幾個rules,而後再動手實踐實踐,對比着講解,就能知道七七八八了,想要再深刻,就多看看文檔實現和內核源碼,其實不少東西都是這樣,瞭解了就很簡單,沒事瞭解一點就比別人多知道一些,共勉html

Udev 是什麼

udevlinux kernel的設備管理器,處理硬件的添加和刪除,但它的功能遠遠不只於此。好比U盤插入,電腦是如何即時的作出響應?耳機插入又是如何作到自動關閉外部音量?這些都跟udev有關。雖然udev很強大,功能不少,原本就針對SCSI硬盤設備的插拔作一些經驗的分享。至於爲何我會研究到這個東西,是由於最近在作ceph相關的項目,須要實現一個相似熱插拔的feature,懂的人應該很清楚,就是拔插硬盤後,osd自動恢復,主要應用於硬盤壽命即將到期,替換新盤的場景,不明白的同窗也沒關係,由於本文主要討論的是udevpython

Udev Rules

udev管理各類各樣的設備,好比USB,DISK,CD等等,爲了區別設備類型,精確匹配,udev制定了一套特點的rules,爲何說特點呢?由於我以爲它用最簡潔的語法知足了方方面面的需求react

這裏推薦一些有用的linklinux

你們看完上面的文章應該知道rules文件的位置和規則,下面我貼一些我實踐中的代碼和例子

這是兩條分別針對SCSI硬盤設備的添加和刪除的rules,設備事件分別會觸發相應的腳本:

KERNEL=="sd[a-z]", ACTION=="add", SUBSYSTEM=="block", RUN+="/usr/bin/python /root/test.py %k add"
KERNEL=="sd[a-z]", ACTION=="remove", SUBSYSTEM=="block", RUN+="/usr/bin/python /root/test.py %k remove"

注意:

  • 執行外部命令必須加上環境變量路徑, 上面的這個也能夠不加/usr/bin/python,可是必須在py腳本頭部加上shebang#! /usr/bin/python

  • RUN能夠運行程序外的程序,而PROGRAM不是作這個事情的,而是爲了生成以後須要的變量

相關 Link

Udevadm

udevadm是一個udev的管理工具,能夠用來獲取設備信息(info),監視和控制udev運行時的行爲(control),請求內核事件(trigger),管理事件隊列(settle),以及提供簡單的調試機制(test)。很實用,很好用!!!

推薦 Link

介紹幾個我具體使用過的例子:

udevadm info

能夠從udev數據庫中提取設備信息,此外,還能夠從sysfs中提取設備的屬性, 以幫助建立與此設備匹配的udev規則

獲取/dev/sdbpath信息

udevadm info -q path -n /dev/sdb

udevadm test

模擬向udev發送設備信息,並不會真的觸發,而是將觸發後的過程信息打印出來,對調試頗有幫助, 我用這個查看腳本是否會被執行

udevadm test --action='add' `udevadm info -q path -n /dev/sdb`

注意: test不會真正觸發事件,而trigger能夠

udevadm trigger

能夠真正觸發udev事件,可是不會真正改變硬件,只是觸發kerneludev的事件,會觸發udev rules,我用這個觸發事件,校驗rules匹配

udevadm trigger -v --action=add --sysname-match=sda

注意:

  • 不加sysname-match那麼會觸發全部設備,若是是action=remove,那麼則會移除不少設備,甚至致使sshd服務停掉

  • 後面是sda而不是/dev/sda由於它是根據pci路徑來定位name的,好比sda的路徑是:

/sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda

udevadm control

  • 重載udev rules,對以後觸發的新設備有效,對以前已經觸發的無效

udevadm control --relaod-rules
  • 更改udev日誌等級爲infoudev默認等級爲err,能夠在/etc/udev/udev.conf中查看,日誌具體信息能夠在syslog中查看

udevadm control --log-priority=info

More about udev

udev還有不少有意思的地方,若是想要更加深刻的學習,那麼除了熟練地掌握rules等技巧,還要對其實現原理有了解,這就得多看文檔,多看源碼了,建議你們有條件的狀況下多看源碼,多看原始的東西,由於通過別人的總結就可能會變味,相互對比,不要一味依賴別人總結的產物

相關文章
相關標籤/搜索