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...