Ubuntu之udev用法總結

2021-09-28 23:51:01 字數 3354 閱讀 2160

u即user space,dev是device,通過它的名字,我們就可以簡單了解到,它是乙個和使用者態相關的驅動裝置管理機制。udev是乙個針對2.6核心的檔案系統。提供一種基於使用者空間的動態裝置節點管理和命名的解決方案。用於取代落後的devfs

udev與硬體平台無關,屬於使用者空間的程序,是乙個後台程式,它脫離驅動層的關聯,而建立在作業系統之上,只要修改配置檔案使之生效,無需重啟操 作系統,它需要sysfs的支援,當底層裝置發生插拔的時候,底層驅動通過netlink傳送事件(uevent)給udev後台程式,udev監聽這些 事件,並在上層做相應的裝置節點的建立,命名,許可權控制等。

它有以下優點:

1.動態管理:當裝置新增/刪除時,udev的守護程序偵聽到來自核心的uevent,以此新增或者刪除/dev下的裝置檔案,所以,udev只為 已經連線的裝置產生裝置檔案,而不會在/dev/下產生大量虛無的裝置檔案.在發生熱插拔時,裝置的變化的相關資訊會輸出到核心的/sys(sysfs文 件系統),udev利用sysfs的資訊來進行相應的裝置節點的管理

2.自定義命名規則:通過規則檔案,udev在/dev/下為所有的裝置定義了核心裝置名稱,比如/dev/sda,/dev/hda,/dev /fd(這些都是驅動層定義的裝置名)等等。由於udev是在使用者空間執行,linux使用者可以自己定義規則檔案,產生標識性強的裝置檔案,比如/dev /boot_disk,/dev/root_disk,/dev/color_printer等等

3.設定裝置的許可權和所有者/組。同樣在規則檔案中,可以自己定義裝置相關的許可權和所有者/組。

(詳細說明可以通過man udev檢視)

1.先插入u盤,通過sudo fdisk -l 觀察到的u盤資訊如下:

device     boot    start      end  sectors  size id type

/dev/sdd1 256 56062207 56061952 26.8g c w95 fat32 (lba)

/dev/sdd4 * 56062208 60062499 4000292 1.9g 16 hidden fat16

(這裡看到u盤的boot分割槽分配了1.9g,不科學啊)

2.編寫udev配置檔案

udev的配置檔案在/etc/udev下面

lzy@lzy-inspiron-3847:/etc/udev$ ls

hwdb.d rules.d udev.conf

其中udev.conf是udev預設的配置檔案。使用者自定義的配置檔案在rules.d檔案下。

在rules.d目錄下新建10-usb.rules。其中內容如下:

kernel=="sdd1",subsystems=="block",actions=="add",symlink+="usb1_link"
簡單介紹一下上面的語法:

udev中,雙等號為判斷,+=,:=,=均為「賦值操作」。

以上有三個判斷條件:

actions==「add」——插入裝置

kernel==「sdd4」——裝置號為/dev/sdd4

subsystems==「block」——裝置型別為「塊裝置」

如果滿足上述三個條件,則將建立此裝置的軟鏈結usb1_link.

3.kernel和subsystems查詢方法

其中kernel和subsystems資訊,可以通過udevadm命令查詢

例如,如下命令查詢sdd的u盤資訊

udevadm info -a -p /sys/block/sdd
其中sdd的資訊如下(可以查詢到sdd的kernel和subsystem資訊):

looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host6/target6:0:0/6:0:0:0/block/sdd':

kernel=="sdd"

subsystem=="block"

driver==""

...

我們需要知道的是sdd1(u盤中的具體碟符的資訊),需要通過如下方法獲取。

下列命令獲取sdd1裝置的裝置目錄

udevadm info -q path -n /dev/sdd1
輸出如下:

/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host6/target6:0:0/6:0:0:0/block/sdd/sdd1
將上面的一串作為早先udevadm info -a -p命令的輸入路徑,即這樣寫:

udevadm info -a -p $(udevadm info -q path -n /dev/sdd1)
輸出最開頭的結果路下:

looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host6/target6:0:0/6:0:0:0/block/sdd/sdd1':

kernel=="sdd1"

subsystem=="block"

driver==""

...

4.使得udev檔案生效的方法

通常,使得配置後的檔案生效,需要採用熱插拔的方法更新udev規則,不過有更簡單的方法如下:

sudo udevadm test /sys/class/block/sdd1
結果如圖

lzy@lzy-inspiron-3847:/etc/udev/rules.d$ ls -al /dev/usb1*

lrwxrwxrwx 1 root root 4 12月 14 09:51 /dev/usb1_link -> sdd1

5.其他注意事項

1.如果在10-usb.rules中加入語句name+=「string」,則執行更新命令的時候,會有如下error:

name="lzy_usb3" ignored, kernel device nodes can not be renamed; please fix it in /etc/udev/rules.d/10-local.rules:1
經查是udev後續版本不再支援直接修改裝置號。

2.本例子中udev的裝置是通過裝置號sdd1來識別的,其實該裝置號每次插拔的時候都有變化,可以設定其他引數匹配對應的硬體,來保證對應裝置接入之後,生成對應的硬體。

參考部落格

[1] 

[2] 

[3]

Ubuntu之udev用法總結

u即user space,dev是device,通過它的名字,我們就可以簡單了解到,它是乙個和使用者態相關的驅動裝置管理機制。udev是乙個針對2.6核心的檔案系統。提供一種基於使用者空間的動態裝置節點管理和命名的解決方案。用於取代落後的devfs udev與硬體平台無關,屬於使用者空間的程序,是乙...

關於UDEV規則的實踐總結

參考資料 udev中文手冊 金步國 一些非常基本的規則都可以在裡面找到 配置檔案 etc udev udev.confrules規則目錄 etc udev rules.d 開啟除錯日誌,在udev.conf中設定udev log debug 這udev的除錯資訊真沒眼看,感覺亂糟糟的 1.第一條規則...

Linux攻防之udev漏洞演示

此漏洞針對linux2.6核心,只要有普通使用者許可權,即可提公升root許可權,開始實驗吧 1 複製以下 儲存為udev.sh,並賦予可執行許可權 2 useradd test 新建乙個普通使用者 3 su test 切換至test使用者 4 ps ef grep udev 檢視udev id r...