当前位置:首页 > linux教程 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-25 16:45:21 浏览: 评论:0 

磁盘引导对于我们使用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="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. # /etc/fstab 
  3. # Created by anaconda on Mon Sep  8 16:38:29 2014 
  4. # Accessible filesystems, by reference, are maintained under '/dev/disk' 
  5. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 
  6. /dev/mapper/cl-root     /                       xfs     defaults        1 1 
  7. UUID=f7755604-99f2-4d94-ab1a-47b14def7e26 /boot                   xfs     defaults        1 2    //phpfensi.com 
  8. UUID=F159-EA55          /boot/efi               vfat    umask=0077,shortname=winnt 0 0 
  9. /dev/mapper/cl-data     /data                   xfs     defaults,noatime,nobarrier         1 2 
  10. /dev/mapper/cl-swap     swap                    swap    defaults        0 0 

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

二、使用udev调整磁盘顺序

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

  1. (make sure both devices are unmounted) 
  2. # cat /proc/partitions 
  3. # cd /dev 
  4. # rm sda,sdb 
  5. # mknod /dev/sda b # fill with major and minor devices obtained from /proc/partitions for sdb 
  6. # mknod /dev/sdb b 8 0 # verify these major, minor values for sda in /proc/partitions 
  7. # partprobe /dev/sda 
  8. # hdparm -z /dev/sda 
  9. # sfdisk -R /dev/sda 
  10. # blockdev --rereadpt /dev/sda 
  11. (repeat the last 4 commands for sdb) 
  12. Alternatively and to make it permanent: 
  13. create the file /etc/udev/rules.d/10-local.rules with the following content: 
  14. KERNEL=="sda", NAME="sdb" 
  15. KERNEL=="sdb", NAME="sda" 
  16. (end of file) 
  17. and then: 
  18. # service udev restart 
  19. # udevadm control --reload-rules 
  20. # udevadm trigger 

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 
  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 
  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 
  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 
  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规则操作符

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

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

“=”:对一个键赋值.

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

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

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@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 
  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@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/ 目录.

Tags: linux磁盘顺序 udev控制磁盘

分享到: