Udev: linux用戶空間設備管理
描述
Udev 是提供設備事件,管理設備節點的權限,在/dev中創建額外的符號鏈接,或重命名的網絡接口的系統軟件。根據發現的順序,內核通常只分配不可預知的設備名稱。根據其性能或當前配置,符號連接或網絡設備名提供一種方法來可靠地識別設備。
udev處理的所有設備信息存儲於udev數據庫和發送到可能的事件訂閱。通過libudev庫可以訪問所有的存儲數據和資源提供的事件 。
udev中的tools 和rules不是公開的API,並且他們可能隨時改變。任何外部應用程序不要調用/ lib / udev中的私有工具,它可能下一個版本中消失。僅udevadm和libudev可以訪問udev的信息。在/lib/udev中的tools和rules以及/dev/.udev中的整個內容是udev私有的,他們會在需要時改變。
要求
-kernel版本:可用的 sysfs, procfs, signalfd, inotify,unix domain sockets, networking and hotplug :
CONFIG_HOTPLUG=y
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_SYSFS=y
CONFIG_SYSFS_DEPRECATED*=n
CONFIG_PROC_FS=y
CONFIG_TMPFS=y
CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
CONFIG_BLK_DEV_BSG=y (SCSI devices)
- 選擇CONFIG_SYSFS_DEPRECATED*的話udev將不會工作;
- Unix domain sockets (CONFIG_UNIX) 作爲可加載的kernel模塊,udev將會工作,但是這種方式不被支持;
- 如今已不需要在kernel配置中選擇已過時的hotplug工具/sbin/hotplug,它可能致使系統不可用,因爲kernel將在並行的情況下創建許多線程以致於耗盡系統的內存資源。
- proc文件系統必須掛載在/proc,sysfs文件系統必須掛載於/sys,一個標準的udev安裝不支持其它的路徑。
- 在udev啓動時,文件系統必須有如下可解析的組名:disk,cdrom,floppy,tape,audio,video,lp,tty,dialout,kmem。這些組名只伴隨着rootfs的加載,沒有可用網絡時。(these
group names with only the rootfs mounted, and while no network is available.)
- 編譯'udev extras'需要 libacl, libglib2, libusb, usbutils, pciutils,gperf,這些依賴可以用配置選項--disable-extras disable。
建立
- 啓動時,/dev目錄應該掛載devtmpfs文件系統。udev將管理kernel創建的設備節點的權限和所有權,並可能創建額外的符號鏈接。如果需要,udev也可以工作於一個空的tmpfs文件系統,但是一些例如/dev/null, /dev/console, /dev/kmsg的靜態設備節點是udev啓動所需要的;
- 啓動udev守護進程來處理kernel發送的設備事件和申請這些設備的配置,這些通常由以下方式完成:
/sbin/udevadm trigger --type=subsystems,
/sbin/udevadm trigger –type=devices
- 重啓udev daemon不會對已存在的設備使用任何rules。
- 新的或更改過的rules會自動生效,不需要重啓daemon或signal
操作
- 基於kernel發出創建/刪除設備events,udev在/dev中創建/刪除設備節點。
- 所有的kernel事件都和一套指定的規則匹配,它可能掛接到事件處理和加載所需的kernel模塊來設置設備,kernel導出所有設備的主/次設備號,如果需要,udev將會創建一個帶有kernel默認名稱的設備節點。如果 udev使用設備節點的權限/所有權,創建指向設備節點的額外符號鏈接,並執行程序來處理對應的設備。
- udev處理的事件,和合併到設備數據庫中的信息,可以通過libudev訪問到:
http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/
http://www.kernel.org/pub/linux/utils/kernel/hotplug/gudev/