Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

25.8. 持久性命名

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

25.8.1. 存储设备的主和次号

sd 驱动程序管理的存储设备由一组主要设备号及其关联的副号码来标识。用于此目的的主要设备号不在连续范围内。每个存储设备都由一个主号和一系列次要号表示,用于标识整个设备或设备中的分区。以 sd <letter (s)> 号的形式分配给设备和[号码在主号和次号之间进行直接关联]。每当 sd 驱动程序检测到新设备时,都会分配一个可用的主号码和次号范围。每当从操作系统中删除设备时,主号码和次号范围都会被释放,以便稍后重复使用。
当检测到设备时,会为每个设备分配主号和次号范围,以及相关的 sd 名称。这意味着,如果设备检测顺序发生了变化,主号和次号范围之间的关联以及相关的 sd 名称可能会发生变化。虽然这对于一些硬件配置(例如,内部 SCSI 控制器和磁盘将其 SCSI 目标 ID 被它们在机箱中的物理位置分配的 SCSI 目标 ID)不同,但它永远不会发生。可能发生这种情况的情况示例如下:
  • 磁盘可能无法启动或响应 SCSI 控制器。这会导致正常设备探测不会检测到它。这个磁盘无法被系统访问,后续的设备将具有其主号和次号范围,包括相关的 sd 名称下移。例如,如果没有检测到通常称为 sdb 的磁盘,则通常称为 sdc 的磁盘将显示为 sdb
  • SCSI 控制器(主机总线适配器或 HBA)可能无法初始化,从而导致无法检测到连接到那个 HBA 的所有磁盘。任何连接到随后探测到的 HBA 的磁盘都会被分配不同的主号和次号范围,以及不同的相关 sd 名称。
  • 如果系统中存在不同类型的 HBA,则驱动程序初始化顺序可能会改变。这会导致以不同顺序检测到连接到这些 HBA 的磁盘。如果 HBA 移到系统的不同 PCI 插槽中,也会发生这种情况。
  • 连接到带有光纤通道、iSCSI 或 FCoE 适配器的系统的磁盘可能在检测存储设备时无法访问,例如,由于存储阵列或中间交换机断电。如果存储阵列需要比系统启动的时间更长,则系统在电源失败后重启时会出现这种情况。虽然某些光纤通道驱动程序支持一种机制来向 WWPN 映射指定持久的 SCSI 目标 ID,但这不会导致主号和次号范围,以及相关的 sd 名称被保留,它只提供一致的 SCSI 目标 ID 号。
这些原因使得在引用设备(例如在 /etc/fstab文件中的)时不希望使用主号和次号范围或相关的 sd 名称。可能挂载错误的设备,并可能导致数据崩溃。
然而,偶尔仍然需要引用 sd 名称,即使使用了其他机制(比如当设备报告错误时)。这是因为 Linux 内核在有关设备的内核消息中使用 sd 名称(以及 SCSI 主机/通道/目标/LUN 元组)。

25.8.2. 全球标识符(WWID)

全球识别符(WWID)可用于可靠地识别设备。它是 SCSI 标准要求所有 SCSI 设备提供的持久的、独立于系统的 ID。保证 WWID 标识符对于每个存储设备都是唯一的,并且独立于用于访问该设备的路径。
可通过发出 SCSI 查询来检索设备识别重要产品数据(第 0x 83 页)或 单元序列号 (第 0x80页)来获取此标识符。在 /dev/disk/by-id/ 目录中维护的符号链接中,可以看到从这些 WWID 到当前 /dev/sd 名称的映射。

例 25.4. WWID

例如,带有页 0x83 标识符的设备应该有:
scsi-3600508b400105e210000900000490000 -> ../../sda
或者,带有页 0x80 标识符的设备应该有:
scsi-SSEAGATE_ST373453LW_3HW1RHM6 -> ../../sda
Red Hat Enterprise Linux 自动维护系统上从基于 WWID 的设备名称到当前 /dev/sd 名称的正确映射。应用程序可以使用 /dev/disk/by-id/ 名称来引用磁盘上的数据,即使设备的路径有变化,即使从不同的系统访问该设备也一样。
如果系统中存在多个路径到某个设备,DM 多路径 会使用 WWID 来检测这一点。然后,DM 多路径会在 /dev/mapper/wwid 目录中显示一个"pseudo-device",如 /dev/mapper/3600508b400105df70000e00000ac0000
命令 multipath -l 显示到非持久性标识符的映射: Host:Channel:Target:LUN, /dev/sd name, 和 major:minor 号。
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 名称的正确映射。这些名称可在路径更改之间保留,在从不同系统访问该设备时会保持一致。
当使用 user_friendly_names 功能( DM 多路径)时,WWID 会映射到 /dev/mapper/mpathn 格式的名称。默认情况下,此映射在 /etc/multipath/bindings 文件中维护。只要该文件被维护,这些 mpathn 名称就会持久存在。
重要
如果使用 user_friendly_names,则需要额外的步骤来获得集群中的一致名称。请参阅 DM 多路径 本书 中的集群部分中的 一致性多路径设备名称部分。
除了系统提供的这些持久名称外,您还可以使用 udev 规则来实现映射到存储的 WWID 的持久名称。

