磁盘引导对于我们使用windows的朋友来讲是非常的简单了,但在linux中有些复杂了,下文小编就为各位介绍udev控制磁盘引导顺序配置.
vmware EXSi 虚拟化组的兄弟在对一台虚拟机主新增了N块磁盘后,重启后发现主机引导后分区的顺序发生了变化,导致各个挂载点下挂载的文件和之前不一致了,当时给出的解决方法是在/etc/fstab文件中使用uuid,因为UUID不会变化.
一、uuid 与挂载点
1、使用blkid命令获取UUID,代码如下:
- [root@361way~]#blkid
- /dev/sda1:SEC_TYPE="msdos"UUID="F159-EA55"TYPE="vfat"PARTLABEL="EFISystemPartition"PARTUUID="ed7d2e13-8197-4226-8fdc-47d4aa64aebb"
- /dev/sda2:LABEL="boot"UUID="f7755604-99f2-4d94-ab1a-47b14def7e26"TYPE="xfs"PARTUUID="627c028f-bf10-4705-b465-d5118d8ee67d"
- /dev/sda3:UUID="Bs0vJv-cena-E9eO-2WcM-iJNQ-26Mr-fGG1pr"TYPE="LVM2_member"PARTUUID="18c50ff9-0e0d-40ac-8e2a-4f7f768347ed"
- /dev/mapper/cl-root:UUID="b2f57437-ba99-4a2d-9c82-a41037aa0e38"TYPE="xfs"
- /dev/mapper/cl-swap:UUID="2930b30d-3039-442d-a210-da1d7775652e"TYPE="swap"
- /dev/mapper/cl-data:LABEL="data"UUID="cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5"TYPE="xfs"
2、查看/dev目录获取UUID,代码如下:
- [root@361way~]#ll/dev/disk/by-uuid/
- 总用量0
- lrwxrwxrwx1rootroot1011月2519:562930b30d-3039-442d-a210-da1d7775652e->../../dm-1
- lrwxrwxrwx1rootroot1011月2519:56b2f57437-ba99-4a2d-9c82-a41037aa0e38->../../dm-0
- lrwxrwxrwx1rootroot1011月2519:56cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5->../../dm-2
- lrwxrwxrwx1rootroot1011月2519:56F159-EA55->../../sda1
- lrwxrwxrwx1rootroot1011月2519:56f7755604-99f2-4d94-ab1a-47b14def7e26->../../sda2
3、修改/etc/fstab文件,使用uuid,代码如下:
- [root@361way~]#cat/etc/fstab
- #
- #/etc/fstab
- #CreatedbyanacondaonMonSep816:38:292014
- #
- #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk'
- #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo
- #
- /dev/mapper/cl-root/xfsdefaults11
- UUID=f7755604-99f2-4d94-ab1a-47b14def7e26/bootxfsdefaults12//phpfensi.com
- UUID=F159-EA55/boot/efivfatumask=0077,shortname=winnt00
- /dev/mapper/cl-data/dataxfsdefaults,noatime,nobarrier12
- /dev/mapper/cl-swapswapswapdefaults00
按上面的方法修改后,重启主机,发现所有的挂载点都正常了.
二、使用udev调整磁盘顺序
一天数据库侧的兄弟又问起sdb、sdc、sde多个磁盘名增加后会乱的问题,后来在自己的虚拟机上又尝试使用udev解决该问题,参考snipplr网站,代码如下:
- (makesurebothdevicesareunmounted)
- #cat/proc/partitions
- #cd/dev
- #rmsda,sdb
- #mknod/dev/sdab#fillwithmajorandminordevicesobtainedfrom/proc/partitionsforsdb
- #mknod/dev/sdbb80#verifythesemajor,minorvaluesforsdain/proc/partitions
- #partprobe/dev/sda
- #hdparm-z/dev/sda
- #sfdisk-R/dev/sda
- #blockdev--rereadpt/dev/sda
- (repeatthelast4commandsforsdb)
- Alternativelyandtomakeitpermanent:
- createthefile/etc/udev/rules.d/10-local.ruleswiththefollowingcontent:
- KERNEL=="sda",NAME="sdb"
- KERNEL=="sdb",NAME="sda"
- (endoffile)
- andthen:
- #serviceudevrestart
- #udevadmcontrol--reload-rules
- #udevadmtrigger
1、查看本机的磁盘,代码如下:
- [root@localhostrules.d]#fdisk-l
- Disk/dev/vda:21.5GB,21474836480bytes
- 16heads,63sectors/track,41610cylinders
- Units=cylindersof1008*512=516096bytes
- Sectorsize(logical/physical):512bytes/512bytes
- I/Osize(minimum/optimal):512bytes/512bytes
- Diskidentifier:0x0001bcdb
- DeviceBootStartEndBlocksIdSystem
- /dev/vda1*3101851200083Linux
- Partition1doesnotendoncylinderboundary.
- /dev/vda2101841611204584968eLinuxLVM
- Partition2doesnotendoncylinderboundary.
- Disk/dev/vdb:1073MB,1073741824bytes
- 16heads,63sectors/track,2080cylinders
- Units=cylindersof1008*512=516096bytes
- Sectorsize(logical/physical):512bytes/512bytes
- I/Osize(minimum/optimal):512bytes/512bytes
- Diskidentifier:0x00000000
- Disk/dev/vdc:2147MB,2147483648bytes
- 16heads,63sectors/track,4161cylinders
- Units=cylindersof1008*512=516096bytes
- Sectorsize(logical/physical):512bytes/512bytes
- I/Osize(minimum/optimal):512bytes/512bytes
- Diskidentifier:0x00000000
可以看到一个大小为1G的vdb磁盘和一个大小为2G的vdc磁盘.
2、创建rule文件,在/etc/udev/rules.d/创建一个rule文件,具体内容如下:
- #cat10-local.rules
- KERNEL=="vdb",NAME="vdc"
- KERNEL=="vdc",NAME="vdb"
3、使用udevadm命令重载rule文件,代码如下:
- #udevadmcontrol--reload-rules
- #udevadmtrigger
4、再查看本地磁盘,代码如下:
- [root@localhost~]#fdisk-l
- Disk/dev/vda:21.5GB,21474836480bytes
- 16heads,63sectors/track,41610cylinders
- Units=cylindersof1008*512=516096bytes
- Sectorsize(logical/physical):512bytes/512bytes
- I/Osize(minimum/optimal):512bytes/512bytes
- Diskidentifier:0x0001bcdb
- DeviceBootStartEndBlocksIdSystem
- /dev/vda1*3101851200083Linux
- Partition1doesnotendoncylinderboundary.
- /dev/vda2101841611204584968eLinuxLVM
- Partition2doesnotendoncylinderboundary.
- Disk/dev/vdb:2147MB,2147483648bytes
- 16heads,63sectors/track,4161cylinders
- Units=cylindersof1008*512=516096bytes
- Sectorsize(logical/physical):512bytes/512bytes
- I/Osize(minimum/optimal):512bytes/512bytes
- Diskidentifier:0x00000000
- Disk/dev/vdc:1073MB,1073741824bytes
- 16heads,63sectors/track,2080cylinders
- Units=cylindersof1008*512=516096bytes
- Sectorsize(logical/physical):512bytes/512bytes
- I/Osize(minimum/optimal):512bytes/512bytes
- 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} 表示该设备(磁盘)的大小.
- $env{key},%E{key}:一个环境变量的值。
- $major,%M:设备的major号。
- $minor%m:设备的minor号。
- $result,%c:PROGRAM返回的结果。
- $parent,%P:父设备的设备文件名。
- $root,%r:udev_root的值,默认是/dev/。
- $tempnode,%N:临时设备名。
- %%:符号%本身。
- $$:符号$本身。
四、udevadm与rule
通过udevadm查看磁盘或分区信息,代码如下:
- [root@localhostrules.d]#udevadminfo-a-p/sys/block/vdb
- Udevadminfostartswiththedevicespecifiedbythedevpathandthen
- walksupthechainofparentdevices.Itprintsforeverydevice
- found,allpossibleattributesintheudevruleskeyformat.
- Aruletomatch,canbecomposedbytheattributesofthedevice
- andtheattributesfromonesingleparentdevice.
- lookingatdevice'/devices/pci0000:00/0000:00:06.0/virtio3/block/vdb':
- KERNEL=="vdb"
- SUBSYSTEM=="block"
- DRIVER==""
- ATTR{range}=="16"
- ATTR{ext_range}=="16"
- ATTR{removable}=="0"
- ATTR{ro}=="0"
- ATTR{size}=="2097152"
- ATTR{alignment_offset}=="0"
- ATTR{discard_alignment}=="0"
- ATTR{capability}=="10"
- ATTR{stat}=="27613231280000088"
- ATTR{inflight}=="00"
- ATTR{serial}==""
- lookingatparentdevice'/devices/pci0000:00/0000:00:06.0/virtio3':
- KERNELS=="virtio3"
- SUBSYSTEMS=="virtio"
- DRIVERS=="virtio_blk"
- ATTRS{device}=="2"
- ATTRS{vendor}=="6900"
- ATTRS{status}=="0x00000007"
- ATTRS{modalias}=="virtio:d00000002v00001AF4"
- ATTRS{features}=="0010101101100000000000000000110000000000000000000000000000000000"
- lookingatparentdevice'/devices/pci0000:00/0000:00:06.0':
- KERNELS=="0000:00:06.0"
- SUBSYSTEMS=="pci"
- DRIVERS=="virtio-pci"
- ATTRS{vendor}=="0x1af4"
- ATTRS{device}=="0x1001"
- ATTRS{subsystem_vendor}=="0x1af4"
- ATTRS{subsystem_device}=="0x0002"
- ATTRS{class}=="0x010000"
- ATTRS{irq}=="11"
- ATTRS{local_cpus}=="1"
- ATTRS{local_cpulist}=="0"
- ATTRS{modalias}=="pci:v00001AF4d00001001sv00001AF4sd00000002bc01sc00i00"
- ATTRS{numa_node}=="-1"
- ATTRS{enable}=="1"
- ATTRS{broken_parity_status}=="0"
- ATTRS{msi_bus}==""
- lookingatparentdevice'/devices/pci0000:00':
- KERNELS=="pci0000:00"
- SUBSYSTEMS==""
- DRIVERS==""
如有多块磁盘,其中又有大小相同的,可以通过其他条件进行区分,如rules里可以这样写:
- SUBSYSTEM=="block",ATTR{size}=="234441648",NAME="my_hard_disk"
- SUBSYSTEM=="block",SUBSYSTEMS=="scsi",ATTRS{model}=="ST3120827AS",NAME="my_hard_disk"
- KERNEL=="sda1"ATTR{size}=="2096753"NAME="asm_ocr"
注:一些老版本的udev里包里没有udevadm,使用的是udevinfo命令.
五、uedv与asm 磁盘rule
1、scsi_id 获取磁盘UUID,代码如下:
- [root@localhost~]#/sbin/scsi_id-g-u/dev/sdb
- 3690b11c0002be80e00000ce3514380db
- [root@localhost~]#/sbin/scsi_id-g-u/dev/sdc
- 3690b11c0002be80e00000ce5514380f8
- [root@localhost~]#/sbin/scsi_id-g-u/dev/sdd
- 3690b11c0002be80e00000ce75143810c
- //phpfensi.com
新版本中的scsi_id命令位于/usr/lib/udev/scsi_id.
2、asm rule规则,代码如下:
- #cat/etc/udev/rules.d/99-Oracle-asmdevices.rules
- KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id-g-u-d/dev/$parent",
- RESULT=="3690b11c0002be80e00000ce3514380db",
- NAME="asm-crs01",OWNER="grid",GROUP="asmadmin",MODE="0660"
- KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id-g-u-d/dev/$parent",
- RESULT=="3690b11c0002be80e00000ce5514380f8",
- NAME="asm-data01",OWNER="grid",GROUP="asmadmin",MODE="0660"
- KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id-g-u-d/dev/$parent",
- RESULT=="3690b11c0002be80e00000ce75143810c",
- NAME="asm-data02",OWNER="grid",GROUP="asmadmin",MODE="0660"
3、重启udev服务,代码如下:
- [root@localhostrules.d]#/sbin/partprobe/dev/sdb1
- [root@localhostrules.d]#/sbin/partprobe/dev/sdc1
- [root@localhostrules.d]#/sbin/partprobe/dev/sdd1
- [root@localhostrules.d]#/sbin/start_udev
4、查看asm设备,代码如下:
- [root@localhostrules.d]#ll/dev/asm*
- brw-rw----.1rootroot8,173月2711:30/dev/asm-crs01
- brw-rw----.1rootroot8,333月2711:30/dev/asm-data01
- brw-rw----.1rootroot8,493月2711:30/dev/asm-data02
在centos7/redhat7 版本中的udev已不再单独是一个包,而是在systemd包中包含了udev工具,rule规则除了/etc/udev/rules.d目录,还有/usr/lib/udev/rules.d/ 目录.