本页目录
在配有两块硬盘的服务器上,DediJet 安装操作系统时默认配置软件 RAID 1(也可在安装时改选 RAID 0 或不配置 RAID)。Linux mdadm 会将每次写入同步镜像到两块硬盘,因此即使其中一块发生故障,服务器也能继续运行。本指南介绍如何检查阵列、接收告警、更换故障硬盘,以及保持两块硬盘均可启动。
RAID 不是备份。误删的文件、失败的迁移或勒索软件造成的破坏,都会立即同步到两块硬盘上。请在另一个系统上保留重要数据的副本,例如备份空间附加服务(支持 SFTP、rsync、BorgBackup 或 restic,1 TB
硬盘的布局方式
两块硬盘的分区完全相同,对应的分区两两组成 md 阵列。使用以下命令列出:
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上;第二份副本需要由您自行保持同步(见本指南最后一节)。
检查阵列状态
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]。查看哪个成员发生了故障:
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 这类通过您的邮件服务商转发的小型中继。重启监控服务,然后为每个阵列发送一封测试告警:
systemctl restart mdmonitor
mdadm --monitor --scan --oneshot --test更喜欢通过聊天工具或寻呼接收通知?在同一文件中添加一行 PROGRAM /usr/local/bin/raid-alert,即可在每次事件发生时运行您的脚本(脚本会接收到事件名称、阵列和成员设备)。如果您已在运行 Prometheus,node_exporter 会在其 node_md_* 指标中提供阵列状态。
更换故障硬盘
本示例假设 nvme1n1 发生故障,nvme0n1 正常。请将名称替换为您自己的设备名,并将每条命令都读两遍再执行。
先备份数据。在重建完成之前,降级的镜像没有任何冗余:如果剩下的硬盘也发生故障,数据将全部丢失。开始之前,请复制所有不能丢失的数据,并且切勿将这些命令用在正常的硬盘上。
记录故障硬盘和正常硬盘的序列号。如果故障硬盘已完全无法识别,记录正常硬盘的序列号即可。
lsblk -d -o NAME,SIZE,MODEL,SERIAL smartctl -i /dev/nvme1n1从阵列中移除故障分区(已显示为已移除的分区可跳过):
mdadm --manage /dev/md0 --fail /dev/nvme1n1p2 --remove /dev/nvme1n1p2 mdadm --manage /dev/md1 --fail /dev/nvme1n1p3 --remove /dev/nvme1n1p3提交工单。提供需更换硬盘的序列号、需保留硬盘的序列号,以及故障硬盘的
cat /proc/mdstat和smartctl -a输出。根据我们的 SLA,故障部件会在确诊后 4 小时内更换,7×24 小时服务。视机箱而定,更换硬盘可能需要短暂停机:请在工单中商定时间窗口。新硬盘安装完毕后,将分区表复制到新硬盘(软件包
gdisk)。先用lsblk确认新硬盘的名称和序列号。对于最常见的 GPT 分区表,--replicate指定的是新硬盘,最后一个参数则是正常的源硬盘。然后为副本生成独立的 GUID:sgdisk --replicate=/dev/nvme1n1 /dev/nvme0n1 sgdisk --randomize-guids /dev/nvme1n1对于旧式 MBR 硬盘(
lsblk -o NAME,PTTYPE显示为dos),请改用sfdisk -d /dev/nvme0n1 | sfdisk /dev/nvme1n1。将新分区添加到阵列。重建会立即开始:
mdadm --manage /dev/md0 --add /dev/nvme1n1p2 mdadm --manage /dev/md1 --add /dev/nvme1n1p3观察重建进度。在此期间服务器仍可正常使用,但磁盘 I/O 会变慢。
watch -n 5 cat /proc/mdstatmd1 : 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临时提高该上限。
保持两块硬盘均可启动
现在数据已重新镜像,但引导加载程序位于阵列之外。检查服务器的启动方式:
[ -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
格式化第二个 ESP 并写入内容(软件包
dosfstools和rsync):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为该硬盘添加固件启动项。使用
efibootmgr -v列出现有启动项,并沿用您操作系统的加载程序路径,例如\EFI\ubuntu\shimx64.efi、\EFI\debian\shimx64.efi或\EFI\almalinux\shimx64.efi:efibootmgr --create --disk /dev/nvme1n1 --part 1 --label "Linux (disk 2)" --loader '\EFI\ubuntu\shimx64.efi'引导加载程序更新后重新同步。ESP 很少变化,主要是在 GRUB 或 shim 软件包更新时:此类更新之后,请重复执行
rsync步骤,或通过 cron 任务运行。在 Ubuntu 上,dpkg-reconfigure grub-efi-amd64可以登记两个 ESP,使 GRUB 更新同时写入两者。在
/etc/fstab中,为/boot/efi行添加nofail(例如umask=0077,nofail)。否则,第一块硬盘损坏后,服务器可能因无法挂载该硬盘的 ESP 而停在紧急模式。
如需测试,可通过 IPMI 控制台在固件启动菜单中选择从第二块硬盘启动一次。
服务器无法启动时
打开 IPMI 控制台,查看启动停在了哪一步;在固件启动菜单中可以选择另一块硬盘。如果仍无法解决,请从控制面板启动救援模式,组装阵列并在其中修复系统:
mdadm --assemble --scan
cat /proc/mdstat后续步骤
- 在硬盘掉出阵列之前发现故障迹象:使用 smartctl 和 nvme-cli 检查硬盘健康状况。
- 保护 RAID 无法保护的数据:添加备份空间,并测试恢复。
- 更换硬盘时遇到问题?联系技术支持:硬件问题由工程师处理,7×24 小时服务。