sync仅强制刷写内核VFS层脏页至块设备驱动队列,无法控制硬件写缓存、应用层缓冲或文件系统挂载选项等后续环节,故不能完全保障掉电安全。

单纯执行 sync 命令不能完全保障掉电时的数据安全。它只完成内核 VFS 层的刷盘,后续环节若存在缓存或延迟,数据仍可能丢失。
sync 能管到哪一层?
sync 强制将已提交到虚拟文件系统(VFS)层的脏页写入块设备驱动队列。这意味着:
- 应用层调用 write() 后未显式 fsync() 或 fflush() 的数据,sync 不会处理
- 已进入内核页缓存、但尚未提交给底层块设备的数据,sync 会推动其向下传递
- 它不触达硬盘/SSD 自身的写缓存(write-back cache),这部分由硬件控制
硬件写缓存是关键盲区
多数 SATA SSD 和部分 NVMe 盘默认启用 write-back cache,断电时缓存中未落盘的数据会消失。sync 对此完全无效,必须额外配置:
- 对传统 SATA 设备:用 hdparm -W0 /dev/sdX 关闭写缓存(需 root,且部分盘不支持)
- 对 NVMe 设备:用 nvme set-feature -f 0x05 -v 0 /dev/nvme0n1 禁用 volatile write cache
- 更稳妥方案:选用支持断电保护(PLP)的企业级 SSD,并确认其 write-cache 已启用且固件正常
关机前该怎么做才更可靠?
在非紧急关机场景下,建议组合操作,而非只依赖多次 sync:
- 先确保关键应用已完成 fsync()(如数据库已执行 checkpoint,日志库已 flush)
- 运行一次 sync,等待命令返回(它会阻塞直到 VFS 层刷完)
- 再执行 echo 3 > /proc/sys/vm/drop_caches(可选,清空页缓存,辅助验证无残留脏页)
- 最后使用标准关机命令:shutdown -h now 或 systemctl poweroff,它们内部已包含 sync + 文件系统冻结逻辑
哪些情况 sync 实际起不到作用?
以下情形即使反复执行 sync,也无法避免掉电丢数据:
- 应用程序使用用户态缓冲(如某些 C++ 日志库、自定义 ring buffer),数据卡在应用内存未进内核
- 文件系统挂载时加了 barrier=0 或 data=writeback(如 ext3/4 的非默认模式)
- RAID 卡或 HBA 卡自身带缓存且未配电池/电容保护(BBU/FBWC)
- 使用 overlayfs、aufs 等叠加文件系统,上层写未触发下层同步


















