设备写配置用 echo 重定向到文件,返回 0 之后三秒拔电,重启后文件存在但大小是 0。目录项在,内容没了,业务按空配置启动。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,重定向写完只进了页缓存,内核按 dirty_expire_centisecs 延迟回写,掉电时数据还没到盘。文件长度更新也依赖元数据落盘,顺序不保证,就出现有名字没内容的空文件。
「fsync 掉电丢数据」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。报错里带路径的,先去看那个路径在不在、权限对不对。
printf 'mode=prod\n' > /etc/app/conf.tmp sync /etc/app/conf.tmp mv /etc/app/conf.tmp /etc/app/conf sync /etc/app
同一份配置存在多处的,先确认改的是被加载的那一份。
具体做法是,写完调 fsync 把数据和元数据刷下去;需要保证文件本身存在再 fsync 一次父目录;配置落盘用写临时文件加 rename 再 fsync 目录;关键设备加超级电容或换带掉电保护的存储。
最后用这个标准收尾,重复断电测试十次 conf 每次都有完整内容 不再出现 0 字节。
