Red Hat Training

A Red Hat training course is available for RHEL 8

第 4 章 持久性命名属性概述

作为系统管理员,您需要引用使用持久性命名属性的存储卷来构建比多个系统引导更可靠存储设置。

4.1. 非持久性命名属性的缺陷

Red Hat Enterprise Linux 提供识别存储设备的多种方法。在使用正确的选项时,务必要使用正确的选项来识别每个设备,以避免意外访问错误的设备,特别是在安装到或重新格式化驱动器时。

通常,Linux 中使用非持久性名称来指代存储设备,格式为 /dev/sd(major number)(minor number)检测到后为每个设备分配主号码和副号码范围以及关联的 sd 名称。这意味着,当设备检测顺序改变时,主号码和副号码范围与关联的 sd 名称之间的关联可能会改变。

在以下情况下可能会在以下情况下更改排序:

  • 系统引导过程的并行化会根据每个系统引导的顺序检测到存储设备。
  • 磁盘无法启动或响应 SCSI 控制器。这会导致通常的设备探测不会检测到它。该磁盘不能被系统访问,后续的设备将具有它们的主号码和副号码范围,包括相关的 sd 名称。例如:如果没有检测到通常称为 sdb 的磁盘,通常称为 sdc 的磁盘会显示为 sdb
  • SCSI 控制器(主机总线适配器或 HBA)无法初始化,从而导致没有检测到与该 HBA 连接的所有磁盘。所有连接到随后探测的 HBA 的磁盘都会被分配不同的主号码和副号码范围,以及不同的关联的 sd 名称。
  • 如果系统中存在不同类型的 HBA,则驱动初始化顺序会改变。这会导致连接到那些 HBA 的磁盘以不同顺序被检测到。当将 HBA 移动到系统的不同 PCI 插槽时也会出现这种情况。
  • 例如,在探测存储设备时,通过光纤通道、iSCSI 或 FCoE 适配器连接到系统的磁盘可能无法访问,例如,存储阵列或干预交换机被关闭。如果存储阵列的在线需要比系统启动的时间更长,则系统在电源失败后重启时会出现这种情况。虽然某些光纤通道驱动程序支持一种机制来指定持久性 SCSI 目标 ID 到 WWPN 映射,但这不会导致主号码和副号码范围,以及相关的 sd 名称,它只提供一致的 SCSI 目标 ID 号。

这使得您不希望在引用设备时使用主号码和副号码范围或者关联的 sd 名称,比如在 /etc/fstab 文件中。可能挂载了错误的设备,并可能导致数据崩溃。

然而,偶尔也会需要引用 sd 名称,即使使用了其它机制,比如当设备报告错误时。这是因为 Linux 内核在针对该设备的内核信息中使用 sd 名称(以及 SCSI host/channel/target/LUN 标题)。

4.2. 文件系统和设备识别符

这部分解释了识别文件系统和块设备的持久性属性之间的区别。

文件系统识别符

文件系统标识符与在块设备中创建的特定文件系统绑定。标识符也作为文件系统的一部分保存。如果您将文件系统复制到不同的设备中,它仍采用相同的文件系统识别符。另外,如果您重写该设备,比如使用 mkfs 程序进行格式化,则设备会丢失该属性。

文件系统识别符包括:

  • 唯一标识符(UUID)
  • 标签

设备识别符

设备标识符与块设备绑定:例如磁盘或者分区。如果您重写了该设备,比如使用 mkfs 程序进行格式化,则该设备会保留属性,因为它没有存储在文件系统中。

设备识别符包括:

  • World Wide Identifier (WWID)
  • 分区 UUID
  • 序列号

建议

  • 有些文件系统(比如逻辑卷)会跨越多个设备。红帽建议您使用文件系统识别符而不是设备标识符访问这些文件系统。

4.3. 使用 /dev/disk/ 中的 udev 机制管理的设备名称

本节列出了 udev 服务在 /dev/disk/ 目录中提供的不同类型的持久命名属性。

udev 机制用于 Linux 中所有设备,而不仅仅用于存储设备。对于存储设备,Red Hat Enterprise Linux 包含 udev 规则,它会在 /dev/disk/ 目录中创建符号链接。这可让您使用以下方法指向存储设备:

  • 其内容
  • 唯一标识符
  • 它们的序列号。

虽然 udev 命名属性是持久的,但它们在系统重启后不会自行改变,但有些也可以配置。

4.3.1. 文件系统识别符

/dev/disk/by-uuid/ 中的 UUID 属性

此目录中的条目提供一个符号链接名称,通过存储在该设备上的内容(即数据)中的唯一标识符 (UUID)指向存储设备。例如:

/dev/disk/by-uuid/3e6be9de-8139-11d1-9106-a43f08d823a6

