--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="EFI System Partition" 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
-
lrwxrwxrwx 1 root root 10 11月 25 19:56 2930b30d-3039-442d-a210-da1d7775652e -> ../../dm-1
-
lrwxrwxrwx 1 root root 10 11月 25 19:56 b2f57437-ba99-4a2d-9c82-a41037aa0e38 -> ../../dm-0
-
lrwxrwxrwx 1 root root 10 11月 25 19:56 cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5 -> ../../dm-2
-
lrwxrwxrwx 1 root root 10 11月 25 19:56 F159-EA55 -> ../../sda1
-
lrwxrwxrwx 1 root root 10 11月 25 19:56 f7755604-99f2-4d94-ab1a-47b14def7e26 -> ../../sda2
3、修改/etc/fstab文件,使用uuid
-
[root@361way ~]# cat /etc/fstab
-
#
-
# /etc/fstab
-
# Created by anaconda on Mon Sep 8 16:38:29 2014
-
#
-
# Accessible filesystems, by reference, are maintained under '/dev/disk'
-
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
-
#
-
/dev/mapper/cl-root / xfs defaults 1 1
-
UUID=f7755604-99f2-4d94-ab1a-47b14def7e26 /boot xfs defaults 1 2
-
UUID=F159-EA55 /boot/efi vfat umask=0077,shortname=winnt 0 0
-
/dev/mapper/cl-data /data xfs defaults,noatime,nobarrier 1 2
-
/dev/mapper/cl-swap swap swap defaults 0 0
按上面的方法修改后,重启主机 ,发现所有的挂载点都正常了。
二、使用udev调整磁盘顺序
可参考snipplr网站: http://snipplr.com/view/80310/replace-devsda-with-devsdb-device-name-assignment/
1、查看本机的磁盘
-
[root@localhost rules.d]# fdisk -l
-
Disk /dev/vda: 21.5 GB, 21474836480 bytes
-
16 heads, 63 sectors/track, 41610 cylinders
-
Units = cylinders of 1008 * 512 = 516096 bytes
-
Sector size (logical/physical): 512 bytes / 512 bytes
-
I/O size (minimum/optimal): 512 bytes / 512 bytes
-
Disk identifier: 0x0001bcdb
-
Device Boot Start End Blocks Id System
-
/dev/vda1 * 3 1018 512000 83 Linux
-
Partition 1 does not end on cylinder boundary.
-
/dev/vda2 1018 41611 20458496 8e Linux LVM
-
Partition 2 does not end on cylinder boundary.
-
Disk /dev/vdb: 1073 MB, 1073741824 bytes --vdb 1G
-
16 heads, 63 sectors/track, 2080 cylinders
-
Units = cylinders of 1008 * 512 = 516096 bytes
-
Sector size (logical/physical): 512 bytes / 512 bytes
-
I/O size (minimum/optimal): 512 bytes / 512 bytes
-
Disk identifier: 0x00000000
-
Disk /dev/vdc: 2147 MB, 2147483648 bytes --vdc 2G
-
16 heads, 63 sectors/track, 4161 cylinders
-
Units = cylinders of 1008 * 512 = 516096 bytes
-
Sector size (logical/physical): 512 bytes / 512 bytes
-
I/O size (minimum/optimal): 512 bytes / 512 bytes
-
Disk identifier: 0x00000000
可以看到一个大小为1G的vdb磁盘和一个大小为2G的vdc磁盘。
2、创建rule文件
在/etc/udev/rules.d/创建一个rule文件,具体内容如下
-
# cat 10-local.rules
-
KERNEL=="vdb", NAME="vdc"
-
KERNEL=="vdc", NAME="vdb"
3、使用udevadm命令重载rule文件
-
# udevadm control --reload-rules
-
# udevadm trigger
4、再查看本地磁盘
-
[root@localhost ~]# fdisk -l
-
Disk /dev/vda: 21.5 GB, 21474836480 bytes
-
16 heads, 63 sectors/track, 41610 cylinders
-
Units = cylinders of 1008 * 512 = 516096 bytes
-
Sector size (logical/physical): 512 bytes / 512 bytes
-
I/O size (minimum/optimal): 512 bytes / 512 bytes
-
Disk identifier: 0x0001bcdb
-
Device Boot Start End Blocks Id System
-
/dev/vda1 * 3 1018 512000 83 Linux
-
Partition 1 does not end on cylinder boundary.
-
/dev/vda2 1018 41611 20458496 8e Linux LVM
-
Partition 2 does not end on cylinder boundary.
-
Disk /dev/vdb: 2147 MB, 2147483648 bytes --vdb已变成2G
-
16 heads, 63 sectors/track, 4161 cylinders
-
Units = cylinders of 1008 * 512 = 516096 bytes
-
Sector size (logical/physical): 512 bytes / 512 bytes
-
I/O size (minimum/optimal): 512 bytes / 512 bytes
-
Disk identifier: 0x00000000
-
Disk /dev/vdc: 1073 MB, 1073741824 bytes --vdc已变成1G
-
16 heads, 63 sectors/track, 2080 cylinders
-
Units = cylinders of 1008 * 512 = 516096 bytes
-
Sector size (logical/physical): 512 bytes / 512 bytes
-
I/O size (minimum/optimal): 512 bytes / 512 bytes
-
Disk identifier: 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@localhost rules.d]# udevadm info -a -p /sys/block/vdb
-
Udevadm info starts with the device specified by the devpath and then
-
walks up the chain of parent devices. It prints for every device
-
found, all possible attributes in the udev rules key format.
-
A rule to match, can be composed by the attributes of the device
-
and the attributes from one single parent device.
-
looking at device '/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}==" 276 13 2312 8 0 0 0 0 0 8 8"
-
ATTR{inflight}==" 0 0"
-
ATTR{serial}==""
-
looking at parent device '/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"
-
looking at parent device '/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}==""
-
looking at parent device '/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
新版本中的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@localhost rules.d]# /sbin/partprobe /dev/sdb1
-
[root@localhost rules.d]# /sbin/partprobe /dev/sdc1
-
[root@localhost rules.d]# /sbin/partprobe /dev/sdd1
-
[root@localhost rules.d]# /sbin/start_udev
4、查看asm设备
-
[root@localhost rules.d]# ll /dev/asm*
-
brw-rw----. 1 root root 8, 17 3月 27 11:30 /dev/asm-crs01
-
brw-rw----. 1 root root 8, 33 3月 27 11:30 /dev/asm-data01
-
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博客 ” ,链接:https://blog.itpub.net/17086096/viewspace-1966497/
,如需转载,请注明出处,否则将追究法律责任。