10/15 款服务器配置有货即时交付免安装费

存储与 RAID

使用 mdadm 管理软件 RAID 1

查看 RAID 1 状态,设置故障告警,逐步更换故障硬盘,并确保服务器能从任一硬盘启动。

阅读约 7 分钟更新于 UbuntuDebianAlmaLinuxRocky Linux

适用于
UbuntuDebianAlmaLinuxRocky Linux
阅读时间
7 分钟
更新日期

遇到问题?工程师 7×24 小时为您解答

本页目录

在配有两块硬盘的服务器上,DediJet 安装操作系统时默认配置软件 RAID 1(也可在安装时改选 RAID 0 或不配置 RAID)。Linux mdadm 会将每次写入同步镜像到两块硬盘,因此即使其中一块发生故障,服务器也能继续运行。本指南介绍如何检查阵列、接收告警、更换故障硬盘,以及保持两块硬盘均可启动。

RAID 不是备份。误删的文件、失败的迁移或勒索软件造成的破坏,都会立即同步到两块硬盘上。请在另一个系统上保留重要数据的副本,例如备份空间附加服务(支持 SFTP、rsync、BorgBackup 或 restic,1 TB $5/月起)。

硬盘的布局方式

两块硬盘的分区完全相同,对应的分区两两组成 md 阵列。使用以下命令列出:

Shell
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

具体布局取决于操作系统镜像。在两块 NVMe 硬盘上的典型 UEFI 安装如下所示:

输出
NAME          SIZE TYPE  MOUNTPOINT
nvme0n1     931.5G disk
├─nvme0n1p1   512M part  /boot/efi
├─nvme0n1p2     1G part
│ └─md0      1022M raid1 /boot
└─nvme0n1p3   930G part
  └─md1     929.3G raid1 /
nvme1n1     931.5G disk
├─nvme1n1p1   512M part
├─nvme1n1p2     1G part
│ └─md0      1022M raid1 /boot
└─nvme1n1p3   930G part
  └─md1     929.3G raid1 /
  • NVMe 命名规则:nvme0n1 表示控制器 0、命名空间 1,其分区名会再加上 p:nvme0n1p1。SATA 和 SAS 硬盘命名为 sda、sdb,分区为 sda1、sda2。控制器编号在每次启动之间可能变化,因此请通过序列号识别硬盘,切勿仅凭名称判断。
  • EFI 系统分区(ESP):固件会直接读取它,且对 mdadm 一无所知,因此在 UEFI 服务器上,ESP 通常位于阵列之外。只有第一块硬盘的 ESP 挂载在 /boot/efi 上;第二份副本需要由您自行保持同步(见本指南最后一节)。

检查阵列状态

Shell
cat /proc/mdstat

健康的镜像显示 [2/2] [UU]:应有两个成员,两个均在线。

输出
md1 : active raid1 nvme1n1p3[1] nvme0n1p3[0]
      974452736 blocks super 1.2 [2/2] [UU]
      bitmap: 2/8 pages [8KB], 65536KB chunk

降级的镜像会显示 [2/1],缺失成员的位置会显示为下划线:[U_] 或 [_U]。查看哪个成员发生了故障:

Shell
mdadm --detail /dev/md1
输出
             State : clean, degraded
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 1

    Number   Major   Minor   RaidDevice State
       0     259        3        0      active sync   /dev/nvme0n1p3
       -       0        0        1      removed

       1     259        7        -      faulty   /dev/nvme1n1p3

大多数发行版还会定期安排一致性检查。检查运行期间,/proc/mdstat 会显示 check 和进度条:这是正常现象,且以低优先级运行。

硬盘故障时接收邮件通知

mdmonitor 服务会监控所有阵列,在成员发生故障或阵列降级时发送邮件。在 /etc/mdadm/mdadm.conf(Debian、Ubuntu)或 /etc/mdadm.conf(AlmaLinux、Rocky Linux)中设置收件人:

配置文件
MAILADDR root

在 /etc/aliases 中设置别名,将 root 的邮件转发到您自己的邮箱。mdadm 会把邮件交给 /usr/sbin/sendmail 处理,因此服务器需要一个邮件传输代理(MTA):可以是 Postfix,也可以是 msmtp 这类通过您的邮件服务商转发的小型中继。重启监控服务,然后为每个阵列发送一封测试告警:

Shell
systemctl restart mdmonitor
mdadm --monitor --scan --oneshot --test

更喜欢通过聊天工具或寻呼接收通知?在同一文件中添加一行 PROGRAM /usr/local/bin/raid-alert,即可在每次事件发生时运行您的脚本(脚本会接收到事件名称、阵列和成员设备)。如果您已在运行 Prometheus,node_exporter 会在其 node_md_* 指标中提供阵列状态。

更换故障硬盘

本示例假设 nvme1n1 发生故障,nvme0n1 正常。请将名称替换为您自己的设备名,并将每条命令都读两遍再执行。

