linux中udev控制磁盘引导顺序配置

卢松松博客 关注创业者、自媒体人和站长的网站

磁盘引导对于我们使用windows的朋友来讲是非常的简单了,但在linux中有些复杂了,下文小编就为各位介绍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="EFISystemPartition"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. lrwxrwxrwx1rootroot1011月2519:562930b30d-3039-442d-a210-da1d7775652e->../../dm-1
  4. lrwxrwxrwx1rootroot1011月2519:56b2f57437-ba99-4a2d-9c82-a41037aa0e38->../../dm-0
  5. lrwxrwxrwx1rootroot1011月2519:56cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5->../../dm-2
  6. lrwxrwxrwx1rootroot1011月2519:56F159-EA55->../../sda1
  7. lrwxrwxrwx1rootroot1011月2519:56f7755604-99f2-4d94-ab1a-47b14def7e26->../../sda2

3、修改/etc/fstab文件,使用uuid,代码如下:

  1. [root@361way~]#cat/etc/fstab
  2. #
  3. #/etc/fstab
  4. #CreatedbyanacondaonMonSep816:38:292014
  5. #
  6. #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk'
  7. #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo
  8. #
  9. /dev/mapper/cl-root/xfsdefaults11
  10. UUID=f7755604-99f2-4d94-ab1a-47b14def7e26/bootxfsdefaults12//phpfensi.com
  11. UUID=F159-EA55/boot/efivfatumask=0077,shortname=winnt00
  12. /dev/mapper/cl-data/dataxfsdefaults,noatime,nobarrier12
  13. /dev/mapper/cl-swapswapswapdefaults00

按上面的方法修改后,重启主机,发现所有的挂载点都正常了.

二、使用udev调整磁盘顺序

一天数据库侧的兄弟又问起sdb、sdc、sde多个磁盘名增加后会乱的问题,后来在自己的虚拟机上又尝试使用udev解决该问题,参考snipplr网站,代码如下:

  1. (makesurebothdevicesareunmounted)
  2. #cat/proc/partitions
  3. #cd/dev
  4. #rmsda,sdb
  5. #mknod/dev/sdab#fillwithmajorandminordevicesobtainedfrom/proc/partitionsforsdb
  6. #mknod/dev/sdbb80#verifythesemajor,minorvaluesforsdain/proc/partitions
  7. #partprobe/dev/sda
  8. #hdparm-z/dev/sda
  9. #sfdisk-R/dev/sda
  10. #blockdev--rereadpt/dev/sda
  11. (repeatthelast4commandsforsdb)
  12. Alternativelyandtomakeitpermanent:
  13. createthefile/etc/udev/rules.d/10-local.ruleswiththefollowingcontent:
  14. KERNEL=="sda",NAME="sdb"
  15. KERNEL=="sdb",NAME="sda"
  16. (endoffile)
  17. andthen:
  18. #serviceudevrestart
  19. #udevadmcontrol--reload-rules
  20. #udevadmtrigger

1、查看本机的磁盘,代码如下:

  1. [root@localhostrules.d]#fdisk-l
  2. Disk/dev/vda:21.5GB,21474836480bytes
  3. 16heads,63sectors/track,41610cylinders
  4. Units=cylindersof1008*512=516096bytes
  5. Sectorsize(logical/physical):512bytes/512bytes
  6. I/Osize(minimum/optimal):512bytes/512bytes
  7. Diskidentifier:0x0001bcdb
  8. DeviceBootStartEndBlocksIdSystem
  9. /dev/vda1*3101851200083Linux
  10. Partition1doesnotendoncylinderboundary.
  11. /dev/vda2101841611204584968eLinuxLVM
  12. Partition2doesnotendoncylinderboundary.
  13. Disk/dev/vdb:1073MB,1073741824bytes
  14. 16heads,63sectors/track,2080cylinders
  15. Units=cylindersof1008*512=516096bytes
  16. Sectorsize(logical/physical):512bytes/512bytes
  17. I/Osize(minimum/optimal):512bytes/512bytes
  18. Diskidentifier:0x00000000
  19. Disk/dev/vdc:2147MB,2147483648bytes
  20. 16heads,63sectors/track,4161cylinders
  21. Units=cylindersof1008*512=516096bytes
  22. Sectorsize(logical/physical):512bytes/512bytes
  23. I/Osize(minimum/optimal):512bytes/512bytes
  24. Diskidentifier:0x00000000

可以看到一个大小为1G的vdb磁盘和一个大小为2G的vdc磁盘.

2、创建rule文件,在/etc/udev/rules.d/创建一个rule文件,具体内容如下:

  1. #cat10-local.rules
  2. KERNEL=="vdb",NAME="vdc"
  3. KERNEL=="vdc",NAME="vdb"

3、使用udevadm命令重载rule文件,代码如下:

  1. #udevadmcontrol--reload-rules
  2. #udevadmtrigger

