磁盘引导对于我们使用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="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 //Vevb.com
- 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调整磁盘顺序
一天数据库侧的兄弟又问起sdb、sdc、sde多个磁盘名增加后会乱的问题,后来在自己的虚拟机上又尝试使用udev解决该问题,参考snipplr网站,代码如下:
- (make sure both devices are unmounted)
- # cat /proc/partitions
- # cd /dev
- # rm sda,sdb
- # mknod /dev/sda b # fill with major and minor devices obtained from /proc/partitions for sdb
- # mknod /dev/sdb b 8 0 # verify these major, minor values for sda in /proc/partitions
- # partprobe /dev/sda
- # hdparm -z /dev/sda
- # sfdisk -R /dev/sda
- # blockdev --rereadpt /dev/sda
- (repeat the last 4 commands for sdb)
- Alternatively and to make it permanent:
- create the file /etc/udev/rules.d/10-local.rules with the following content:
- KERNEL=="sda", NAME="sdb"
- KERNEL=="sdb", NAME="sda"
- (end of file)
- and then:
- # service udev restart
- # udevadm control --reload-rules
- # udevadm trigger
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
- 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
- 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
- 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
- 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
- //Vevb.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@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/ 目录.
新闻热点
疑难解答