SDB:SCSI 设备识别

跳转到:导航搜索


使用 sg3_utils 1.48 及更高版本(openSUSE Tumbleweed 自 2023 年 10 月起),不再使用不可靠的 SCSI 设备标识符,并且/dev/disk/by-id此类标识符的符号链接将不会被创建。可以通过编辑来更改此策略00-scsi-sg3_config.rules.

sg3_utils 1.48 中的 SCSI 设备识别和 SCSI 符号链接生成

随着 sg3_utils 更新到版本 1.48,SCSI 设备识别和 SCSI 符号链接生成在 Tumbleweed 中发生了变化。

通过设备节点(例如/dev/sda)引用磁盘设备是不可靠的。在大多数情况下,建议通过 内容 引用设备,即使用 文件系统 UUID 或文件系统标签。但是,有时必须通过硬件属性引用设备。为此,udev/dev/disk/by-id下维护各种符号链接。本文专门介绍 SCSI 符号链接,其格式为/dev/disk/by-id/scsi-*.

如果您不使用 dm-multipath,并且不使用/dev/disk/by-id/scsi-*标识符来引用任何磁盘或分区,您可以停止阅读此处。

SCSI 设备标识符

SCSI 设备可以通过 SCSI VPD(Vital Product Data)页面的内容以不同的方式识别。可能出现以下标识符之一或多个(有关详细信息,请参阅 SCSI 规范“SCSI Primary Commands”(SPC)6,§7.7.6)

  1. 已注册的 NAA 扩展36...(+ 31 个十六进制数字)
  2. 已注册的 NAA35...(+ 15 个十六进制数字)
  3. 扩展的 NAA32...(+ 15 个十六进制数字)
  4. EUI-642...(+ 16 个十六进制数字)
  5. SCSI 名称字符串8...(+ utf-8 字符串)
  6. NAA Local (“L"): 33...(+ 15 个十六进制数字)
  7. T10 供应商 ID (“T"): 1...(+ 字符串)
  8. Vendor 特定 (“V") 0...(+ 字符串)
  9. Serial 号 (“S"): S...(+ 供应商/产品/序列号字符串)

上述列表大致按这些标识符的可靠性(唯一性)降序排列。

udev 处理 SCSI 设备的事件时,它会确定ID_SERIAL属性(例如,由 multipathd 用于检测相同的设备)从这些标识符中,并创建/dev/disk/by-id/scsi-$ID符号链接。这发生在规则文件中55-scsi-sg3_id.rules58-scsi-sg3_symlink.rules.

在哪里查找这些标识符

SCSI 设备标识符可以出现在需要引用块设备的不同位置。以下是不完整的列表,应该是一个好的起点

  • /etc/fstab,
  • grub2 配置文件/etc/default/grub, /boot/grub2/grub.cfg,
  • 其他引导加载程序(如 sd-boot)的配置文件,
  • /etc/lvm/lvm.conf,
  • /etc/crypttab,
  • /etc/mdadm.conf,
  • /etc/smartd.conf,
  • /etc/hdparm.conf,
  • libvirt 配置:具有type="block"的磁盘设备,存储池定义,
  • 其他虚拟化工具(如 VirtualBoxvagrant)的存储配置,
  • 目标配置:targetclinvmetclitgt 的后端存储,
  • 手动编写的 脚本udev 规则
  • 处理块设备的 第三方工具 的配置文件,例如 SCST 或 EMC PowerPath。

/etc/fstab并且引导加载程序配置文件,应该能够完全避免使用硬件标识符,并使用文件系统标识符(by-uuid, by-label)代替。 尽可能强烈建议这样做。

某些工具可能会将设备标识符嵌入到其他设备的设备元数据中。例如,mkfs.f2fs在创建多设备 F2FS 文件系统时已知会这样做。

如果您的系统(s)中没有在上述任何位置使用这些标识符 6.-9.,并且您没有使用 dm-multipath,您可能已经安全了,可以停止阅读此处。 否则,请继续阅读。

设备识别和符号链接创建的历史策略

在所有使用 sg3_utils 1.48 之前的 openSUSE 和 SUSE 发行版(包括 SLE 15 和 Leap 15.x)上,使用上述列表中的所有标识符。这意味着它们会按顺序尝试确定ID_SERIAL,并为为给定设备定义了每个标识符创建符号链接。这确保了用户为引用设备选择的任何标识符都将作为/dev/disk/by-id.

下的符号链接可用。

更改此策略的原因/dev/disk/by-id标识符 6)-9) 不可靠;在同一系统中,可能有多个设备使用相同的标识符,尽管它们并不代表相同的物理磁盘。这尤其适用于 9):一些大型存储阵列对它们公开的每个 LUN 使用相同的序列号。将此类标识符用于多路径会导致灾难性的数据损坏。此外,在大型系统上,在启动过程中创建这些符号链接可能会导致启动速度变慢,因为数千个设备可能会争夺相同的符号链接。最后,不创建无用的符号链接可以整理

并使其更易于阅读。

sg3_utils 1.48 及更高版本(2023 年 10 月)的新策略ID_SERIALsg3_utils 1.48 更改了 SCSI 设备识别策略(注意:sg3_utils-1.48~20221101,1.48 的前身,没有此更改)。对于确定

仅尝试 1)-5) 上面。同样,仅为类型为 1)-5) 的标识符创建符号链接。在正常情况下,这不应产生负面影响,因为过去 15 年制造的 SCSI 设备通常支持一个或多个“可靠”标识符 1)-5)。

