摘要

本文记录一次远程边缘节点的灾备体系设计过程。

目标环境为长期运行的 ARM 小型网络节点,其物理设备位于异地,日常仅通过 SSH 远程维护。系统运行在 SD 卡上,一旦存储介质损坏,将导致节点完全离线,因此需要构建一种:

  • 可远程实施
  • 无人值守恢复
  • 可立即重新启动
  • 长期稳定运行

的 SD 卡灾备方案。

本文最终采用:

首次整盘克隆(dd) + 后续文件级同步(rsync) + 异地配置备份

的分层灾备结构。


一、问题背景

边缘节点通常具有以下特点:

  • 设备长期运行
  • 部署地点远离维护人员
  • 使用 SD 卡作为系统盘
  • 断电或介质老化风险较高

一旦 SD 卡损坏,将出现:

  • 系统无法启动
  • SSH 完全失联
  • 需要现场人工恢复

因此核心问题变为:

是否可以提前制作一张备用 SD 卡,使其在原卡损坏后直接替换启动?


二、系统结构特点(R2S 与树莓派的差异)

许多 Raspberry Pi 迁移方案基于如下结构:

boot (FAT)
root (ext4)

系统仅依赖单一 root 分区,因此可以通过 rsync 复制后修改 UUID 启动。

但 NanoPi R2S 采用 Rockchip 启动结构:

mmcblk0
├─ p1~p7   bootloader / 固件区
├─ p8      rootfs
└─ p9      userdata(overlay upper)

关键差异:

  • 启动依赖完整分区布局
  • bootloader 位于前置隐藏分区
  • overlay 文件系统参与根挂载

因此:

仅复制文件 ≠ 可启动系统

必须首先进行整盘级复制。


三、总体灾备设计

最终采用三层结构:

Layer 1  本地启动灾备
──────────────
运行 SD 卡
备用 SD 卡(可直接启动)

Layer 2  异地配置备份
──────────────
配置文件同步

Layer 3  人工恢复能力
──────────────
系统可重建

四、第一步:制作可启动备用 SD 卡

1. 通过 USB 读卡器接入新 SD 卡

远程节点可直接识别:

mmcblk0   当前运行系统
sda       USB 读卡器中的新卡

确认设备:

lsblk

2. 整盘克隆(仅执行一次)

dd if=/dev/mmcblk0 of=/dev/sda bs=4M status=progress conv=fsync
sync

该操作复制:

  • 分区表
  • bootloader
  • kernel
  • rootfs
  • overlay 数据
  • UUID 信息

完成后:

备用卡 == 原系统卡

此时备用卡已经具备:

✅ 独立启动能力
✅ 完整系统状态


五、为什么不能每天使用 dd

整盘复制会导致:

32GB × 每日写入

SD 卡写入寿命迅速消耗。

因此:

dd 只用于初始化。


六、后续同步策略:rsync 增量更新

后续仅同步系统内容变化。

核心思想:

保持启动结构不变
仅更新数据层

示例同步:

mount /dev/sda9 /mnt/backup

rsync -aAXH --delete \
 --numeric-ids \
 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*"} \
 / /mnt/backup

sync
umount /mnt/backup

七、恢复流程

当运行卡损坏时:

1. 拔出损坏 SD 卡
2. 插入备用卡
3. 上电

系统将:

  • 使用相同 UUID
  • 保持网络配置
  • 自动恢复服务

恢复时间约为物理操作时间。


八、SD 卡容量差异问题

一个常见误区:

相同标称容量 ≠ 相同真实容量

例如:

标称实际容量
32GB A29.1GiB
32GB B28.8GiB

若目标卡略小:

dd → No space left on device

因此工程原则为:

备用卡容量必须 ≥ 原卡真实容量

推荐:

运行卡:32GB
备用卡:64GB

九、为什么不持续写入备用卡

备用卡的职责是:

灾难启动介质

而非实时副本。

持续同步将导致:

  • 两张卡同时老化
  • 写入寿命下降

推荐策略:

系统重大变更 → 手动同步
日常运行 → 不挂载备用卡

十、异地备份的真正作用

异地服务器无需保存完整系统。

真正重要的数据仅包括:

/etc
/usr/local
/home
/root
systemd 配置
网络配置
代理配置
密钥文件
自定义脚本

这些属于:

可重建系统的最小状态集合。


十一、最终架构

远程节点
────────────
运行 SD
备用 SD(冷备)

        ↓

异地服务器
────────────
配置与历史备份

该结构同时防御:

  • 存储介质损坏
  • 配置误删除
  • 远程操作失误

十二、核心经验总结

原则一

第一次使用 dd,之后使用 rsync。


原则二

备用卡容量必须大于运行卡。


原则三

本地解决启动问题,异地解决配置问题。


原则四

灾备目标是“立即恢复”,而不是“完全同步”。


结语

对于长期运行的远程 ARM 节点而言,真正可靠的方案并非复杂的高可用系统,而是:

  • 简单
  • 可预测
  • 可人工恢复
  • 不依赖网络

一张经过验证的可启动备用 SD 卡,往往比任何自动化系统更可靠。

该方案适用于:

  • NanoPi R2S
  • Raspberry Pi
  • ARM 边缘计算节点
  • 家庭服务器网关
  • 异地代理节点

本质上,这是将数据中心灾备思想缩小到单板计算机环境中的一次实践。

Leave a Reply

Your email address will not be published. Required fields are marked *