udev控制磁碟引導順序

startay發表於2015-12-29
--udev控制磁碟引導順序

vmware EXSi 虛擬化組的兄弟在對一臺虛擬機器主新增了N塊磁碟後,重啟後發現主機引導後分割槽的順序發生了變化,導致各個掛載點下掛載的檔案和之前不一致了。當時給出的解決方法是在/etc/fstab檔案中使用uuid,因為UUID不會變化。

一、使用uuid 掛載點固定磁碟

1、使用blkid命令獲取UUID
  1. [root@361way ~]# blkid
  2. /dev/sda1: SEC_TYPE="msdos" UUID="F159-EA55" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="ed7d2e13-8197-4226-8fdc-47d4aa64aebb"
  3. /dev/sda2: LABEL="boot" UUID="f7755604-99f2-4d94-ab1a-47b14def7e26" TYPE="xfs" PARTUUID="627c028f-bf10-4705-b465-d5118d8ee67d"
  4. /dev/sda3: UUID="Bs0vJv-cena-E9eO-2WcM-iJNQ-26Mr-fGG1pr" TYPE="LVM2_member" PARTUUID="18c50ff9-0e0d-40ac-8e2a-4f7f768347ed"
  5. /dev/mapper/cl-root: UUID="b2f57437-ba99-4a2d-9c82-a41037aa0e38" TYPE="xfs"
  6. /dev/mapper/cl-swap: UUID="2930b30d-3039-442d-a210-da1d7775652e" TYPE="swap"
  7. /dev/mapper/cl-data: LABEL="data" UUID="cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5" TYPE="xfs"
2、檢視/dev目錄獲取UUID
  1. [root@361way ~]# ll /dev/disk/by-uuid/
  2. 總用量 0
  3. lrwxrwxrwx 1 root root 10 11月 25 19:56 2930b30d-3039-442d-a210-da1d7775652e -> ../../dm-1
  4. lrwxrwxrwx 1 root root 10 11月 25 19:56 b2f57437-ba99-4a2d-9c82-a41037aa0e38 -> ../../dm-0
  5. lrwxrwxrwx 1 root root 10 11月 25 19:56 cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5 -> ../../dm-2
  6. lrwxrwxrwx 1 root root 10 11月 25 19:56 F159-EA55 -> ../../sda1
  7. lrwxrwxrwx 1 root root 10 11月 25 19:56 f7755604-99f2-4d94-ab1a-47b14def7e26 -> ../../sda2
3、修改/etc/fstab檔案,使用uuid
  1. [root@361way ~]# cat /etc/fstab
  2. #
  3. # /etc/fstab
  4. # Created by anaconda on Mon Sep 8 16:38:29 2014
  5. #
  6. # Accessible filesystems, by reference, are maintained under '/dev/disk'
  7. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
  8. #
  9. /dev/mapper/cl-root / xfs defaults 1 1
  10. UUID=f7755604-99f2-4d94-ab1a-47b14def7e26 /boot xfs defaults 1 2
  11. UUID=F159-EA55 /boot/efi vfat umask=0077,shortname=winnt 0 0
  12. /dev/mapper/cl-data /data xfs defaults,noatime,nobarrier 1 2
  13. /dev/mapper/cl-swap swap swap defaults 0 0
按上面的方法修改後,重啟主機 ,發現所有的掛載點都正常了。


二、使用udev調整磁碟順序
可參考snipplr網站http://snipplr.com/view/80310/replace-devsda-with-devsdb-device-name-assignment/