可能的问题和解决方法

在极少数情况下,系统可能包含没有可靠标识符的古老或损坏的设备,并且配置为其中一些设备由其中一个不可靠的硬件标识符引用(如果设备通过文件系统 UUID 等引用,则不会发生问题)。在将 sg3_utils 更新到 1.48 后,这些设备可能会在系统中消失。对于这些情况,必须恢复策略更改。00-scsi-sg3_config.rules可以通过编辑 udev 规则来定制策略(要更改文件,首先将其从/usr/lib/udev/rules.d/etc/udev/rules.d

复制),或使用内核命令行参数。

虚拟机中的设备识别libvirt<serial>元素,传统上用于虚拟机中的设备识别,会转换为不可靠的设备 ID,默认情况下将被忽略。使用<wwn>元素代替。同样,在 qemu 中,使用代替device=scsi-hd,wwn=device=scsi-hd,serial=元素,传统上用于虚拟机中的设备识别,会转换为不可靠的设备 ID,默认情况下将被忽略。使用。请注意,

必须由 16 个十六进制数字组成。ID_SERIAL自定义

来源如果用户需要使用除 1)-5) 之外的其他标识符,他们可以将 udev 属性 ".SCSI_ID_SERIAL_SRC."(前导 "" 是故意的)设置为字母 "LTVS"(参见上面的列表)的任何组合。例如,"ST" 将意味着考虑 7) 和 9)。要恢复 1.48 之前的行为,请设置ENV{.SCSI_ID_SERIAL_SRC}="LTVS"。或者,使用内核启动参数 "".

udev.scsi_id_serial_src=LTVST。当前的 upstream 默认值是 "",因此 7) 上面仍然启用。要禁用所有“不可靠”ID,请设置ENV{.SCSI_ID_SERIAL_SRC}=""ID_SERIAL。如果 udev 遇到无法分配

的设备,它会将警告打印到 journal。注意: 无论此选项如何,udev 规则始终为任何给定设备选择“最佳”可用标识符。因此,如果设置ENV{.SCSI_ID_SERIAL_SRC}="T"

,则将使用 T10 供应商 ID (7),但对于没有标识符 1)-5) 的设备。

自定义符号链接生成符号链接生成由变量 ".SCSI_SYMLINK_SRC" 是故意的)设置为字母 "" 控制。它也可以设置为字母 "" 的任何组合,字母的含义与上面相同,并控制将在/dev/disk/by-id/下创建哪些 "scsi-..." 符号链接,除了标识符 1)-5) 的符号链接和符号链接/dev/disk/by-id/scsi-$ID_SERIAL,后者将始终创建。同样,要恢复 udev 规则的先前行为,请设置ENV{.SCSI_SYMLINK_SRC}="LTVS",或使用内核启动参数 "".

说明

  • udev.scsi_symlink_src=LTVS符号链接生成适用于磁盘和分区。分区符号链接在父磁盘的符号链接名称后附加 "-part$P
  • " 后缀。ATA 和 USB 设备具有由传输生成的其他标识符(/dev/disk/by-id/ata-*/dev/disk/by-id/usb-*),不受此更改影响。这些设备通常不公开适当的 SCSI ID,但实际上它们不需要它们,因为 ATA 或 USB 标识符是唯一的。