飞牛 fnOS 备份与打包 img 镜像完整教程
前言
折腾 OES 刷飞牛的时候,很多人会想:当前这个版本用着很稳,怎么把 eMMC 里的系统完整备份成一个 img 文件? 以后想恢复、想换盘、想分享给别人,都有一个”母盘”。关于这两个需求:
- 把 eMMC 里的系统备份成 img —— 保留稳定版本,随时能恢复
- 把 U 盘里的固件重新打包成 img —— 得到可反复写入的”母盘”
这篇教程把两种场景全部讲清楚,包括怎么操作、怎么让文件变小、有哪些坑。
一、为什么要备份 / 打包
| 场景 | 说明 |
|---|---|
| 保留稳定版本 | 比如你觉得 1.2.0701 很好用,不想升级,备份下来随时能回去 |
| 换盘迁移 | 想把系统迁到 SATA 固态,先备份再写入 |
| 分享 / 复用 | 得到一个可反复写入的 img,方便给别人或自己重刷 |
| 防翻车 | 系统折腾坏了,直接写回备份 |
二、场景一:在飞牛系统里备份 eMMC 为 img
eMMC 是焊接在设备上的,没法直接插到电脑上操作,所以只能在飞牛系统里跑命令完成备份。
第一步:确认 eMMC 设备路径
SSH 登录飞牛,sudo -i 切到 root,然后:
fdisk -l
在 OES / OEC 这类 ARM 设备上,eMMC 通常显示为:
/dev/mmcblk0/dev/mmcblk1
核对容量来确认哪个是你真正的系统盘,别选错。
第二步:备份到硬盘存储
假设 eMMC 是 /dev/mmcblk0,你想存到存储空间 1 的 Data 文件夹:
dd if=/dev/mmcblk0 of=/vol1/1000/Data/emmc-backup.img bs=4M status=progress
参数说明:
| 参数 | 说明 |
|---|---|
if= |
源盘,替换成你确认的 eMMC 设备路径 |
of= |
保存路径,/vol1/1000/Data/ 换成你自己的硬盘存储绝对路径 |
bs=4M |
块大小,加快读写速度 |
status=progress |
显示进度,避免干等 |
两个关键提醒
- 镜像大小等于 eMMC 容量:即使只用了 3G,备份出来的 img 也有 eMMC 总容量那么大(比如 8G / 16G)。因为
dd是逐扇区复制的,不会自动跳过空白区域。 - 用 screen 防断连:建议先
apt install screen,在 screen 里跑 dd,防止 SSH 中途断连导致备份失败。
三、让备份的 img 变小(核心部分)
直接 dd 出来的镜像很大,想让体积接近原始刷机包,有几种思路,各有限制。
方法一:填零 + 稀疏备份(最接近”瘦身”效果)
原理:先用零覆盖分区里的空闲空间,再用 dd 的 conv=sparse 让系统跳过全零扇区。
# 1. 把空闲空间填零(假设根分区在 /)
dd if=/dev/zero of=/zero_file bs=32M status=progress
rm /zero_file
sync
# 2. 用稀疏模式备份
dd if=/dev/mmcblk0 of=/vol1/1000/Data/emmc-sparse.img bs=4M conv=sparse status=progress
优点:生成的 .img 在支持稀疏文件(如 btrfs)的系统上,实际占用空间接近已用数据量。
缺点:填零对 eMMC 有写入损耗,且 eMMC 本身不大,填零 + 备份都比较耗时。
方法二:备份时直接压缩(最省事,推荐)
不用填零,直接边备份边压缩:
dd if=/dev/mmcblk0 bs=4M status=progress | gzip > /vol1/1000/Data/emmc-backup.img.gz
优点:空白区域会被 gzip 高度压缩,最终文件比原始镜像小很多。
缺点:得到的是 .gz 文件,不能直接当 img 用,恢复时要先解压。
适用:最稳妥的推荐方案,操作简单、风险低。
方法三:先缩小分区,再备份(最彻底但风险高)
如果分区远大于实际数据占用(比如 16G 分区只用了 3G),最根本的方式是先用 gparted 或 parted 把分区物理缩小,再 dd 备份,这样 img 天生就小。
限制:
- 需要在 Linux 环境下操作 eMMC
- 分区缩小后恢复回去时,系统可能需要自动扩容,否则系统会认为自己只有那么小
- 飞牛社区有用户反馈限制大小后恢复导致启动问题
不建议新手尝试。
四、场景二:把 U 盘固件重新打包成 img
如果你手里有一个已经写好系统的 U 盘,想把它打包成 img,方便以后反复写入或分享。
工具:Win32 Disk Imager
⚠️ 不要用 balenaEtcher。它只支持写,不支持反向打包(从 U 盘读回镜像)。必须换成 Win32 Disk Imager 或 USB Image Tool。
操作步骤
插上 U 盘:把已经写好系统的 U 盘插到电脑上。
以管理员身份运行:右键 Win32 Disk Imager 图标,选择”以管理员身份运行”,否则可能报错
Error 5: Access is denied。找到”读取”功能:软件界面右边是”设备”选择框,左边是”镜像文件”输入框。把这里当成”另存为”来用。
选择保存位置:在”镜像文件”那一栏点蓝色文件夹图标,选择一个文件夹,自己给文件起名并以
.img结尾(比如oes-backup.img)。选对 U 盘:在”设备”下拉框里选中你的 U 盘。这一步最关键,千万别选错。
点击 “Read”:确认无误后点下方的 “Read” 按钮,软件就会把 U 盘内容逐字节复制成
.img文件。
让 U 盘打包的 img 也变小
Win32 Disk Imager 自带一个选项可以帮你省掉部分空白空间:
- 在读取之前,勾选 “Read Only Allocated Partitions”(只读取已分配分区)
- 这样备份出来的镜像会跳过分区表之外的大片未分配空间
两个重要提醒
| 提醒 | 说明 |
|---|---|
| 文件会很大 | 生成的是扇区级完整镜像,大小和 U 盘实际容量差不多。比如 16G 的 U 盘,img 也就 16G 左右,需要预留足够硬盘空间 |
| 不要用 Etcher | balenaEtcher 不支持反向打包,必须换成 Win32 Disk Imager 或 USB Image Tool |
压出来的 .img,以后用 balenaEtcher 或 Win32 Disk Imager 都能直接写回去。
五、能不能”先写老镜像 → OTA 升级 → 再打包”?
原理可行,但大概率踩坑。
⚠️ 核心风险:OTA 升级不会自动更新启动分区
飞牛的 OTA 主要更新根分区(rootfs),但 ARM 设备的引导文件(zImage、uInitrd、fnEnv.txt)在独立的 boot 分区。
有用户升级后硬盘识别异常、存储空间损坏,根源就是 /boot/zImage 仍是旧内核。这种情况下打包出来的镜像是”根分区新、引导分区旧”,写回去能不能启动完全看运气。
更稳妥的做法
直接用飞牛官方或 ophub 发布页的最新 img。官方固件已经处理好引导和内核的对应关系,写盘即用,不用自己折腾打包。
六、不同场景怎么选
| 场景 | 推荐方式 |
|---|---|
| 备份 eMMC,能恢复就行 | gzip 压缩备份(三·方法二) |
| 备份 eMMC,想要较小且直接可用的 img | 填零 + 稀疏备份(三·方法一) |
| 备份 eMMC,追求极致小体积、愿意折腾 | 缩小分区 + 备份(三·方法三) |
| 只想保留设置、用户、权限 | 飞牛自带 系统设置 → 备份和还原 → 系统配置(导出 .bin) |
| 把 U 盘固件反向打包 | Win32 Disk Imager + Read(四) |
| U 盘打包也想变小 | 勾选 “Read Only Allocated Partitions” |
| 想要最新版镜像 | 直接用官方 img,别自己 OTA 后打包 |
⚠️ 飞牛自带配置备份不包含系统本身,系统盘坏了还是得重装,然后导入配置。
七、总结速查表
| 问题 | 答案 |
|---|---|
| 在飞牛里怎么备份 eMMC | SSH + dd 命令,存到硬盘存储 |
| 怎么确认 eMMC 路径 | fdisk -l,核对容量,通常是 /dev/mmcblk0 |
| 怎么防止 SSH 断连 | 装 screen,在 screen 里跑 dd |
| 备份出来为什么那么大 | dd 逐扇区复制,空白区域也算了 |
| 怎么让 eMMC 备份变小 | ① gzip 压缩(推荐)② 填零 + 稀疏 ③ 缩小分区 |
| 从 U 盘反向打包 | Win32 Disk Imager,点 Read |
| U 盘打包怎么变小 | 勾选 “Read Only Allocated Partitions” |
| 能用 balenaEtcher 打包吗 | 不能,它只支持写 |
| 能 OTA 升级后再打包吗 | 原理可行,但容易踩内核/引导不匹配的坑,不推荐 |
核心一句话:
eMMC 备份用
dd,想要小就gzip;U 盘反向打包用 Win32 Disk Imager;想要最新镜像,直接用官方的,别自己 OTA 后打包。
下次要翻的时候,看这篇就够了。

💬 评论区 0