您可以使用以下语法使用 UUID 引用 /etc/fstab 文件中的设备:

UUID=3e6be9de-8139-11d1-9106-a43f08d823a6

您可以在创建文件系统时配置 UUID 属性,您也可以稍后修改它。

/dev/disk/by-label/ 中的 Label 属性

这个目录中的条目提供了一个符号链接名称,它们使用保存在该设备中的内容(即数据)的一个 label 指向存储设备。

例如:

/dev/disk/by-label/Boot

您可以使用以下语法使用该标签指向 /etc/fstab 文件中的设备:

LABEL=Boot

您可以在创建文件系统时配置 Label 属性,您也可以稍后修改它。

4.3.2. 设备识别符

/dev/disk/by-id/ 中的 WWID 属性

全球识别符(WWID)是一个持久的、系统独立的标识符,SCSI 标准要求所有 SCSI 设备都使用它。保证 WWID 标识符对于每个存储设备都是唯一的,并且独立于用于访问该设备的路径。标识符是设备的属性,但不存储在设备上的内容(即数据)中。

可通过发出 SCSI 询问来检索设备识别产品数据(第 0x83页)或单元序列号(第 0x80页)来获取这个标识符。

Red Hat Enterprise Linux 自动维护从基于 WWID 的设备名称到该系统中的当前 /dev/sd 名称的正确映射。应用程序可以使用 /dev/disk/by-id/ 名称来引用磁盘上的数据,即使设备的路径有变化,即使从不同系统访问该设备也是如此。

例 4.1. WWID 映射

WWID 符号链接非持久性设备备注

/dev/disk/by-id/scsi-3600508b400105e210000900000490000

/dev/sda

具有页面 0x83 标识符的设备

/dev/disk/by-id/scsi-SSEAGATE_ST373453LW_3HW1RHM6

/dev/sdb

具有页面 0x80 标识符的设备

/dev/disk/by-id/ata-SAMSUNG_MZNLN256HMHQ-000L7_S2WDNX0J336519-part3

/dev/sdc3

磁盘分区

除了系统提供的持久名称外,您还可以使用 udev 规则实现您自己的持久名称,映射到存储的 WWID。

/dev/disk/by-partuuid 中的分区 UUID 属性

分区 UUID(PARTUUID)属性标识 GPT 分区表定义的分区。

例 4.2. 分区 UUID 映射

PARTUUID 符号链接非持久性设备

/dev/disk/by-partuuid/4cd1448a-01

/dev/sda1

/dev/disk/by-partuuid/4cd1448a-02

/dev/sda2

/dev/disk/by-partuuid/4cd1448a-03

/dev/sda3

/dev/disk/by-path/ 中的 Path 属性

此属性提供一个符号链接名称,通过用于访问该设备的硬件路径引用存储设备

如果硬件路径的任何部分(如 PCI ID、目标端口或 LUN 号)发生变化,Path 属性会失败。因此 Path 属性是不可靠的。但是 Path 属性在以下情况下可能有用:

  • 您需要识别您要替换的磁盘。
  • 您计划在特定位置的磁盘中安装存储服务。

4.4. 使用 DM 多路径的通用识别符

这部分论述了全球识别符(WWID)与设备映射器多路径配置中非持久性设备名称之间的映射。

如果系统中有多路径到某个设备,DM 多路径会使用 WWID 探测到这个设备。然后 DM 多路径会在 /dev/mapper/wwid 目录中显示单个"pseudo-device",如 /dev/mapper/3600508b400105df70000e00000ac0000

multipath -l 命令显示到非持久性标识符的映射:

  • Host:Channel:Target:LUN
  • /dev/sd 名称
  • major:minor 数字

例 4.3. 多路径配置中的 WWID 映射

multipath -l 命令的一个输出示例:

3600508b400105df70000e00000ac0000 dm-2 vendor,product
[size=20G][features=1 queue_if_no_path][hwhandler=0][rw]
\_ round-robin 0 [prio=0][active]
 \_ 5:0:1:1 sdc 8:32  [active][undef]
 \_ 6:0:1:1 sdg 8:96  [active][undef]
\_ round-robin 0 [prio=0][enabled]
 \_ 5:0:0:1 sdb 8:16  [active][undef]
 \_ 6:0:0:1 sdf 8:80  [active][undef]

DM 多路径自动维护每个基于 WWID 的设备名称正确的映射,使其与系统中对应的 /dev/sd 名称对应。这些名称可在路径更改之间保留,在从不同系统访问该设备时会保持一致。

当使用 DM Multipath 的 user_friendly_names 功能时,WWID 会映射为格式 /dev/mapper/mpathN 的名称。在默认情况下,这个映射在文件 /etc/multipath/bindings 中被维护。只要该文件被维护,这些 mpathN 名称就会保留。

