Skip to content

树莓派4B自建网页服务器指南 (3):TF 卡镜像备份 —— 自制Golden Image (上)

一、为什么要做 镜像备份?

经过前面几篇文章的配置,你的树莓派已经完成了以下工作:

  • NetworkManager 接管 WiFi,IPv6 SLAAC 公网地址稳定
  • 博通芯片防飘参数(roamoff / feature_disable)
  • 开机自动关闭 WiFi 省电
  • SSH 主机名 (jiejinx)可访问
  • 双栈验证通过

这套配置是花了不少时间排错、验证、固化下来的成果。如果每次换 TF 卡都要从头配一遍,显然不划算。

镜像备份 的目的: 把“已配置完成、已验证通过的系统”制作成一个可移植的小体积的黄金镜像文件(Golden Image),日后写入任意 ≥64GB 的新 TF 卡,首次开机自动扩容,配置全在,无需重复劳动。

二、整体流程概览 (整体流程耗时较长,一次摸清,后续 类Linux系统 镜像备份皆可参考)

树莓派端:

  1. 清理 apt 缓存 + journal 日志
  2. 追加首次开机自动扩容服务(含下次制作镜像时删除标记)
  3. sudo poweroff 关机

Windows 端:

  1. TF 卡 → 读卡器 → 电脑
  2. VirtualBox 运行 GParted Live ISO(缩容专用系统) → USB 直通读卡器 → 将 root 分区从 ~58GB 缩回 ~5GB
  3. 关闭 VM
  4. Win32DiskImager 读取缩容后的 TF 卡(仅已分配分区) → 得到 golden-jiejinx.img(约 5GB)
  5. 7-Zip 将 .img 压缩为 .img.xz(约 500–600MB)

日后恢复:

  1. Raspberry Pi Imager 直接写入 .img.xz 到新 TF 卡 → 首次开机自动扩容 → 配置全在

全程不需要额外 U 盘,不需要动物理机引导菜单。

三、准备工作

3.1 下载所需软件

软件下载地址用途
VirtualBoxhttps://www.virtualbox.org/wiki/Downloads运行 GParted Live 的虚拟机
GParted Live ISOhttps://gparted.org/download.php缩容 root 分区的专用系统
Win32DiskImagerhttps://sourceforge.net/projects/win32diskimager读取 TF 卡生成镜像文件
7-Ziphttps://www.7-zip.org将 .img 压缩为 .img.xz
Raspberry Pi Imagerhttps://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
reboot

5.2 赋予执行权限

bash
sudo chmod +x /usr/local/bin/first-boot-expand.sh

5.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.target

5.4 启用服务

bash
sudo systemctl daemon-reload
sudo systemctl enable first-boot-expand.service

5.5 验证服务状态

bash
sudo systemctl status first-boot-expand.service
# 应显示 enabled

5.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

  1. 以管理员身份运行 VirtualBox 安装包
  2. 安装时确保勾选 USB Support
  3. 安装完成后重启 Windows(推荐)

7.2 新建虚拟机

  1. 打开 VirtualBox → 点击 新建
  2. 名称:GParted-Live(随意)
  3. 类型:Linux
  4. 版本:Debian (64-bit)
  5. 内存大小:512 MB
  6. 硬盘:选择“不添加虚拟硬盘”(⚠️ 这步很重要)
  7. 点击 完成

7.3 挂载 GParted Live ISO

  1. 选中刚建好的虚拟机 → 点击 设置
  2. 左侧选 存储
  3. 在 控制器​ 下点击光盘图标 → 选择虚拟盘
  4. 选择下载好的 gparted-live-*.iso
  5. 勾选 ☑ Live CD/DVD
  6. 点击 确定

7.4 USB 直通设置(核心步骤)

  1. 虚拟机设置 → 左侧选 USB
  2. USB 控制器:选择 USB 3.0 (xHCI)
  3. 点击右侧(高级选项) ➖ 添加筛选器
  4. 插入你的 TF 卡读卡器(已含金卡原料卡)
  5. 在弹出的设备列表中,选中你的读卡器(如 Generic-Compact_Flash...;)
  6. 点击 确定

⚠️ 如果列表中没有出现你的读卡器:

  • 确认读卡器已插入 Windows 且被识别(无法选到盘符时:此电脑-> 管理-> 磁盘管理, 选择TF磁盘bootfs分区,右键选择 更改驱动器号和路径->添加 盘符即可)
  • 确认读卡器是 USB 接口设备(不是笔记本内置 SD 卡槽)
  • 可在 Windows 的“设备和打印机”中确认设备名称

7.5 启动虚拟机并进入 GParted

  1. 选中虚拟机 → 点击 启动
  2. 虚拟机启动后,默认选择 → 回车
  3. 键盘映射:输入 33(简体中文)→ 回车
  4. 模式选择:输入 0(默认 Xorg)→ 回车
  5. GParted 图形界面自动打开

未完待续 点击跳转 !