✕
开启精彩搜索
热门搜索
emby EMBY 解析 免流 源码 IPV6 阿里 阿里云 青龙 音乐 网心 网心云 webdav 阿里云盘 unraid 洗白 Rclone 刮削 云梦

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 时,脚本会:

  1. 先自动备份当前 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
  2. 备份会显式检查 tar 返回值,并校验包内 var/lib/postgresql 和 usr/local/apps/@appcenter 的条目数;如果 PG 为 0,直接红字警告「App 登记将丢失」。
  3. 然后注释 eMMC 引导分区 fnEnv.txt 里的 rootdev= 行,让下次从 eMMC 启动。
  4. 最后询问是否立即重启,支持三级兜底(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 环境运行,流程是:

  1. [0/6] 给 SATA 根挂载 remount 加 compress=zstd,写入即压缩;
  2. [1/6] 清空 SATA 根旧内容(保留 lost+found);
  3. [2/6] rsync -aHAXx --numeric-ids 完整克隆 eMMC → SATA,排除 proc/sys/dev/run/tmp/boot/mnt/media/vol00 和 *.bak-*;如果状态目录和 / 同盘,自动加 --exclude 避免自我复制;
  4. [3/6] 修正 SATA 的 fstab:根和 /boot 指向本机 SATA UUID,并追加 compress=zstd(幂等,先清掉 ext4 遗留的 errors=remount-ro);
  5. [4/6] 同步 /boot/ 到 SATA 引导分区;
  6. [5/6] 恢复升级前的状态备份——会弹出备份包选择器,10 秒不选自动用最新;
  7. [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,强制重启安全。

七、使用建议与已知风险

这套流程正常路径下是可靠的,但有几处边界情况建议留意:

  1. sync 里 rsync 退出码只打印不判断。如果 rsync 返回 1/11 这类错误,脚本仍会继续改 fstab、恢复状态、报「全部完成」。建议关注输出里的退出码,异常时不要直接切 SATA。
  2. to-sata 对内核模块缺失只警告不硬阻断。跨内核版本时务必认真看预检输出,不要随手输入 yes。
  3. PG 路径校验硬编码 15/main。飞牛若升级 PostgreSQL 大版本,校验会误报「注册表缺失」,属于误报,可人工确认。
  4. 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     # 部署到另一套系统

附上脚本文件源文件

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

🔒
评论后可见
本条内容需要评论一次才能查看
去评论 ↓

本文基于老默OESP工具箱 v4.5 整理。脚本涉及分区、引导和系统克隆操作,执行前请确认已理解流程并做好数据备份;不同设备批次/固件底包的启动参数可能不同,首次使用建议先跑 status 核对识别结果。

💬 评论区 0