歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Udev:介紹現代Linux系統的設備管理

Udev:介紹現代Linux系統的設備管理

日期:2017/2/28 16:40:26   编辑:Linux教程

現代Linux發行版可以在已經運行的系統裡面識別一個新加入的硬件。有許多用戶友好的發行版,比如Ubuntu,可以在像iPod這樣的移動設備插入系統時自動運行指定的應用程序,比如Rhythmbox。

Linux發行版裡面的熱插拔(這個詞用於描述將設備插入已經運行的系統的過程)功能是三個組件的融合:Udev, HAL, and Dbus.

Udev為已經連接在系統上面的設備節點提供一個動態設備目錄。當設備插入或移出系統的時候,Udev就在 /dev目錄下面創建或者刪除設備節點文件。Dbus類似於系統總線,主要用於進程間通信。HAL從Udev的服務中獲取信息,當一個設備連接到系統時它 就創建關於這個設備的XML描述。然後它會通過Dbus通知相應的桌面應用程序,比如說Nautilus,Nautius則會打開這個新掛載設備上面的文 件。

本文只關注Udev, 是它完成了基本的設備識別。

什麼是Udev?

Udev是Linux 2.6內核的設備管理器,它在/dev目錄下動態地創建/移除設備節點。它是devfs和hotplug的繼承者,運行在用戶空間,並且用戶可以用Udev規則來改變設備的命名。


Udev依賴2.5內核引入的sysfs文件系統。sysfs是的設備在用戶空間可見。每當一個設備被加入或移除,就會產生內核事件通知用戶空間的Udev。


在早期的發行中常使用一個外部二進制文件/sbin/hotplug來將設備狀態的改變通知Udev。現在這個工具已經被替換掉,Udev可以通過Netlink直接監聽這些事件了。


為什麼我們需要它 ?

在早期的內核中/dev目錄包括一些靜態的設備文件。而使用動態設備創建後,只有那些真正存在於系統中的設備節點才會被創建。讓我們來看看靜態/dev目錄的缺點,正是這些缺點導致了Udev的開發。

在/dev的設備節點中精確辨別一個硬件設備的問題

在系統啟動過程中,內核會為一個識別到的硬件設備分配一個主/次設備號對。讓我們考慮兩個硬盤,連接/校准的的方式是一個連接到主接口,另一個連接 到從接口。Linux系統會稱它們為/dev/hda和/dev/hdb。現在,如果我們交換兩個磁盤,那麼它們的設備名也會改變。這使得將一個可用的動 態設備節點定位到正確的設備發生困難。當有一堆的硬盤連接在系統時,情況會變得更加糟糕。

Udev通過/dev目錄提供了一個永久性設備命名系統,使得定位設備變得容易。

下面是一個例子,顯示了Udev為接入系統的硬盤創建的永久性符號鏈接。

$ ls -lR /dev/disk/
/dev/disk/by-id:
lrwxrwxrwx 1 root root 9 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593 -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part6 -> ../../sda6
lrwxrwxrwx 1 root root 10 Jul 4 06:48 scsi-SATA_WDC_WD800JD-75M_WD-WMAM9UT48593-part7 -> ../../sda7
/dev/disk/by-label:
lrwxrwxrwx 1 root root 10 Jul 4 06:48 1 -> ../../sda6
lrwxrwxrwx 1 root root 10 Jul 4 06:48 boot1 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jul 4 06:48 project -> ../../sda3
lrwxrwxrwx 1 root root 10 Jul 4 06:48 SWAP-sda7 -> ../../sda7
/dev/disk/by-path:
lrwxrwxrwx 1 root root 9 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part6 -> ../../sda6
lrwxrwxrwx 1 root root 10 Jul 4 06:48 pci-0000:00:1f.2-scsi-0:0:0:0-part7 -> ../../sda7
/dev/disk/by-uuid:
lrwxrwxrwx 1 root root 10 Jul 4 06:48 18283DC6283DA422 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 4 06:48 25a4068c-e84a-44ac-85e6-461b064d08cd -> ../../sda6
lrwxrwxrwx 1 root root 10 Jul 4 06:48 3ea7cf15-511b-407a-a56b-c6bfa046fd9f -> ../../sda5
lrwxrwxrwx 1 root root 10 Jul 4 06:48 8878a0a4-604e-4ddf-b62c-637c4fa84d3f -> ../../sda2
lrwxrwxrwx 1 root root 10 Jul 4 06:48 e50bcd6d-61ea-4b05-81a8-3cbe17ad6674 -> ../../sda3
Copyright © Linux教程網 All Rights Reserved