4、再查看本地磁盘,代码如下:

  1. [root@localhost~]#fdisk-l
  2. Disk/dev/vda:21.5GB,21474836480bytes
  3. 16heads,63sectors/track,41610cylinders
  4. Units=cylindersof1008*512=516096bytes
  5. Sectorsize(logical/physical):512bytes/512bytes
  6. I/Osize(minimum/optimal):512bytes/512bytes
  7. Diskidentifier:0x0001bcdb
  8. DeviceBootStartEndBlocksIdSystem
  9. /dev/vda1*3101851200083Linux
  10. Partition1doesnotendoncylinderboundary.
  11. /dev/vda2101841611204584968eLinuxLVM
  12. Partition2doesnotendoncylinderboundary.
  13. Disk/dev/vdb:2147MB,2147483648bytes
  14. 16heads,63sectors/track,4161cylinders
  15. Units=cylindersof1008*512=516096bytes
  16. Sectorsize(logical/physical):512bytes/512bytes
  17. I/Osize(minimum/optimal):512bytes/512bytes
  18. Diskidentifier:0x00000000
  19. Disk/dev/vdc:1073MB,1073741824bytes
  20. 16heads,63sectors/track,2080cylinders
  21. Units=cylindersof1008*512=516096bytes
  22. Sectorsize(logical/physical):512bytes/512bytes
  23. I/Osize(minimum/optimal):512bytes/512bytes
  24. Diskidentifier:0x00000000

再查看发现vdb变成了2G,vdc变成了1G大小.

三、udev规则相关

1、udev规则操作符

“==”:比较键、值,若等于,则该条件满足.

“!=”:比较键、值,若不等于,则该条件满足.

“=”:对一个键赋值.

“+=”:为一个表示多个条目的键赋值.

“:=”:对一个键赋值,并拒绝之后所有对该键的改动,目的是防止后面的规则文件对该键赋值.

2、udev规则的匹配键

ACTION:事件(uevent)的行为,例如:add(添加设备)、remove(删除设备).

KERNEL:内核设备名称,例如:sda,cdrom.

DEVPATH:设备的 devpath 路径.

SUBSYSTEM:设备的子系统名称,例如:sda 的子系统为 block.

BUS:设备在 devpath 里的总线名称,例如:usb.

DRIVER:设备在 devpath 里的设备驱动名称,例如:ide-cdrom。

ID:设备在 devpath 里的识别号。

SYSFS{filename}:设备的 devpath 路径下,设备的属性文件“filename”里的内容.

ENV{key}:环境变量,在一条规则中,可以设定最多五条环境变量的 匹配键.

PROGRAM:调用外部命令.

RESULT:外部命令 PROGRAM 的返回结果.

3、udev重要的赋值键

NAME:在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。

SYMLINK:为 /dev/下的设备文件产生符号链接,由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接.

OWNER,GROUP,MODE:为设备设定权限.

ENV{key}:导入一个环境变量

4、udev 的值和可调用的替换操作符.

$kernel,%k:设备的内核设备名称,例如:sda、cdrom.

$number,%n:设备的内核号码,例如:sda3 的内核号码是 3.

$devpath,%p:设备的 devpath路径.

$id,%b:设备在 devpath里的 ID 号.

$sysfs{file},%s{file}:设备的 sysfs里 file 的内容,其实就是设备的属性值.

例如:$sysfs{size} 表示该设备(磁盘)的大小.

  1. $env{key},%E{key}:一个环境变量的值。
  2. $major,%M:设备的major号。
  3. $minor%m:设备的minor号。
  4. $result,%c:PROGRAM返回的结果。
  5. $parent,%P:父设备的设备文件名。
  6. $root,%r:udev_root的值,默认是/dev/。
  7. $tempnode,%N:临时设备名。
  8. %%:符号%本身。
  9. $$:符号$本身。

四、udevadm与rule

通过udevadm查看磁盘或分区信息,代码如下:

  1. [root@localhostrules.d]#udevadminfo-a-p/sys/block/vdb
  2. Udevadminfostartswiththedevicespecifiedbythedevpathandthen
  3. walksupthechainofparentdevices.Itprintsforeverydevice
  4. found,allpossibleattributesintheudevruleskeyformat.
  5. Aruletomatch,canbecomposedbytheattributesofthedevice
  6. andtheattributesfromonesingleparentdevice.
  7. lookingatdevice'/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}=="27613231280000088"
  20. ATTR{inflight}=="00"
  21. ATTR{serial}==""
  22. lookingatparentdevice'/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. lookingatparentdevice'/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. lookingatparentdevice'/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
  7. //phpfensi.com

新版本中的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@localhostrules.d]#/sbin/partprobe/dev/sdb1
  2. [root@localhostrules.d]#/sbin/partprobe/dev/sdc1
  3. [root@localhostrules.d]#/sbin/partprobe/dev/sdd1
  4. [root@localhostrules.d]#/sbin/start_udev

4、查看asm设备,代码如下:

  1. [root@localhostrules.d]#ll/dev/asm*
  2. brw-rw----.1rootroot8,173月2711:30/dev/asm-crs01
  3. brw-rw----.1rootroot8,333月2711:30/dev/asm-data01
  4. brw-rw----.1rootroot8,493月2711:30/dev/asm-data02

在centos7/redhat7 版本中的udev已不再单独是一个包,而是在systemd包中包含了udev工具,rule规则除了/etc/udev/rules.d目录,还有/usr/lib/udev/rules.d/ 目录.

相关广告
  • linux中udev控制磁盘引导顺序配置 linux中udev控制磁盘引导顺序配置 linux中udev控制磁盘引导顺序配置
相关阅读

linux中udev控制磁盘引导顺序配置

2019/10/10 17:45:48 | 谷歌SEO算法 | SEO教程