在我入門
udev
的時候,看着各類各樣的資料以爲這個東西很高深的時候,忽然瞄到一篇文章裏面說道: 要樹立一個信念:udev
很簡單,當時不覺得然,如今可以理解,其實稍做研究就能理解了,看起來很高端很遙遠的Title
,好比Linux Kernel
,好比軟硬件交互,好比熱插拔等等,其實掌握幾個rules
,而後再動手實踐實踐,對比着講解,就能知道七七八八了,想要再深刻,就多看看文檔實現和內核源碼,其實不少東西都是這樣,瞭解了就很簡單,沒事瞭解一點就比別人多知道一些,共勉html
udev
是linux kernel
的設備管理器,處理硬件的添加和刪除,但它的功能遠遠不只於此。好比U
盤插入,電腦是如何即時的作出響應?耳機插入又是如何作到自動關閉外部音量?這些都跟udev
有關。雖然udev
很強大,功能不少,原本就針對SCSI
硬盤設備的插拔作一些經驗的分享。至於爲何我會研究到這個東西,是由於最近在作ceph
相關的項目,須要實現一個相似熱插拔的feature
,懂的人應該很清楚,就是拔插硬盤後,osd
自動恢復,主要應用於硬盤壽命即將到期,替換新盤的場景,不明白的同窗也沒關係,由於本文主要討論的是udev
python
udev
管理各類各樣的設備,好比USB
,DISK
,CD
等等,爲了區別設備類型,精確匹配,udev
制定了一套特點的rules
,爲何說特點呢?由於我以爲它用最簡潔的語法知足了方方面面的需求react
這裏推薦一些有用的link
:linux
UDEV Primer udev
入門必讀,能夠快速將udev
瞭解一番web
Writing udev rules 經典文章,看完這個基本就能掌握udev rules
數據庫
Writing udev rules 修訂版 國內論壇對格式樣式作了一些修改,有潔癖的能夠看看ssh
Writing udev rules 譯 翻譯版本,英文很差的能夠中英文對比着看工具
udev 中文手冊 這位金步國先生爲開源事業作出了傑出的貢獻,早前就看過他翻譯的Apache
的手冊學習
Writing udev rules and kernel examples 看夠了上面各類規則,來看看具體的例子吧ui
Udev 詳解 文章如名,真的很詳細
Udev 使用方法 一些特殊的技巧
你們看完上面的文章應該知道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
不是作這個事情的,而是爲了生成以後須要的變量
udevadm
是一個udev
的管理工具,能夠用來獲取設備信息(info
),監視和控制udev運行時的行爲(control
),請求內核事件(trigger
),管理事件隊列(settle
),以及提供簡單的調試機制(test
)。很實用,很好用!!!
udevadm 中文手冊 很全,很基礎 ~~
udevadm command examples 不少udevadm
的命令能夠借鑑,說不定之後能夠用到呢?
介紹幾個我具體使用過的例子:
能夠從udev
數據庫中提取設備信息,此外,還能夠從sysfs
中提取設備的屬性, 以幫助建立與此設備匹配的udev
規則
獲取/dev/sdb
的path
信息
udevadm info -q path -n /dev/sdb
模擬向udev
發送設備信息,並不會真的觸發,而是將觸發後的過程信息打印出來,對調試頗有幫助, 我用這個查看腳本是否會被執行
udevadm test --action='add' `udevadm info -q path -n /dev/sdb`
注意: test
不會真正觸發事件,而trigger
能夠
能夠真正觸發udev
事件,可是不會真正改變硬件,只是觸發kernel
和udev
的事件,會觸發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
重載udev rules
,對以後觸發的新設備有效,對以前已經觸發的無效
udevadm control --relaod-rules
更改udev
日誌等級爲info
,udev
默認等級爲err
,能夠在/etc/udev/udev.conf
中查看,日誌具體信息能夠在syslog
中查看
udevadm control --log-priority=info
udev
還有不少有意思的地方,若是想要更加深刻的學習,那麼除了熟練地掌握rules
等技巧,還要對其實現原理有了解,這就得多看文檔,多看源碼了,建議你們有條件的狀況下多看源碼,多看原始的東西,由於通過別人的總結就可能會變味,相互對比,不要一味依賴別人總結的產物
Linux 自動掛載usb設備 小例子 如何在usb
設備插入後自動掛載?
udev使用筆記 這篇文章裏面那張圖片不錯
寫個程序檢測咱們的設備插拔 模仿內核源碼簡單地實現一個設備插拔的檢測
linux下熱插拔事件的產生是怎樣通知到用戶空間 事件傳遞過程,udev
源碼解析
熱插拔的工做原理 hotplug機制和udev udev
原理講解
Uevent 上報event事件給上層的詳細講解 uevent
源碼講解
linux內核空間和用戶空間的是怎樣區別的,如何交互,如何從用戶空間進入內核空間 內核空間和用戶空間的一些剖析
Netlink實現熱拔插監控 消息傳輸用的是什麼?Netlink
是如何作到的