我的系统有 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