先备份数据。在重建完成之前,降级的镜像没有任何冗余:如果剩下的硬盘也发生故障,数据将全部丢失。开始之前,请复制所有不能丢失的数据,并且切勿将这些命令用在正常的硬盘上。

  1. 记录故障硬盘和正常硬盘的序列号。如果故障硬盘已完全无法识别,记录正常硬盘的序列号即可。

    Shell
    lsblk -d -o NAME,SIZE,MODEL,SERIAL
    smartctl -i /dev/nvme1n1
  2. 从阵列中移除故障分区(已显示为已移除的分区可跳过):

    Shell
    mdadm --manage /dev/md0 --fail /dev/nvme1n1p2 --remove /dev/nvme1n1p2
    mdadm --manage /dev/md1 --fail /dev/nvme1n1p3 --remove /dev/nvme1n1p3
  3. 提交工单。提供需更换硬盘的序列号、需保留硬盘的序列号,以及故障硬盘的 cat /proc/mdstat 和 smartctl -a 输出。根据我们的 SLA,故障部件会在确诊后 4 小时内更换,7×24 小时服务。视机箱而定,更换硬盘可能需要短暂停机:请在工单中商定时间窗口。

  4. 新硬盘安装完毕后,将分区表复制到新硬盘(软件包 gdisk)。先用 lsblk 确认新硬盘的名称和序列号。对于最常见的 GPT 分区表,--replicate 指定的是新硬盘,最后一个参数则是正常的源硬盘。然后为副本生成独立的 GUID:

    Shell
    sgdisk --replicate=/dev/nvme1n1 /dev/nvme0n1
    sgdisk --randomize-guids /dev/nvme1n1

    对于旧式 MBR 硬盘(lsblk -o NAME,PTTYPE 显示为 dos),请改用 sfdisk -d /dev/nvme0n1 | sfdisk /dev/nvme1n1。

  5. 将新分区添加到阵列。重建会立即开始:

    Shell
    mdadm --manage /dev/md0 --add /dev/nvme1n1p2
    mdadm --manage /dev/md1 --add /dev/nvme1n1p3
  6. 观察重建进度。在此期间服务器仍可正常使用,但磁盘 I/O 会变慢。

    Shell
    watch -n 5 cat /proc/mdstat
    输出
    md1 : active raid1 nvme1n1p3[2] nvme0n1p3[0]
          974452736 blocks super 1.2 [2/1] [U_]
          [====>................]  recovery = 22.5% (219351680/974452736) finish=62.9min speed=200000K/sec

    内核会将重建速度控制在 dev.raid.speed_limit_min 与 dev.raid.speed_limit_max 之间(单位:每块硬盘 KiB/s)。默认上限为 200000 KiB/s(约 200 MB/s),也就是上例中显示的速度。在空闲的 NVMe 服务器上,您可以使用 sysctl -w dev.raid.speed_limit_max=2000000 临时提高该上限。

保持两块硬盘均可启动

现在数据已重新镜像,但引导加载程序位于阵列之外。检查服务器的启动方式:

Shell
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

传统 BIOS

在新硬盘上安装 GRUB:Debian 和 Ubuntu 使用 grub-install /dev/nvme1n1(然后运行 dpkg-reconfigure grub-pc 并选中两块硬盘,以便今后的更新写入两块硬盘),AlmaLinux 和 Rocky Linux 则使用 grub2-install /dev/nvme1n1。

UEFI

  1. 格式化第二个 ESP 并写入内容(软件包 dosfstools 和 rsync):

    Shell
    mkfs.vfat -F 32 /dev/nvme1n1p1
    mkdir -p /mnt/esp2
    mount /dev/nvme1n1p1 /mnt/esp2
    rsync -rt --delete /boot/efi/ /mnt/esp2/
    umount /mnt/esp2
  2. 为该硬盘添加固件启动项。使用 efibootmgr -v 列出现有启动项,并沿用您操作系统的加载程序路径,例如 \EFI\ubuntu\shimx64.efi、\EFI\debian\shimx64.efi 或 \EFI\almalinux\shimx64.efi:

    Shell
    efibootmgr --create --disk /dev/nvme1n1 --part 1 --label "Linux (disk 2)" --loader '\EFI\ubuntu\shimx64.efi'
  3. 引导加载程序更新后重新同步。ESP 很少变化,主要是在 GRUB 或 shim 软件包更新时:此类更新之后,请重复执行 rsync 步骤,或通过 cron 任务运行。在 Ubuntu 上,dpkg-reconfigure grub-efi-amd64 可以登记两个 ESP,使 GRUB 更新同时写入两者。

  4. 在 /etc/fstab 中,为 /boot/efi 行添加 nofail(例如 umask=0077,nofail)。否则,第一块硬盘损坏后,服务器可能因无法挂载该硬盘的 ESP 而停在紧急模式。

如需测试,可通过 IPMI 控制台在固件启动菜单中选择从第二块硬盘启动一次。

服务器无法启动时

打开 IPMI 控制台,查看启动停在了哪一步;在固件启动菜单中可以选择另一块硬盘。如果仍无法解决,请从控制面板启动救援模式,组装阵列并在其中修复系统:

Shell
mdadm --assemble --scan
cat /proc/mdstat

后续步骤

需要帮助?

拥有在用服务器的客户可在账户中提交工单,工程师 7×24 小时为您解答。

技术支持流程