sync 是什么
Linux 写文件时先把数据放进页缓存,由内核在稍后刷到磁盘,这样写操作很快,但断电或拔盘时缓存里的数据就丢了。sync 的作用是主动触发一次刷写,把脏页与文件系统日志提交到磁盘。它与 umount、fsync 属于同一类保障手段,只是适用范围不同。
基本信息
| 适用平台 | Linux/Unix(coreutils;较新版本支持按文件与文件系统刷写) |
|---|---|
| 命令语法 | sync [选项] [文件...] |
| 常用选项 | -f 只刷指定文件所在的文件系统;直接给文件参数则刷与该文件相关的写入 |
| 相关接口 | fsync 与 fdatasync 是编程接口,用于单文件;umount 会先刷写再卸载 |
| 查看进度 | /proc/meminfo 的 Dirty 与 Writeback 字段可观察脏页与回写量 |
典型使用场景
- 拔除移动存储前的保险动作:确保数据不在缓存里
- 镜像与备份后:dd 或复制完成后刷一次再卸载
- 卸载失败处置:先 sync 与 sync -f,再排查占用者
- 维护窗口准备:重启或断电前确认脏页已落地
- 排查 IO 抖动:观察同步时的脏页与回写变化
常用示例
常用示例
sync # 刷写全部文件系统的脏页
sync /data/file.img # 只刷与该文件相关的写入
sync -f /data # 只刷该文件系统
watch -n2 grep -E 'Dirty|Writeback' /proc/meminfo # 观察脏页与回写量
dd if=image.iso of=/dev/sdb bs=4M conv=fsync status=progress # 写盘并强制刷写相关概念读法
| 项 | 含义 | 怎么看 |
|---|---|---|
| Dirty | 待写回的脏页字节数 | 写入高峰时会上升,刷写后回落 |
| Writeback | 正在回写的字节数 | 长期高位说明存储跟不上写入速度 |
| sync 命令 | 触发一次全局或范围刷写 | 返回不代表硬件缓存已清空 |
| fsync 与 fdatasync | 对单个文件的刷写接口 | 程序侧保障持久性的标准手段 |
| umount | 卸载前自动刷写 | 卸载成功是数据已落盘的强信号 |
| conv=fsync | dd 的刷写选项 | 写完立即同步,适合镜像写入 |
拔 U 盘、移动盘,或 dd 写镜像完成之后,养成先 sync 再卸载的习惯:卸载成功返回才算稳妥;设备忙时先 fuser -m 看占用者,而不是直接拔线或强制卸载。
共享存储与网络文件系统要另眼看待:客户端侧的 sync 只能保证本地缓存已提交给服务端,服务端是否真正落盘、何时落盘,取决于它自己的写策略与缓存设置,不能靠客户端一条命令兜住。
sync 返回只表示内核已受理并开始写出,不等于硬件缓存里的数据已经落到盘片——磁盘自身的写缓存仍可能持有数据。关键操作应以 umount 成功为完成标志,或使用 dd 的 conv=fsync 这类显式同步选项。