树莓派4B自建网页服务器指南 (3):TF 卡镜像备份 —— 自制Golden Image (上)
一、为什么要做 镜像备份?
经过前面几篇文章的配置,你的树莓派已经完成了以下工作:
- NetworkManager 接管 WiFi,IPv6 SLAAC 公网地址稳定
- 博通芯片防飘参数(roamoff / feature_disable)
- 开机自动关闭 WiFi 省电
- SSH 主机名 (jiejinx)可访问
- 双栈验证通过
这套配置是花了不少时间排错、验证、固化下来的成果。如果每次换 TF 卡都要从头配一遍,显然不划算。
镜像备份 的目的: 把“已配置完成、已验证通过的系统”制作成一个可移植的小体积的黄金镜像文件(Golden Image),日后写入任意 ≥64GB 的新 TF 卡,首次开机自动扩容,配置全在,无需重复劳动。
二、整体流程概览 (整体流程耗时较长,一次摸清,后续 类Linux系统 镜像备份皆可参考)
树莓派端:
- 清理 apt 缓存 + journal 日志
- 追加首次开机自动扩容服务(含下次制作镜像时删除标记)
- sudo poweroff 关机
Windows 端:
- TF 卡 → 读卡器 → 电脑
- VirtualBox 运行 GParted Live ISO(缩容专用系统) → USB 直通读卡器 → 将 root 分区从 ~58GB 缩回 ~5GB
- 关闭 VM
- Win32DiskImager 读取缩容后的 TF 卡(仅已分配分区) → 得到 golden-jiejinx.img(约 5GB)
- 7-Zip 将 .img 压缩为 .img.xz(约 500–600MB)
日后恢复:
- Raspberry Pi Imager 直接写入 .img.xz 到新 TF 卡 → 首次开机自动扩容 → 配置全在
全程不需要额外 U 盘,不需要动物理机引导菜单。
三、准备工作
3.1 下载所需软件
| 软件 | 下载地址 | 用途 |
|---|---|---|
| VirtualBox | https://www.virtualbox.org/wiki/Downloads | 运行 GParted Live 的虚拟机 |
| GParted Live ISO | https://gparted.org/download.php | 缩容 root 分区的专用系统 |
| Win32DiskImager | https://sourceforge.net/projects/win32diskimager | 读取 TF 卡生成镜像文件 |
| 7-Zip | https://www.7-zip.org | 将 .img 压缩为 .img.xz |
| Raspberry Pi Imager | https://www.raspberrypi.com/software | 将镜像写入新 TF 卡 |
3.2 硬件准备
- 一张已配置完成、已验证通过的树莓派 TF 卡(本文使用的是64GB容量卡,以下简称“金卡原料卡”)
- 一个 USB 读卡器(⚠️ 不要用笔记本内置 SD 卡槽,VirtualBox 直通不到)
- 一台 Windows 电脑
四、树莓派端——清理系统
在树莓派上执行(SSH 或接显示器):
bash
# 清 apt 下载缓存(通常几百 MB)
sudo apt clean
# 清旧 journal 日志,保留最新 50MB
sudo journalctl --vacuum-size=50M
# 清旧 syslog 归档(不碰当前日志)
sudo find /var/log -type f -name "_.gz" -delete
sudo find /var/log -type f -name "_.1" -delete
# 确认已用空间下降
df -h /期望:Used从 ~5.18GB 降至 ~3.8–4.3GB(取决于固件版本)。
五、树莓派端——追加首次开机自动扩容服务
5.1 创建扩容脚本
bash
sudo nano /usr/local/bin/first-boot-expand.sh粘贴以下内容:
bash
#!/bin/bash
# 首次开机自动扩容脚本(仅执行一次)
LOG_FILE="/var/log/first-boot-expand.log"
# 检查是否已执行过
if [ -f /boot/firmware/.expanded ]; then
exit 0
fi
echo "[$(date)] Starting root partition expand..." | tee -a $LOG_FILE
# 扩分区表
growpart /dev/mmcblk0 2 >> $LOG_FILE 2>&1
# 扩文件系统
resize2fs /dev/mmcblk0p2 >> $LOG_FILE 2>&1
# 标记已执行(防止下次开机再跑)
touch /boot/firmware/.expanded
echo "[$(date)] Expand complete. Reboot in 3 seconds..." | tee -a $LOG_FILE
sleep 3
reboot5.2 赋予执行权限
bash
sudo chmod +x /usr/local/bin/first-boot-expand.sh5.3 注册为系统服务
bash
sudo nano /etc/systemd/system/first-boot-expand.service粘贴:
[Unit]
Description=First Boot Root Partition Expander
After=local-fs.target
Before=ssh.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/first-boot-expand.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target5.4 启用服务
bash
sudo systemctl daemon-reload
sudo systemctl enable first-boot-expand.service5.5 验证服务状态
bash
sudo systemctl status first-boot-expand.service
# 应显示 enabled5.6 删除已存在的扩容标记(如有)
bash
sudo rm -f /boot/firmware/.expanded⚠️ 重要:每次制作新版本 Golden Image(如后续加 Nginx / Docker 等),关机前务必执行 sudo rm -f /boot/firmware/.expanded,确保新镜像首次开机能重新触发扩容。
六、树莓派端——关机
bash
sudo poweroff等待绿灯(ACT 灯)完全熄灭后,拔掉电源线。
七、Windows 端——VirtualBox 中运行 GParted Live
7.1 安装 VirtualBox
- 以管理员身份运行 VirtualBox 安装包
- 安装时确保勾选 USB Support
- 安装完成后重启 Windows(推荐)
7.2 新建虚拟机
- 打开 VirtualBox → 点击 新建
- 名称:GParted-Live(随意)
- 类型:Linux
- 版本:Debian (64-bit)
- 内存大小:512 MB
- 硬盘:选择“不添加虚拟硬盘”(⚠️ 这步很重要)
- 点击 完成
7.3 挂载 GParted Live ISO
- 选中刚建好的虚拟机 → 点击 设置
- 左侧选 存储
- 在 控制器 下点击光盘图标 → 选择虚拟盘
- 选择下载好的 gparted-live-*.iso
- 勾选 ☑ Live CD/DVD
- 点击 确定
7.4 USB 直通设置(核心步骤)
- 虚拟机设置 → 左侧选 USB
- USB 控制器:选择 USB 3.0 (xHCI)
- 点击右侧(高级选项) ➖ 添加筛选器
- 插入你的 TF 卡读卡器(已含金卡原料卡)
- 在弹出的设备列表中,选中你的读卡器(如 Generic-Compact_Flash...;)
- 点击 确定
⚠️ 如果列表中没有出现你的读卡器:
- 确认读卡器已插入 Windows 且被识别(无法选到盘符时:此电脑-> 管理-> 磁盘管理, 选择TF磁盘bootfs分区,右键选择 更改驱动器号和路径->添加 盘符即可)
- 确认读卡器是 USB 接口设备(不是笔记本内置 SD 卡槽)
- 可在 Windows 的“设备和打印机”中确认设备名称
7.5 启动虚拟机并进入 GParted
- 选中虚拟机 → 点击 启动
- 虚拟机启动后,默认选择 → 回车
- 键盘映射:输入 33(简体中文)→ 回车
- 模式选择:输入 0(默认 Xorg)→ 回车
- GParted 图形界面自动打开