SDB:持久性存储设备名称

跳转到:导航搜索


在 Linux 系统(以及每个其他类 Unix 系统)中,内核知道的每个设备在启动时的设备探测期间都会获得自己的名称。如果探测顺序在重启之间没有改变,并且硬件配置保持不变,那么这些名称是稳定的,无需担心。

随着 FireWire、USB 和 Fibrechannel 等新技术的出现,设备可以在运行时添加和删除。但即使在过去,添加和删除驱动器或在运行时遇到硬件故障也很常见。所有这些都会导致不同的探测顺序,并且稳定的内核设备名称在下次启动时会受到威胁。意外的硬件更改可能不会影响实际使用的存储控制器和驱动器。通常,设备名称的更改/偏移来自尚未(完全)使用的驱动器。

为了使系统配置文件独立于内核设备名称,人们发明了一些东西。最常见的是使用文件系统标签和文件系统 UUID。使用 LVM 或 MD RAID 等卷管理器也可以提供稳定的名称和其他功能。

但是,直到引入 Linux 内核 2.6 中的 sysfs,将硬件驱动器映射到特定内核设备才不可靠。它允许从内核设备名称映射回其背后的硬件。借助 udev,现在可以通过具有稳定名称的符号链接来访问驱动器,而不仅仅是通过其内核名称。最终命名设备由管理员决定,他可以将自己的命名规则添加到 udev 配置中。

默认情况下,每个磁盘分区都可以通过其硬件路径和文件系统 UUID 访问。如果磁盘提供某种唯一的序列号,或者各个分区具有文件系统标签,这些信息也将用于构造一个稳定的名称。所有稳定的名称实际上都是/dev/disk/by-*/中的符号链接,指向真实的块设备节点:内核名称。
内核设备名称仍然必须可用,不仅是为了向后兼容。如果连接的驱动器之一发生故障,内核将使用其内部名称来报告错误。它不知道符号链接。
可以在 Linux 内核源代码的Documentation/devices.txt.

中找到详细列表。关于应该为系统配置使用哪种命名方案,无法提出建议。这一切都取决于硬件设置将来可能会发生哪些变化。使用 LVM 似乎是一个合理的选择,它提供了人类可读的稳定名称,独立于底层的内核名称。在 SuSE Linux 中,默认的命名方案仍然是内核名称。

在生产系统中,硬件故障通常意味着服务中断。使用持久性设备名称可以帮助在旧系统状态恢复之前将系统尽快恢复在线。

在测试系统中,硬件配置更改不会导致已经配置的分区进行无休止的重新配置。


有关更高级设置的一些想法可以在下面找到。

设备命名模型

按磁盘分区内容查找

逻辑卷管理器

卷管理器将多个分区组合成一个组。每个逻辑分区将在配置时获得自己的唯一名称。此名称独立于内核名称,它存储在磁盘上的元数据中。LVM、EVMS 和 MD 软件 RAID 可以从设备命名的角度来看被视为此类。

文件系统 UUID

每个 Linux 文件系统都有一个 UUID,该 UUID 在文件系统在磁盘分区上创建时生成。引用uuidgen:

的手册页,“新的 UUID 在本地系统以及过去和未来的其他系统上,都可以被合理地认为是唯一的。”

文件系统标签

所有 Linux 文件系统都支持一个简短的人类可读的昵称,即文件系统标签。字符串长度因文件系统类型而异。典型值为 12 和 16 字节。当将具有现有文件系统的新的磁盘添加到系统时,发生冲突的可能性很大。

按磁盘的硬件路径查找

每个磁盘都通过总线连接到某种存储控制器。存储控制器本身通过其他类型的总线连接到 CPU。此路径使用所涉及硬件的总线编号。

按磁盘的序列号查找

每个磁盘都应该由其制造商分配一个唯一的序列号。这通常是高端磁盘和较新的磁盘的情况。但不幸的是,并非每个磁盘都提供唯一的编号。

启动过程中的唯一名称

从固件到 Linux 启动脚本,启动过程中有 4 个步骤。每个步骤都有不同的命名规则来查找磁盘。

  • 固件加载引导加载程序