1、檢視本機的磁碟

  1. [root@localhost rules.d]# fdisk -l
  2. Disk /dev/vda: 21.5 GB, 21474836480 bytes
  3. 16 heads, 63 sectors/track, 41610 cylinders
  4. Units = cylinders of 1008 * 512 = 516096 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disk identifier: 0x0001bcdb
  8.    Device Boot Start End Blocks Id System
  9. /dev/vda1 * 3 1018 512000 83 Linux
  10. Partition 1 does not end on cylinder boundary.
  11. /dev/vda2 1018 41611 20458496 8e Linux LVM
  12. Partition 2 does not end on cylinder boundary.
  13. Disk /dev/vdb: 1073 MB, 1073741824 bytes    --vdb 1G
  14. 16 heads, 63 sectors/track, 2080 cylinders
  15. Units = cylinders of 1008 * 512 = 516096 bytes
  16. Sector size (logical/physical): 512 bytes / 512 bytes
  17. I/O size (minimum/optimal): 512 bytes / 512 bytes
  18. Disk identifier: 0x00000000
  19. Disk /dev/vdc: 2147 MB, 2147483648 bytes    --vdc 2G
  20. 16 heads, 63 sectors/track, 4161 cylinders
  21. Units = cylinders of 1008 * 512 = 516096 bytes
  22. Sector size (logical/physical): 512 bytes / 512 bytes
  23. I/O size (minimum/optimal): 512 bytes / 512 bytes
  24. Disk identifier: 0x00000000
可以看到一個大小為1G的vdb磁碟和一個大小為2G的vdc磁碟。

2、建立rule檔案
在/etc/udev/rules.d/建立一個rule檔案,具體內容如下
  1. # cat 10-local.rules
  2. KERNEL=="vdb", NAME="vdc"
  3. KERNEL=="vdc", NAME="vdb"
3、使用udevadm命令過載rule檔案
  1. # udevadm control --reload-rules
  2. # udevadm trigger
4、再檢視本地磁碟
  1. [root@localhost ~]# fdisk -l
  2. Disk /dev/vda: 21.5 GB, 21474836480 bytes
  3. 16 heads, 63 sectors/track, 41610 cylinders
  4. Units = cylinders of 1008 * 512 = 516096 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disk identifier: 0x0001bcdb
  8.    Device Boot Start End Blocks Id System
  9. /dev/vda1 * 3 1018 512000 83 Linux
  10. Partition 1 does not end on cylinder boundary.
  11. /dev/vda2 1018 41611 20458496 8e Linux LVM
  12. Partition 2 does not end on cylinder boundary.
  13. Disk /dev/vdb: 2147 MB, 2147483648 bytes      --vdb已變成2G
  14. 16 heads, 63 sectors/track, 4161 cylinders
  15. Units = cylinders of 1008 * 512 = 516096 bytes
  16. Sector size (logical/physical): 512 bytes / 512 bytes
  17. I/O size (minimum/optimal): 512 bytes / 512 bytes
  18. Disk identifier: 0x00000000
  19. Disk /dev/vdc: 1073 MB, 1073741824 bytes      --vdc已變成1G
  20. 16 heads, 63 sectors/track, 2080 cylinders
  21. Units = cylinders of 1008 * 512 = 516096 bytes
  22. Sector size (logical/physical): 512 bytes / 512 bytes
  23. I/O size (minimum/optimal): 512 bytes / 512 bytes
  24. Disk identifier: 0x00000000
再檢視發現vdb變成了2G,vdc變成了1G大小。


三、udev規則相關

1、udev規則運算子
  1. ==”:比較鍵、值,若等於,則該條件滿足;
  2. “!=”: 比較鍵、值,若不等於,則該條件滿足;
  3. =”: 對一個鍵賦值;
  4. +=”:為一個表示多個條目的鍵賦值。
  5. :=”:對一個鍵賦值,並拒絕之後所有對該鍵的改動。目的是防止後面的規則檔案對該鍵賦值。
2、udev規則的匹配鍵
  1. ACTION: 事件 (uevent) 的行為,例如:add( 新增裝置 )、remove( 刪除裝置 )
  2. KERNEL: 核心裝置名稱,例如:sda, cdrom。
  3. DEVPATH:裝置的 devpath 路徑。
  4. SUBSYSTEM: 裝置的子系統名稱,例如:sda 的子系統為 block。
  5. BUS: 裝置在 devpath 裡的匯流排名稱,例如:usb。
  6. DRIVER: 裝置在 devpath 裡的裝置驅動名稱,例如:ide-cdrom。
  7. ID: 裝置在 devpath 裡的識別號。
  8. SYSFS{filename}: 裝置的 devpath 路徑下,裝置的屬性檔案“filename”裡的內容。
  9. ENV{key}: 環境變數。在一條規則中,可以設定最多五條環境變數的 匹配鍵。
  10. PROGRAM:呼叫外部命令。
  11. RESULT: 外部命令 PROGRAM 的返回結果
