如何将 SATA 设备名称映射到 RAID 系统的物理 SATA 接口

如何将 SATA 设备名称映射到 RAID 系统的物理 SATA 接口

我的系统有 10 个 SATA 端口,另一个 SATA 作为启动盘。 10 个 SATA 端口组成 5 个软件 RAID1 阵列。 RAID 磁盘可以在引导之间移除,并随时与任意空白磁盘交换。

我需要/dev/sda确保总是我的第一个物理 SATA 端口,/dev/sdj总是第十,RAID1阵列能否正常运行。例如,如果第一个端口中的第一个磁盘出现故障,则应将其标记为丢失磁盘,因此下一个端口中的磁盘应为/dev/sdb。目前,下一个可用磁盘的安装方式是/dev/sda——完全破坏我的阵列和启动配置。

想象一个可怕的场景,其中所有其他磁盘都发生故障,因此每个 RAID1 阵列在其对中只有一个工作磁盘。编号应该是:

  • /dev/sda
  • /dev/sdc
  • /dev/sde
  • /dev/sdg
  • /dev/sdi

不是:

  • /dev/sda
  • /dev/sdb
  • /dev/sdc
  • /dev/sdd
  • /dev/sde

我见过udev通过 UUID 标记特定磁盘的规则,但由于用户会任意热插拔磁盘,这一点也不方便。

默认情况下,Linux 将使用下一个字母字符来标记下一个可用磁盘。在很多情况下,单个损坏的磁盘会损坏多个 RAID 1 阵列。

  • 如何将设备映射到特定的硬件接口?这可能吗?
  • 是否有可能在启动时“丢失”设备,因此后续设备不会被错误标记?

答案1

如果您使用以下命令创建数组:

mdadm --create --name=DATA00 --level=6 --auto=part --verbose /dev/md0 --raid-devices=6 /dev/sda1 /dev/sdb1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1

然后执行以下操作:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

你会得到一个像这样的条目mdadm.conf

ARRAY /dev/md/DATA00 metadata=1.2 name=owl:DATA00 UUID=5eeada67:ff994361:bae3ab52:d9e8bd49

无需参考原始分区和/或驱动程序排序,因为 UUID 会处理此问题。激活/重启后实际由哪些分区构成阵列可以从 中看出/proc/mdstat。要查看单个分区(包括其 UUID),请使用mdadm --examine /dev/sdXY

鉴于有绝不重新启动后需要在驱动器中设置特定的顺序,并且由于我的 BIOS 会根据我是否连接了外部 SATA 来进行切换,因此我很高兴这并不重要。

答案2

Debian 维基有一个很好的条目描述了我所需要的。接下来,我在 /etc/udev/rules.d/20-disk-bay.rules 下制定了自己的规则。我仅包含前两个 SATA 端口映射作为示例:

# There are different DEVPATHs for major kernel versions!
# Example for SATA N:
#
# Kernel < 3 DEVPATH
# *1f.2/hostN/targetN:0:0/N:0:0:0*
#
# Kernel > 3 DEVPATH
# *1f.2/ata(N+1)/host*

########## Map SATA 0 to /dev/sdb ##############

# Kernel < 3

KERNEL=="sd?", SUBSYSTEM=="block", DEVPATH=="*1f.2/host0/target0:0:0/0:0:0:0*", NAME="sdb", RUN+="/usr/bin/logger My disk ATTR{partition}=$ATTR{partition}, DEVPATH=$devpath, ID_PATH=$ENV{ID_PATH}, ID_SERIAL=$ENV{ID_SERIAL}", GOTO="END_20_PERSISTENT_DISK"

KERNEL=="sd?*", ATTR{partition}=="1", SUBSYSTEM=="block", DEVPATH=="*1f.2/host0/target0:0:0/0:0:0:0*", NAME="sdb%n", RUN+="/usr/bin/logger My partition parent=%p number=%n, ATTR{partition}=$ATTR{partition}"

# Kernel > 3

KERNEL=="sd?", SUBSYSTEM=="block", DEVPATH=="*1f.2/ata1/host*", NAME="sdb", RUN+="/usr/bin/logger My disk ATTR{partition}=$ATTR{partition}, DEVPATH=$devpath, ID_PATH=$ENV{ID_PATH}, ID_SERIAL=$ENV{ID_SERIAL}", GOTO="END_20_PERSISTENT_DISK"