每个固件都有自己的描述可引导设备的方式。在 PC BIOS 世界中,有简单的东西,例如驱动器 A:D:,而在使用 OpenFirmware 的系统上,则使用真实的硬件路径。固件本身提供了一种从与当前默认引导驱动器不同的驱动器启动的方法。这意味着配置的引导加载程序设备可能不是实际加载引导加载程序的驱动器。
  • 引导加载程序加载内核
一旦引导加载程序正在运行,它通常可以访问加载它的驱动器。但是,访问系统上其他驱动器的权限受到固件功能的限制,扫描其他连接的驱动器和其他存储控制器也不总是可能的。这意味着引导加载程序配置文件中的硬编码设备描述可能不指向正确的驱动器。引导加载程序允许管理员编辑内核命令行选项以传递正确的root=值给内核。
  • 内核挂载根文件系统
一旦内核初始化了所有硬件,它就会尝试挂载根文件系统,如root=命令行选项中指定的那样。此任务由 initrd 中的脚本完成。可以指定几个root=选项,但使用最后一个root=选项。一旦根文件系统被检查和挂载,控制权就会传递给/sbin/init.
  • 启动脚本挂载剩余的文件系统
一旦/sbin/init正在运行,它就会运行/etc/init.d/中的 init 脚本。它们使用诸如/etc/fstab, /etc/mdadm.conf, /etc/lvm/lvm.conf, /etc/evms.conf, /etc/raw和其他配置文件来配置剩余的文件系统。


如果系统硬件配置发生意外更改,上述 4 个步骤需要以某种方式处理这一事实,才能使系统恢复到运行状态。根据使用的设备命名方案和实际的硬件更改类型,可能不需要对 Linux 侧进行任何配置更改。

  • 配置引导设备
引导驱动器的值通常存储在 nvram 中。在具有 OpenFirmware 的系统上,可以从 Linux 侧更改此值,其他系统可能只提供固件用户界面本身来设置引导驱动器。
借助内核版本 2.6,sysfs 允许可靠地从 Linux 内核设备名称映射到 OpenFirmware 设备路径名称。磁盘上的内容或磁盘序列号不能用于此目的。如果启动失败,SMS 菜单允许管理员通过“多引导”菜单从不同的可引导设备启动。
  • 配置内核和 initrd 以加载
所有配置的内核通常存储在相同的引导分区上。根据使用的固件,它们可以从不同的驱动器加载。必须使用固件命名方案,因为引导加载程序无法猜测 Linux 内核将为给定的驱动器分配什么名称。实际的语法取决于使用的引导加载程序。
  • 配置根文件系统
内核(和/initinitrd 中的脚本)使用root=内核命令行选项来查找和挂载最终的根文件系统。此选项存储在引导加载程序配置文件中。但是,在将控制权传递给内核之前,可以在引导加载程序用户界面中对其进行修改。root=值可以包含内核设备节点名称,或UUID=LABEL=以查找磁盘分区标识符。
  • 配置数据分区
有几个配置文件用于配置对数据分区的访问和监控工具。它们通常使用内核设备节点名称,除了/etc/fstab它还理解UUID=LABEL=作为设备标识符。一些工具可能在其配置文件中只期望内核设备节点名称。mdadm、lvm、raw、evms 和引导加载程序也可以处理/dev/disk/by-*/命名方案。


使用 YaST 进行配置

YaST 分区程序可用于在/etc/fstab中切换命名方案。选择一个挂载点,然后单击'fstab 选项...'。此窗口还允许您指定文件系统标签,即使未使用按文件系统标签挂载。

在 i386 兼容系统上,此处所做的更改也会传播到 grub 配置文件。但是,更改不会传播到文件/boot/grub/device.map。您必须手动将内核设备更改为持久性设备名称。

对于 lilo、elilo 和 zipl 等其他引导加载程序,全局 boot=root= 值必须手动调整。使用 YaST 引导加载程序中的“编辑配置文件”或在安装后编辑所有相关文件。