3、udev重要的賦值鍵
  1. NAME:在 /dev下產生的裝置檔名。只有第一次對某個裝置的 NAME 的賦值行為生效,之後匹配的規則再對該裝置的 NAME 賦值行為將被忽略。如果沒有任何規則對裝置的 NAME 賦值,udev 將使用核心裝置名稱來產生裝置檔案。
  2. SYMLINK:為 /dev/下的裝置檔案產生符號連結。由於 udev 只能為某個裝置產生一個裝置檔案,所以為了不覆蓋系統預設的 udev 規則所產生的檔案,推薦使用符號連結。
  3. OWNER, GROUP, MODE:為裝置設定許可權。
  4. ENV{key}:匯入一個環境變數
4、udev 的值和可呼叫的替換運算子
  1. $kernel, %k:裝置的核心裝置名稱,例如:sda、cdrom。
  2. $number, %n:裝置的核心號碼,例如:sda3 的核心號碼是 3。
  3. $devpath, %p:裝置的 devpath路徑。
  4. $id, %b:裝置在 devpath裡的 ID 號。
  5. $sysfs{file}, %s{file}:裝置的 sysfs裡 file 的內容。其實就是裝置的屬性值。
  6. 例如:$sysfs{size} 表示該裝置 ( 磁碟 ) 的大小。
  7. $env{key}, %E{key}:一個環境變數的值。
  8. $major, %M:裝置的 major 號。
  9. $minor %m:裝置的 minor 號。
  10. $result, %c:PROGRAM 返回的結果。
  11. $parent, %P:父裝置的裝置檔名。
  12. $root, %r:udev_root的值,預設是 /dev/。
  13. $tempnode, %N:臨時裝置名。
  14. %%:符號 % 本身。
  15. $$:符號 $ 本身。

四、udevadm與rule

透過udevadm檢視磁碟或分割槽資訊:
  1. [root@localhost rules.d]# udevadm info -a -p /sys/block/vdb
  2. Udevadm info starts with the device specified by the devpath and then
  3. walks up the chain of parent devices. It prints for every device
  4. found, all possible attributes in the udev rules key format.
  5. A rule to match, can be composed by the attributes of the device
  6. and the attributes from one single parent device.
  7.   looking at device '/devices/pci0000:00/0000:00:06.0/virtio3/block/vdb':
  8.     KERNEL=="vdb"
  9.     SUBSYSTEM=="block"
  10.     DRIVER==""
  11.     ATTR{range}=="16"
  12.     ATTR{ext_range}=="16"
  13.     ATTR{removable}=="0"
  14.     ATTR{ro}=="0"
  15.     ATTR{size}=="2097152"
  16.     ATTR{alignment_offset}=="0"
  17.     ATTR{discard_alignment}=="0"
  18.     ATTR{capability}=="10"
  19.     ATTR{stat}==" 276 13 2312 8 0 0 0 0 0 8 8"
  20.     ATTR{inflight}==" 0 0"
  21.     ATTR{serial}==""
  22.   looking at parent device '/devices/pci0000:00/0000:00:06.0/virtio3':
  23.     KERNELS=="virtio3"
  24.     SUBSYSTEMS=="virtio"
  25.     DRIVERS=="virtio_blk"
  26.     ATTRS{device}=="2"
  27.     ATTRS{vendor}=="6900"
  28.     ATTRS{status}=="0x00000007"
  29.     ATTRS{modalias}=="virtio:d00000002v00001AF4"
  30.     ATTRS{features}=="0010101101100000000000000000110000000000000000000000000000000000"
  31.   looking at parent device '/devices/pci0000:00/0000:00:06.0':
  32.     KERNELS=="0000:00:06.0"
  33.     SUBSYSTEMS=="pci"
  34.     DRIVERS=="virtio-pci"
  35.     ATTRS{vendor}=="0x1af4"
  36.     ATTRS{device}=="0x1001"
  37.     ATTRS{subsystem_vendor}=="0x1af4"
  38.     ATTRS{subsystem_device}=="0x0002"
  39.     ATTRS{class}=="0x010000"
  40.     ATTRS{irq}=="11"
  41.     ATTRS{local_cpus}=="1"
  42.     ATTRS{local_cpulist}=="0"
  43.     ATTRS{modalias}=="pci:v00001AF4d00001001sv00001AF4sd00000002bc01sc00i00"
  44.     ATTRS{numa_node}=="-1"
  45.     ATTRS{enable}=="1"
  46.     ATTRS{broken_parity_status}=="0"
  47.     ATTRS{msi_bus}==""
  48.   looking at parent device '/devices/pci0000:00':
  49.     KERNELS=="pci0000:00"
  50.     SUBSYSTEMS==""
  51.     DRIVERS==""
