影评周公子 2026-02-16 05:35 采纳率: 99.1%
浏览 0
已采纳

OpenWrt定时重启后配置丢失,如何持久化保存?

在OpenWrt中配置定时重启(如通过`cron`执行`reboot`)后出现配置丢失,常见于误将配置写入易失性内存(如`/tmp`或未提交的OverlayFS上层),或未正确保存至持久化分区(`/overlay`)。典型原因包括:使用`uci set`后未执行`uci commit`,或修改了`/etc/config/`外的临时文件;系统启动时因`fstab`挂载异常、`overlay`损坏或`sysupgrade`残留导致配置未加载;亦或启用了`firstboot`机制自动恢复默认配置。此外,若定时脚本直接调用`reboot -f`跳过正常关机流程,可能中断配置同步。解决关键在于确保所有配置变更经`uci commit`持久化,并验证`/overlay`分区可读写且未满;推荐结合`uci batch`批量操作+`sync`命令强化落盘;对关键服务(如防火墙、网络)启用`/etc/init.d/ enable`保证开机自启。最后,建议通过`sysupgrade -n`保留配置升级固件,避免误刷清空。
  • 写回答

1条回答 默认 最新

  • 薄荷白开水 2026-02-16 08:52
    关注
    ```html

    一、现象定位:从日志与状态初判配置丢失根源

    执行 cron 定时 reboot 后配置消失,首先应检查系统启动日志:dmesg | grep -i overlay 验证 OverlayFS 是否成功挂载;logread -e "firstboot" 确认是否触发了初始化重置;df -h /overlay 查看持久化分区使用率(>95% 将导致 UCI 提交静默失败)。典型错误日志包括 "overlay: failed to mount""uci: Entry not found"。同时比对 /etc/config/networkuci show network 输出是否一致——若后者为空或回退至默认值,说明 UCI 数据库未持久化。

    二、机制深挖:OpenWrt 配置生命周期与 OverlayFS 分层模型

    OpenWrt 采用典型的 OverlayFS 双层架构
    - /rom(只读):固件内置的默认配置与服务脚本;
    - /overlay(可写):用户通过 uci set/commit 写入的增量配置,挂载于 /overlay/upper
    - /tmp/var 均为内存临时文件系统(tmpfs),重启即清空。
    关键路径:uci set → /tmp/.uci → uci commit → /overlay/upper/etc/config/* → sync → block device flush。若定时脚本中使用 reboot -f,将跳过 preinit 阶段的 sync 调用及 /etc/init.d/* stop 流程,导致未刷盘的 UCI 更改永久丢失。

    三、根因分析:五类高频配置丢失场景对照表

    类别触发条件验证命令修复方向
    UCI 未提交uci set firewall.@zone[0].name='lan' 后无 commituci changes 返回非空补执行 uci commit && sync
    Overlay 损坏sysupgrade 中断、断电、NAND 坏块mount | grep overlay 显示 failedls -l /overlay/upper/etc/config/ 为空执行 firstboot -y && reboot(慎用)或手动恢复备份
    fstab 挂载异常/etc/config/fstaboption target '/overlay' 错误或 UUID 不匹配cat /etc/config/fstab + blkid 核对设备标识修正 fstab 并 service fstab restart

    四、加固实践:生产环境推荐的定时重启安全范式

    避免直接在 crontab 中写 0 3 * * * reboot。应采用如下健壮脚本(保存为 /root/scripts/safe-reboot.sh):

    #!/bin/sh
    # 安全重启:强制同步 + UCI 检查 + 服务预停
    uci commit && sync && \
    /etc/init.d/firewall stop && \
    /etc/init.d/network reload && \
    sleep 2 && \
    logger "Scheduled safe reboot triggered" && \
    reboot
    

    并添加 cron 条目:0 3 * * * /root/scripts/safe-reboot.sh >/dev/null 2>&1。该流程确保所有 UCI 变更落盘、关键服务优雅关闭、日志可追溯。

    五、高阶防御:构建配置韧性体系(面向5+年从业者)

    超越单点修复,建立三层防护:

    • 自动化校验层:每日运行 /usr/bin/uci-export.sh(自定义脚本)将 uci export 结果压缩加密后推送至远程 NAS;
    • 启动自愈层:修改 /etc/rc.local,在 exit 0 前插入:[ -f /overlay/upper/etc/config/network ] || { logger "Critical config missing, restoring from backup"; cp /root/backup/network /etc/config/; uci commit network; }
    • 升级免疫层:固件升级严格使用 sysupgrade -n -v firmware.bin,禁止 -F 强制覆盖;同时启用 CONFIG_TARGET_ROOTFS_TARGZ=y 编译选项以支持 tar.gz 回滚包。

    六、故障复现与验证流程图

    graph TD A[定时 reboot 触发] --> B{是否执行 uci commit?} B -- 否 --> C[配置滞留 /tmp/.uci] B -- 是 --> D{/overlay 是否可写?} D -- 否 --> E[DF -h /overlay 满载或挂载失败] D -- 是 --> F[reboot -f?] F -- 是 --> G[跳过 sync & service stop → 配置丢失] F -- 否 --> H[正常关机流程 → 配置保留] C --> I[重启后 uci show 为空] E --> I G --> I I --> J[执行 uci batch + sync + logger 验证]
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月17日
  • 创建了问题 2月16日