重要

如果使用 user_friendly_names,那么集群中需要额外的步骤来获得一致的名称。

4.5. udev 设备命名规则的限制

以下是 udev 命名规则的一些限制:

  • 执行查询时可能无法访问该设备,因为 udev 机制可能依赖于在 udev 事件处理 udev 规则时查询存储设备的能力。当设备不在服务器机箱中时,这更可能会在光纤频道、iSCSI 或者 FCoE 存储设备中发生。
  • 内核可能会随时发送 udev 事件,从而导致规则被处理,并可能会导致在无法访问该设备时删除 /dev/disk/by-*/ 链接。
  • 生成 udev 事件和处理时可能会有延迟,比如当检测到大量设备时,用户空间 udevd 服务需要一些时间来处理每个事件的规则。这可能会导致内核探测到设备以及 /dev/disk/by-*/ 名称可用时造成延迟。
  • 规则调用的 blkid 等外部程序可能会在短时间内打开该设备,从而使设备无法被其他用途访问。
  • /dev/disk/ 中由 udev 机制管理的设备名称可能会在主发行版本间有所变化,需要您更新链接。

4.6. 列出持久性命名属性

这个步骤描述了如何找到非持久性存储设备的持久命名属性。

流程

  • 要列出 UUID 和标签属性,请使用 lsblk 实用程序:

    $ lsblk --fs storage-device

    例如:

    例 4.4. 查看文件系统的 UUID 和标签

    $ lsblk --fs /dev/sda1
    
    NAME FSTYPE LABEL UUID                                 MOUNTPOINT
    sda1 xfs    Boot  afa5d5e3-9050-48c3-acc1-bb30095f3dc4 /boot
  • 要列出 PARTUUID 属性,请使用带 --output +PARTUUID 选项的 lsblk 实用程序:

    $ lsblk --output +PARTUUID

    例如:

    例 4.5. 查看分区的 PARTUUID 属性

    $ lsblk --output +PARTUUID /dev/sda1
    
    NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT PARTUUID
    sda1   8:1    0  512M  0 part /boot      4cd1448a-01
  • 要列出 WWID 属性,检查 /dev/disk/by-id/ 目录中符号链接的目标。例如:

    例 4.6. 查看系统中所有存储设备的 WWID

    $ file /dev/disk/by-id/*
    
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001
    symbolic link to ../../sda
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1
    symbolic link to ../../sda1
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part2
    symbolic link to ../../sda2
    /dev/disk/by-id/dm-name-rhel_rhel8-root
    symbolic link to ../../dm-0
    /dev/disk/by-id/dm-name-rhel_rhel8-swap
    symbolic link to ../../dm-1
    /dev/disk/by-id/dm-uuid-LVM-QIWtEHtXGobe5bewlIUDivKOz5ofkgFhP0RMFsNyySVihqEl2cWWbR7MjXJolD6g
    symbolic link to ../../dm-1
    /dev/disk/by-id/dm-uuid-LVM-QIWtEHtXGobe5bewlIUDivKOz5ofkgFhXqH2M45hD2H9nAf2qfWSrlRLhzfMyOKd
    symbolic link to ../../dm-0
    /dev/disk/by-id/lvm-pv-uuid-atlr2Y-vuMo-ueoH-CpMG-4JuH-AhEF-wu4QQm
    symbolic link to ../../sda2

4.7. 修改持久性命名属性

这个步骤描述了如何更改文件系统的 UUID 或 Label persistent naming 属性。

注意

更改 udev 属性是在后台进行,可能需要很长时间。udevadm settle 命令会等待更改完全注册,这样可确保您的下一个命令能够正确使用新属性。

在以下命令中:

  • 使用您要设置的 UUID 替换 new-uuid,例如: 1cdfbc07-1c90-4984-b5ec-f61943f5ea50。您可以使用 uuidgen 命令生成 UUID。
  • 使用标签替换 new-label,例如 backup_data

先决条件

  • 如果您要修改 XFS 文件系统的属性,首先卸载它。

流程

  • 要更改 XFS 文件系统 的 UUID 或标签属性,请使用 xfs_admin 实用程序:

    # xfs_admin -U new-uuid -L new-label storage-device
    # udevadm settle
  • 要更改 ext4ext3ext2 文件系统的 UUID 或标签属性,请使用 tune2fs 工具:

    # tune2fs -U new-uuid -L new-label storage-device
    # udevadm settle
  • 要更改交换卷的 UUID 或标签属性,请使用 swaplabel 实用程序:

    # swaplabel --uuid new-uuid --label new-label swap-device
    # udevadm settle