如有多塊磁碟,其中又有大小相同的,可以透過其他條件進行區分,如rules裡可以這樣寫:

  1. SUBSYSTEM=="block", ATTR{size}=="234441648", NAME="my_hard_disk"
  2. SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="ST3120827AS", NAME="my_hard_disk"
  3. KERNEL=="sda1" ATTR{size}=="2096753" NAME="asm_ocr"
注:一些老版本的udev裡包裡沒有udevadm,使用的是udevinfo命令。


五、uedv與asm 磁碟rule

1、scsi_id 獲取磁碟UUID
  1. [root@localhost ~]# /sbin/scsi_id -g -u /dev/sdb
  2. 3690b11c0002be80e00000ce3514380db
  3. [root@localhost ~]# /sbin/scsi_id -g -u /dev/sdc
  4. 3690b11c0002be80e00000ce5514380f8
  5. [root@localhost ~]# /sbin/scsi_id -g -u /dev/sdd
  6. 3690b11c0002be80e00000ce75143810c
新版本中的scsi_id命令位於/usr/lib/udev/scsi_id 。

2、asm rule規則
  1. #cat /etc/udev/rules.d/99-Oracle-asmdevices.rules
  2. KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
  3. RESULT=="3690b11c0002be80e00000ce3514380db",
  4. NAME="asm-crs01", OWNER="grid",GROUP="asmadmin",MODE="0660"
  5. KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
  6. RESULT=="3690b11c0002be80e00000ce5514380f8",
  7. NAME="asm-data01", OWNER="grid",GROUP="asmadmin",MODE="0660"
  8. KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
  9. RESULT=="3690b11c0002be80e00000ce75143810c",
  10. NAME="asm-data02", OWNER="grid",GROUP="asmadmin",MODE="0660"
3、重啟udev服務
  1. [root@localhost rules.d]# /sbin/partprobe /dev/sdb1
  2. [root@localhost rules.d]# /sbin/partprobe /dev/sdc1
  3. [root@localhost rules.d]# /sbin/partprobe /dev/sdd1
  4. [root@localhost rules.d]# /sbin/start_udev
4、檢視asm裝置
  1. [root@localhost rules.d]# ll /dev/asm*
  2.  brw-rw----. 1 root root 8, 17 3月 27 11:30 /dev/asm-crs01
  3.  brw-rw----. 1 root root 8, 33 3月 27 11:30 /dev/asm-data01
  4.  brw-rw----. 1 root root 8, 49 3月 27 11:30 /dev/asm-data02

centos7/redhat7 版本中的udev已不再單獨是一個包,而是在systemd包中包含了udev工具。rule規則除了/etc/udev/rules.d目錄,還有/usr/lib/udev/rules.d/ 目錄。


本文轉自: http://www.361way.com/udev-disk-order/3954.html


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17086096/viewspace-1966497/,如需轉載,請註明出處,否則將追究法律責任。

相關文章