1,764 瀏覽數

udev 裝置命名規則

測試環境為 Ubuntu16.04 x86_64

前面 什麼是 udev? http://benjr.tw/10598 裡面有提到裝置名稱除了系統預設的命名規則外.使用者可以依據需要自行命名規則.這些規則都是存放在下面目錄 (檔名都必須以 .rules 為結尾.)

  • 系統 rule – /lib/udev/rules.d/
  • 使用者自訂 rule – /etc/udev/rules.d

先來看看系統預設 rule 的檔案 /lib/udev/rules.d/50-udev-default.rules 不建議修改任何值,可以自行產生新的 rules 檔並儲存在 /etc/udev/rules.d 目錄下.前面的數字 “50”(16 位元的數字) 是有其用意的,系統會依據數字的大小依序執行.

在撰寫 rule 時需一段完成,不可使用分段撰寫,可以使用 “#” 來當注釋.

50-udev-default.rules

我們來看一下 /etc/udev/rules.d/50-udev-default.rules 內容有點多,只截取關於 tty 序列埠裝置的定義來說明.

root@ubuntu:~# cat /lib/udev/rules.d/50-udev-default.rules | grep -i tty
SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty"
KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"

tty 的裝置的權限會被設定成為 0666 .

SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"

tty0*~tty9* 的裝置權限都會設定成為 0620 .
[] – 符合[]內指定的任何一個字元.
* 符合所以的字元可以是 0 個也可以是多個.

SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
root@ubuntu:~# ll /dev/tty0
crw--w---- 1 root tty 4, 0 Jun 19 19:10 /dev/tty0
root@ubuntu:~# ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 19 19:35 /dev/tty

60-persistent-storage.rules

再來看一下關於硬碟的 rule – /lib/udev/rules.d/60-persistent-storage.rules ,裡面定義了硬碟 persistent storage links: /dev/disk/{by-id,by-uuid,by-label,by-path} , 內容有點多,只截取關於 /dev/disk/by-path 來說明

root@ubuntu:~# cat /lib/udev/rules.d/60-persistent-storage.rules |grep -i path
# persistent storage links: /dev/disk/{by-id,by-uuid,by-label,by-path}
# by-path
ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id"
ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"
ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"

我的系統上有 sda , sdb ,sr0(光碟),依據上面的 rule 會在 /dev/disk 下產生相對應的連結裝置.最終的連結還是會連結到真實的裝置.

root@ubuntu:~# ll /dev/disk/by-path/
total 0
drwxr-xr-x 2 root root 160 Jun 19 19:10 ./
drwxr-xr-x 5 root root 100 Jun 19 19:10 ../
lrwxrwxrwx 1 root root   9 Jun 19 19:10 pci-0000:00:10.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root  10 Jun 19 19:10 pci-0000:00:10.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root  10 Jun 19 19:10 pci-0000:00:10.0-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root  10 Jun 19 19:10 pci-0000:00:10.0-scsi-0:0:0:0-part5 -> ../../sda5
lrwxrwxrwx 1 root root   9 Jun 19 19:10 pci-0000:00:10.0-scsi-0:0:1:0 -> ../../sdb
lrwxrwxrwx 1 root root   9 Jun 19 19:10 pci-0000:02:05.0-ata-2 -> ../../sr0

剛剛我們看到 rules 的撰寫但是其中寫了很多的規則,系統是依據什麼做比對呢!!現在我們直接用 udev 提供的指令 #udevadm (舊指令為 #udevinfo -ap) 來看 /sys/block/sda 的硬碟裝置 (請依據自己實際想觀察的裝置名稱作修改).

root@ubuntu:~# udevadm info --query=all --name=sda
P: /devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
N: sda
S: disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: DEVLINKS=/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: DEVNAME=/dev/sda
E: DEVPATH=/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
E: DEVTYPE=disk
E: ID_BUS=scsi
E: ID_MODEL=VMware_Virtual_S
E: ID_MODEL_ENC=VMware\x20Virtual\x20S
E: ID_PART_TABLE_TYPE=dos
E: ID_PART_TABLE_UUID=ddcb3e72
E: ID_PATH=pci-0000:00:10.0-scsi-0:0:0:0
E: ID_PATH_TAG=pci-0000_00_10_0-scsi-0_0_0_0
E: ID_REVISION=1.0
E: ID_SCSI=1
E: ID_TYPE=disk
E: ID_VENDOR=VMware_
E: ID_VENDOR_ENC=VMware\x2c\x20
E: MAJOR=8
E: MINOR=0
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=2468612

筆對一下 60-persistent-storage.rules ,sda 符合 DEVTYPE==disk 條件.

ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"

所以這個 rule 會幫我們產生 SYMLINK+=”disk/by-path/$env{ID_PATH}” 裝置 (透過剛剛的 udevadm 指令可以查出 ID_PATH 的定義)

root@ubuntu:~# ll /dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
lrwxrwxrwx 1 root root   9 Jun 19 19:10 pci-0000:00:10.0-scsi-0:0:0:0 -> ../../sda

其他 sda1 , sda2 ,sda5 也都可以透過 udevadm 來觀察,就可以對應出不同的裝置名稱.

其他跟硬碟相關的裝置名稱 by-id, by-uuid, by-label 也都是透過類似的方式定義出來的.

root@ubuntu:~# ll /dev/disk
total 0
drwxr-xr-x  5 root root  100 Jun 19 23:51 ./
drwxr-xr-x 20 root root 4100 Jun 19 23:51 ../
drwxr-xr-x  2 root root   60 Jun 19 23:51 by-id/
drwxr-xr-x  2 root root  160 Jun 19 23:51 by-path/
drwxr-xr-x  2 root root   80 Jun 19 23:51 by-uuid/

One Reply to “udev 裝置命名規則”

  1. 自動參照通知: Linux – udev | Benjr.tw

發表迴響