25.8.3. 由 /dev/disk/byjpeg 中的 udev 机制管理的设备名称

udev 机制由三个主要组件组成:
内核
生成在设备添加、删除或更改时发送到用户空间的事件。
udevd 服务
接收事件。
udev 规则
指定 udev 服务接收内核事件时要执行的操作。
这个机制用于 Linux 中的所有设备,而不仅仅是存储设备。对于存储设备,Red Hat Enterprise Linux 包含 udev 规则,该规则在 /dev/disk/ 目录中创建符号链接,允许存储设备被其内容引用、唯一标识符、序列号或用于访问该设备的硬件路径。
/dev/disk/by-label/
此目录中的条目提供一个符号链接名称,它通过存储在设备上的内容(即数据)中的标签引用存储设备。blkid 实用程序用于从设备读取数据,并确定该设备的名称(即标签)。例如:
/dev/disk/by-label/Boot
注意
该信息从设备上的内容(即数据)获取,以便在内容复制到另一个设备时,标签将保持不变。
该标签也可用于使用以下语法指向 /etc/fstab 中的设备:
LABEL=Boot
/dev/disk/by-uuid/
此目录中的条目提供一个符号链接名称,它通过存储在设备上的内容(即数据)中的唯一标识符来引用存储设备。blkid 实用程序用于从设备读取数据,并获取该设备的唯一标识符(即 UUID)。例如:
UUID=3e6be9de-8139-11d1-9106-a43f08d823a6
/dev/disk/by-id/
这个目录中的条目提供了一个符号链接名称,它通过唯一标识符(与所有其他存储设备不同)指向存储设备。标识符是设备的属性,但不存储在设备上的内容(即数据)中。例如:
/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05
id 从设备的全球 ID 或设备序列号获得。/dev/disk/by-id/ 条目也可以包含分区号。例如:
/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05-part1
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05-part1
/dev/disk/by-path/
这个目录中的条目提供了一个符号链接名称,它通过用于访问该设备的硬件路径引用,从 PCI 层次结构中的存储控制器的引用,包括 SCSI 主机、频道、目标和 LUN 号,以及可选的分区号。虽然这些名称最好使用主号和次号或 sd 名称,但必须小心谨慎,以确保目标号在光纤通道 SAN 环境中不会改变(例如,通过使用持久绑定),如果主机适配器移至不同的 PCI 插槽,则更新名称。另外,如果 HBA 无法探测、如果以不同顺序载入驱动程序,或者系统上安装了新的 HBA,则 SCSI 主机号可能会改变。by-path 列表的示例如下:
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0
/dev/disk/by-path/ 条目可能还包括分区号,例如:
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0-part1

25.8.3.1. udev 设备命名约定的限制

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

25.8.3.2. 修改持久性命名属性

虽然 udev 命名属性是持久的,但它们在系统重启后不会自行更改,但有一部分也是可以配置的。您可以为以下持久性命名属性设置自定义值:
  • UUID :文件系统 UUID
  • LABEL: 文件系统标签
由于 UUIDLABEL 属性与文件系统相关,因此您需要使用的工具取决于该分区上的文件系统。
  • 要更改 XFS 文件系统的 UUIDLABEL 属性,请卸载文件系统,然后使用 xfs_admin 工具更改属性:
    # umount /dev/device
    # xfs_admin [-U new_uuid] [-L new_label] /dev/device
    # udevadm settle
  • 要更改 ext4、ext3 或 ext2 文件系统的 UUIDLABEL 属性,请使用 tune2fs 工具:
    # tune2fs [-U new_uuid] [-L new_label] /dev/device
    # udevadm settle
使用您要设置的 UUID 替换 new_uuid ;例如,1cdfbc07-1c90-4984-b5ec-f61943f5ea50。使用标签替换 new_label,例如 backup_data
注意
更改 udev 属性在后台进行,可能需要很长时间。udevadm settle 命令一直等待直到更改完全注册,这样可确保您的下一个命令能够正确使用新属性。
您还应在创建新设备后使用 命令;例如,在使用 parted 工具创建带有自定义 PARTUUIDPARTLABEL 属性的分区后,或者在创建新文件系统后使用。