測試環境為 Ubuntu16.04 x86_64
前面 什麼是 udev? https://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/
硬碟的裝置名稱 device name 與 major , minor number ,每一次開機後可能會改變 , 原因請參考 – https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/persistent_naming
你好版主 想請教一下
我是用virtual box-ubuntu ,預設的內容很少 也沒有persistent-storage.rules,為什麼用udevadm做info查詢還是找的到sda的資訊呢?
/etc/udev/rules.d 底下有60-vboxadd.rules , 70-persistent-cd.rules , 70-persistent-net.rules
60-vboxadd.rules:
KERNEL==”vboxguest”, NAME=”vboxguest”, OWNER=”vboxadd”, MODE=”0660″
KERNEL==”vboxuser”, NAME=”vboxuser”, OWNER=”vboxadd”, MODE=”0666″
70-persistent-cd.rules:
SUBSYSTEM==”block”, ENV{ID_CDROM}==”?*”, ENV{ID_PATH}==”pci-0000:00:01.1-scsi-0:0:0:0″, SYMLINK+=”cdrom”, ENV{GENERATED}=”1″
SUBSYSTEM==”block”, ENV{ID_CDROM}==”?*”, ENV{ID_PATH}==”pci-0000:00:01.1-scsi-0:0:0:0″, SYMLINK+=”dvd”, ENV{GENERATED}=”1″
# VBOX_CD-ROM (pci-0000:00:01.1-scsi-0:0:0:0)
SUBSYSTEM==”block”, ENV{ID_CDROM}==”?*”, ENV{ID_PATH}==”pci-0000:00:01.1-scsi-0:0:0:0″, SYMLINK+=”cdrom1″, ENV{GENERATED}=”1″
SUBSYSTEM==”block”, ENV{ID_CDROM}==”?*”, ENV{ID_PATH}==”pci-0000:00:01.1-scsi-0:0:0:0″, SYMLINK+=”dvd1″, ENV{GENERATED}=”1″
70-persistent-net.rules :
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”08:00:27:97:ad:5e”, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth0″
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”08:00:27:2e:24:57″, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”eth*”, NAME=”eth1″
結果有一大堆rules在/lib/udev/rules.d底下