摘要
本文记录一次远程边缘节点的灾备体系设计过程。
目标环境为长期运行的 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 A | 29.1GiB |
| 32GB B | 28.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 边缘计算节点
- 家庭服务器网关
- 异地代理节点
本质上,这是将数据中心灾备思想缩小到单板计算机环境中的一次实践。