最近遇到一個 網絡介面卡的順序與名稱問題,才開始接觸 udev 這個東西的,雖然他在 kernel 2.6.15 就開始使用了.目前我的 RHEL5 已經用到 kernel 2.6.18,先來看一下 devfs(dev) 和 sysfs(udev) 的不同.
舊時代的 Linux 2.4 – 2.6.18 採用 /dev/ (devfs) + hotplug
有上過 Linux 課的,還記得老師的第一句話就是 Linux 下所有的東西都是以檔案的模式存在,這也包括了硬體裝置.
所以在最早的 Linux 裝置通通存放在 /dev/ 目錄下,名稱的命名很簡單.
- /dev/fb: frame buffer
- /dev/fd: floppy disks
- /dev/hd: hda 就是 IDE 的硬碟
- /dev/lp: printers (compare lp)
- /dev/par: parallel ports
- /dev/pt: pseudo-terminals (virtual terminals)
-
/dev/sd: sda 就是 SCSI 的硬碟. (but also SATA and USB disks)
- scd: SCSI audio-oriented optical disc drives
- sd: SCSI hard disks (also SATA or USB disks)
- sg: SCSI generic devices
- sr: SCSI data-oriented optical disc drives
- st: SCSI magnetic tapes
-
/dev/tty: (physical) terminals
- ttyS: ttyS0 就是serial port.
其他的虛擬裝置 (Pseudo-devices)
- /dev/null: Accepts and discards all input; produces no output.
- /dev/full: Always full device.
- /dev/loop: loop device
- /dev/zero: Produces a continuous stream of NUL (zero value) characters.
- /dev/random: Produces a variable-length stream of pseudo-random (random in Linux) characters. (Blocking)
- /dev/urandom: Produces a variable-length stream of pseudo-random characters. (Non-Blocking)
在核心 Linux 2.4–2.6.18 ,devfs (device file system) ,使用者如果要對硬體進行存取,很簡單的只要針對 /dev/ 檔案作存取即可.但是缺點就是系統一開始就必須先將所以的裝置先預備好.假如你的系統明明只有一顆硬碟 sda 但是 /dev/ 目錄下可早就已經預備好了 sdb , sdc …. 不同的硬碟裝置在做準備.所以 /dev/ 會相當龐大,都是因為儲存了一些不是真實存在的裝置.而且裝置沒有規則可循的皆直接存放在 /dev/ 目錄下面.
這樣的系統所有的裝置都必須在關機狀態才能才能插上裝置,但因為 USB 裝置的產生,Linux 加上可動態偵測,增減裝置 USB 裝置的 hotplug.devfs ,但是實際上 /dev/ 目錄還是一開始就必須有相對應的裝置名稱才可以.
這些 /dev/ 的裝置名稱都是以靜態的方式存在,如果系統的裝置不夠用時還需要自行增加 (須透過指令 #mknod).加上所有的 device 都有它的 [MAJOR MINOR] number ,至於 number 的定義要自行參考裝置的參數表 /usr/src/linux-kernel-version/Documentation/devices.txt 使用上不是很方便,所以在 2.6.15 kernel 就採用了 udev 的方式.
從核心 Linux 2.6.15 版後,Linux 全面採用 sysfs 取代過去的 devfs
sysfs – 核心 2.6 後的新檔案系統,裝置名稱還是存放在 /dev/ 目錄下但是多了一個 /sys/ 的目錄 (該目錄是可瀏覽的),裡面存放當前硬體相對應的基本資訊.udev 則是透過 /sys/ 目錄的資訊創建出相對應的硬體設備節點 /dev/.
udev – 是管理目錄 /dev 的新方法,傳統的方式需要在 /dev/ 預先產生可能用不到的裝置名稱,udev 主要是依賴於 sysfs 提供的資訊與用戶提供的規則(Rule) 來創建相對應於系統中存在的 /dev 設備節點名稱.
為什麼採用 udev(sysfs)?
因為 udev(sysfs) 採用比較彈性而且較有效的方式管理 /dev/ 裝置,所以 Linux 在 2.6.15 kernel 之後採用了 udev(sysfs) .原因很多大可以包括下面幾個:
- 從前的裝置名稱是固定的 sda 代表第一個 SCSI 的硬碟,但是 udev 可以依據需求將 sda 任意改成你想要的名稱 如:my_first_scsi_disk
- 採用連結 (symbolic link) 的方式儲存裝置的別名.
- 在 /sys 可以看到依據 id / label / path / uuid 所對應出來的名稱.
- 裝置 (device node) 的permissions and ownership 也都可以修改.
- 當裝置在連接或移除時,可以執行相對應的程式 (script).
- network 裝置可以依需求修改成想要命名的方式.
預設命名規則
系統已經有一套規則命名所有的裝置,而且很好懂.基本上我們除非有特別需求其實是不用再去修改規則.比如在 /dev/disk 就代表所有的硬碟裝置,依 id / label / path / uuid 規則的擺放.
[root@benjr ~]# ll -lR /dev/disk/ /dev/disk/: total 0 drwxr-xr-x 2 root root 100 Mar 13 03:43 by-id drwxr-xr-x 2 root root 60 Mar 13 03:43 by-label drwxr-xr-x 2 root root 120 Mar 13 03:43 by-path drwxr-xr-x 2 root root 60 Mar 13 03:43 by-uuid /dev/disk/by-id: total 0 lrwxrwxrwx 1 root root 9 Mar 13 03:43 scsi-3500000e01d93f8c0 -> ../../sda lrwxrwxrwx 1 root root 10 Mar 13 03:43 scsi-3500000e01d93f8c0-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Mar 13 03:43 scsi-3500000e01d93f8c0-part2 -> ../../sda2 /dev/disk/by-label: total 0 lrwxrwxrwx 1 root root 10 Mar 13 03:43 boot -> ../../sda1 /dev/disk/by-path: total 0 lrwxrwxrwx 1 root root 9 Mar 13 03:43 ide-0:0 -> ../../hdc lrwxrwxrwx 1 root root 9 Mar 13 03:43 pci-0000:0c:00.0-sas-0x5005076b06400f24:1:0-0x500000e01d93f8c2:1 -> ../../sda lrwxrwxrwx 1 root root 10 Mar 13 03:43 pci-0000:0c:00.0-sas-0x5005076b06400f24:1:0-0x500000e01d93f8c2:1-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 Mar 13 03:43 pci-0000:0c:00.0-sas-0x5005076b06400f24:1:0-0x500000e01d93f8c2:1-part2 -> ../../sda2 /dev/disk/by-uuid: total 0 lrwxrwxrwx 1 root root 10 Mar 13 03:43 d9a68a3e-8b89-485e-97c9-d147d6601059 -> ../../sda1
你可以看到光是一個硬碟就又這麼完整的方式來呈現,其中大部分都是連結 (symbolic link) 的方式儲存裝置的別名並對應到真實的裝置名稱.
如: boot -> ../../sda1 就很清楚知道 boot 這個 partition 是在 sda1 上面.
接下來可以認識一下關於 udev 裝置命名方式 https://benjr.tw/10607
參考文件: http://reactivated.net/writing_udev_rules.html
One thought on “什麼是 udev?”