KERNEL=="sd?*", ATTR{partition}=="1", SUBSYSTEM=="block", DEVPATH=="*1f.2/ata1/host*", NAME="sdb%n", RUN+="/usr/bin/logger My partition parent=%p number=%n, ATTR{partition}=$ATTR{partition}"

########## Map SATA 1 to /dev/sdc ##############

# Kernel < 3

KERNEL=="sd?", SUBSYSTEM=="block", DEVPATH=="*1f.2/host1/target1:0:0/1:0:0:0*", NAME="sdc", RUN+="/usr/bin/logger My disk ATTR{partition}=$ATTR{partition}, DEVPATH=$devpath, ID_PATH=$ENV{ID_PATH}, ID_SERIAL=$ENV{ID_SERIAL}", GOTO="END_20_PERSISTENT_DISK"

KERNEL=="sd?*", ENV{DEVTYPE}=="partition", SUBSYSTEM=="block", DEVPATH=="*1f.2/host1/target1:0:0/1:0:0:0*", NAME="sdc%n", RUN+="/usr/bin/logger My partition parent=%p number=%n, ATTR{partition}=$ATTR{partition}"

# Kernel > 3

KERNEL=="sd?", SUBSYSTEM=="block", DEVPATH=="*1f.2/ata2/host*", NAME="sdc", RUN+="/usr/bin/logger My disk ATTR{partition}=$ATTR{partition}, DEVPATH=$devpath, ID_PATH=$ENV{ID_PATH}, ID_SERIAL=$ENV{ID_SERIAL}", GOTO="END_20_PERSISTENT_DISK"
KERNEL=="sd?*", ATTR{partition}=="1", SUBSYSTEM=="block", DEVPATH=="*1f.2/ata2/host*", NAME="sdc%n", RUN+="/usr/bin/logger My partition parent=%p number=%n, ATTR{partition}=$ATTR{partition}"

LABEL="END_20_PERSISTENT_DISK"

上述规则将始终将放置在 SATA 端口 0(主板上的第一个物理 SATA 端口)中的任何驱动器映射为 /dev/sdb,并将放置在 SATA 1 中的任何驱动器映射为 /dev/sdc 在我的用例中,一致的物理端口映射至关重要,因为我有 5 个 RAID-1 阵列,其中的磁盘可以从其物理热插拔托架中任意交换。非技术用户可以随时更换这些磁盘,而无需处理设备 ID - 系统是完全自主的,不会在热插拔托架中的错误磁盘上构建 RAID 阵列。这是一个非常具体的用例。

答案3

用户为何随意热插拔磁盘?

多次热插拔意味着磁盘很可能磨损得更快。突袭的速度优势将会消失。事实上,在恢复时阵列的性能可能会比单个磁盘差。

随意拔出磁盘的习惯迟早会让您陷入这样的境地:有人碰巧拔出属于同一阵列的两个磁盘,从而可能导致系统崩溃。

更不用说您在这里描述的问题了。我不确定 mdadm 是否会在不手动将其添加到阵列的情况下拾取新磁盘,但可能有解决方法。

这是一个备份方案吗?那我就强烈劝阻它!使用传统备份 - 如果您有 LVM,则可以使用 LVM 快照。

如果用户“滥用”您的服务器,请在服务器机房门上锁上...或剥夺他们大多数热插拔托架提供的钥匙...或通知管理层该系统(重要到足以进行突袭)正在面临风险由于此行为而导致的停机时间。

除非磁盘损坏或因老化而需要更换,否则请勿热插拔磁盘!

热插拔是一种工具,可在更换损坏、陈旧或需要更换的磁盘时实现不间断的系统正常运行时间,不规律的原因 - 这几乎就是它的全部优点(当涉及到非常重要的系统时,这已经足够好了)。

当磁盘损坏时,您可以预先将额外的备用磁盘添加到 raid 阵列,使备用磁盘自动同步,或者您必须手动添加热插拔的替换磁盘。

请参阅 Anthon 的回答或本指南:https://raid.wiki.kernel.org/index.php/RAID_setup

相关内容