OES 飞牛OS 迁移 SATA 后,如何安全地 OTA 升级?
适用设备:OESP / OES 系列飞牛OS ARM 设备
系统布局:eMMC 引导 + SATA 系统盘(双系统)
工具版本:老默OESP工具箱 v4.5
一、为什么迁移 SATA 后 OTA 不能直接点?
把飞牛系统从 eMMC 迁移到 SATA 后,很多人的第一反应是:既然系统跑在 SATA 上了,那 OTA 直接在网页里点升级不就行了?
现实是:不行,或者说不稳。
原因在于 OES 这类设备的启动链路是「eMMC 里的引导分区 → 根据 fnEnv.txt 里的 rootdev 决定根分区落在哪」。迁移到 SATA 后,eMMC 并没有消失,它仍然参与引导。如果 eMMC 和 SATA 两边的系统版本不一致,直接 OTA SATA 侧,重启后很容易出现:
- 更新推送收到了,但升级后连不上;
- 重启后红灯常亮,卡在引导;
- 直接进不去系统。
所以社区里比较稳妥的做法是「双系统版本对齐 + 引导切换」。老默OESP工具箱 v4.5 把这套流程做成了四个可逆的原子操作,标准 OTA 流程就是:
to-emmc → 系统内 OTA 升级 → sync → to-sata
下面按这个流程一步步讲。
二、先认识这个工具箱
脚本叫 lmoesp-tool.sh,核心能力:
执行方法:curl -ksSL https://pic.otc.cc.cd/img/lmoesp-tools.sh -o /usr/local/bin/lmoesp-tools.sh && chmod +x /usr/local/bin/lmoesp-tools.sh && lmoesp-tools.sh
- 全自动识别本机磁盘、UUID、PARTUUID、数据卷,换机即用;
- sync 克隆写入即 zstd 压缩,SATA 系统占用保持最小;
- 交互式菜单,直接运行按序号选功能,也保留子命令模式;
- eMMC 寿命健康监测,菜单和 status 里实时显示剩余寿命。
它把 OTA 拆成四个动作,每个都有预检和校验:
| 动作 | 作用 | 关键保护 |
|---|---|---|
to-emmc |
切回 eMMC 启动 | 切走前自动备份 SATA 状态(PG 注册表、App 套件、用户、配置、SSH 密钥、machine-id) |
| 系统内 OTA | 在 eMMC 系统里正常点升级 | 只动 eMMC,SATA 暂时不受影响 |
sync |
把升级后的 eMMC 系统克隆到 SATA | 写入即 zstd 压缩;克隆后自动恢复备份;逐项校验 init/内核模块/注册表/App 目录 |
to-sata |
切回 SATA 启动 | 切之前预检 SATA 上有没有 sbin/init、有没有当前内核版本的模块,跨版本给红灯警告 |
这套设计解决的就是两个最大的坑:两边版本不一致导致引导失败、OTA 后 App 登记静默丢失。
三、部署工具
把脚本放到 /usr/local/bin/ 并赋予执行权限:
sudo install -m 755 lmoesp-tool.sh /usr/local/bin/lmoesp-tool.sh
脚本有权限自检:非 root 运行且不是 help/status 时,会自动 sudo 提权,因为备份要读 shadow、PG 数据文件属主是 postgres,必须 root 才能完整打包。
运行后进入交互菜单:
sudo lmoesp-tool.sh
菜单顶部会显示当前运行环境、下次启动目标、系统盘占用;下面是功能菜单:
1 查看详细状态
2 切换到 SATA 启动
3 切回 eMMC 启动 (OTA 升级前必做)
4 升级后同步系统到 SATA
5 备份管理 (清理 / 新建备份)
0 退出
也支持子命令模式,比如 lmoesp-tool.sh status、to-sata、to-emmc、sync、backup、restore、clean、deploy。
四、OTA 升级完整流程
第 0 步:升级前看一眼状态
选 1 查看详细状态,重点确认三件事:
- 当前运行在 SATA 还是 eMMC;
- 下次启动目标;
- SATA 系统盘识别到的 UUID / PARTUUID 是否正确。
同时看下 eMMC 寿命进度条,如果剩余寿命已经很低(红色 ≤20%),升级前要有心理准备。
第 1 步:切回 eMMC 启动(菜单选 3)
这是 OTA 前必做的一步。执行 to-emmc 时,脚本会:
- 先自动备份当前 SATA 系统状态,打包到独立数据卷的
lmoesp-state/state-时间戳.tar.gz,内容包含:/var/lib/postgresql(飞牛注册表:App/用户/共享/网络记录)/usr/local/apps、/var/apps(App 套件本体与运行目录)/usr/trim/etc、/usr/trim/var(trim 服务配置与动态数据)/etc/docker、/etc/samba、SSH 主机密钥、machine-id、passwd/shadow/group
- 备份会显式检查 tar 返回值,并校验包内
var/lib/postgresql和usr/local/apps/@appcenter的条目数;如果 PG 为 0,直接红字警告「App 登记将丢失」。 - 然后注释 eMMC 引导分区
fnEnv.txt里的rootdev=行,让下次从 eMMC 启动。 - 最后询问是否立即重启,支持三级兜底(
reboot→systemctl reboot --force --force→ sysrq),针对 SSH 非交互下 polkit 拒绝的情况。
备份目录刻意放在独立数据卷(
/vol1..的lmoesp-state),不随系统盘被覆盖,这是「保数据升级」的关键。
第 2 步:重启进入 eMMC,正常做 OTA
重启后确认当前运行在 eMMC 系统,然后就在飞牛网页里正常点 OTA 升级。这一步只动 eMMC,SATA 暂时不受影响。
升级完成后,建议先确认 eMMC 系统能正常进、版本号对了,再往下走。
第 3 步:同步到 SATA(菜单选 4)
回到工具箱选 4,执行 sync。脚本要求必须在 eMMC 环境运行,流程是:
- [0/6] 给 SATA 根挂载 remount 加
compress=zstd,写入即压缩; - [1/6] 清空 SATA 根旧内容(保留
lost+found); - [2/6]
rsync -aHAXx --numeric-ids完整克隆 eMMC → SATA,排除proc/sys/dev/run/tmp/boot/mnt/media/vol00和*.bak-*;如果状态目录和/同盘,自动加--exclude避免自我复制; - [3/6] 修正 SATA 的
fstab:根和/boot指向本机 SATA UUID,并追加compress=zstd(幂等,先清掉 ext4 遗留的errors=remount-ro); - [4/6] 同步
/boot/到 SATA 引导分区; - [5/6] 恢复升级前的状态备份——会弹出备份包选择器,10 秒不选自动用最新;
- [6/6] 校验
sbin/init、当前内核模块、PG 注册表、App 套件目录,最后sync落盘。
这里的设计思路是「克隆同步」而不是「SATA 侧再 OTA 一次」:SATA 拿到的是和 eMMC 完全一致的系统,天然版本对齐,避免了两次 OTA 之间版本漂移。代价是每次要跑一次全量 rsync,但对一致性来说更可控。
第 4 步:切回 SATA 启动(菜单选 2)
选 2 执行 to-sata。切之前脚本会做预检:
- SATA 上有没有
sbin/init; - SATA 上有没有当前内核版本的模块目录。
如果发现风险(比如跨内核版本),会红字警告并提示「建议先在 eMMC 上把 SATA 重刷为同版本镜像」,要求输入 yes 才强制继续。
预检通过后,脚本把 rootdev=PARTUUID=<本机 SATA PARTUUID> 写入 eMMC 的 fnEnv.txt,备份原文件,校验写入成功,然后询问是否重启。
重启后就应该正常进入 SATA 系统,OTA 完成。
五、备份管理
菜单选 5 进入备份管理子菜单:
1清理备份包:可一键全清,也可按序号删单个;会自动保留最近 3 份;2立即新建一个备份;0返回主菜单。
手动恢复用子命令 restore,必须在 eMMC 上运行(恢复的是 SATA 系统区),会先让你选备份包再确认。
六、几个值得注意的细节
1. 引导源探测用 ubootpart
脚本从 /proc/cmdline 取 ubootpart= 定位 eMMC 引导分区,比硬编码 /dev/mmcblk?p1 靠谱,换机即用。
2. 备份不做静默吞错
tar 失败会打印错误头 3 行并删掉半成品包;备份后校验 PG 和 App 套件条目数,PG 为 0 直接警告。
3. fstab 处理是幂等的
先备份 .bak-sync 再改;压缩选项先判断是否已有 compress=,避免重复追加。
4. 重启三级兜底reboot → systemctl reboot --force --force → sysrq b,且前面已 sync,强制重启安全。
七、使用建议与已知风险
这套流程正常路径下是可靠的,但有几处边界情况建议留意:
sync里 rsync 退出码只打印不判断。如果 rsync 返回 1/11 这类错误,脚本仍会继续改 fstab、恢复状态、报「全部完成」。建议关注输出里的退出码,异常时不要直接切 SATA。to-sata对内核模块缺失只警告不硬阻断。跨内核版本时务必认真看预检输出,不要随手输入yes。- PG 路径校验硬编码
15/main。飞牛若升级 PostgreSQL 大版本,校验会误报「注册表缺失」,属于误报,可人工确认。 - SATA 盘扫描假设
p1=vfat、p2=btrfs。标准布局够用,分区表特殊时可能探测不到。
一句话总结:最稳的节奏就是菜单上的 3 → 系统内 OTA → 4 → 2。工具箱把「备份 → 克隆 → 恢复 → 校验」做成了闭环,正常路径下可以放心跟着走;遇到预检红字警告时,停下来看清楚再决定,别硬闯。
八、常用命令速查
# 交互菜单(推荐)
sudo lmoesp-tool.sh
# 查看状态
sudo lmoesp-tool.sh status
# OTA 四步
sudo lmoesp-tool.sh to-emmc # 切 eMMC(自动备份 SATA 状态)
# …… 网页里做 OTA ……
sudo lmoesp-tool.sh sync # 克隆到 SATA 并恢复状态
sudo lmoesp-tool.sh to-sata # 切回 SATA
# 备份相关
sudo lmoesp-tool.sh backup # 立即新建备份
sudo lmoesp-tool.sh restore # 手动恢复(需在 eMMC)
sudo lmoesp-tool.sh clean # 清理备份包
sudo lmoesp-tool.sh deploy # 部署到另一套系统
附上脚本文件源文件
本文基于老默OESP工具箱 v4.5 整理。脚本涉及分区、引导和系统克隆操作,执行前请确认已理解流程并做好数据备份;不同设备批次/固件底包的启动参数可能不同,首次使用建议先跑 status 核对识别结果。

💬 评论区 0