sync命令是强制将内存中已修改但未写入磁盘的缓存数据(包括文件内容、元数据等)立即刷入物理存储的关键操作,不校验或修复文件系统,仅确保数据持久化。

sync 命令不是“确保一致性”的万能开关,而是把内存里已修改但还没落盘的数据,强制刷进磁盘的关键动作。它不校验、不修复文件系统,只做一件事:让缓存里的数据真正写下去。
sync 是怎么起作用的
Linux 默认用页缓存(page cache)暂存写操作,提升速度。比如你 echo "done" > log.txt,内容其实先到内存,几秒后才由内核自动刷盘(通常每30秒一次)。这期间若断电,log.txt 就会丢内容。sync 就是打断这个延迟——它触发内核立即把所有挂载文件系统的脏页(dirty pages)写入对应设备,包括文件数据、目录结构、inode、超级块等元数据。
什么时候必须手动执行 sync
- 拔 USB 或 SD 卡前:不运行
sync就直接拔,极易损坏 FAT/exFAT 文件系统或丢失最后写入 - 关机/重启前:虽然 systemd 和 shutdown 脚本内部已调用,但手动加一行更安心
- 修改关键配置后:比如改完
/etc/fstab或/boot/grub/grub.cfg,sync后再 reboot - 执行
dd或mkfs等底层操作前:避免缓存干扰设备状态判断
怎么用才有效
-
sync(无参数):同步所有挂载点,最常用也最稳妥 -
sync /mnt/usb:只刷指定挂载点,适合多设备环境,减少等待时间 -
sync -d:仅同步文件内容,跳过权限、时间戳等元数据——适合大日志文件快速落盘,但不保证完整一致性 -
sync -f /dev/sdb1:部分实现支持按设备路径同步(非所有发行版可用),慎用
它不能做什么
- 不代替
fsck:sync不检查磁盘错误,也不修复损坏的 inode 或目录项 - 不替代
fsync():对单个文件的原子提交(如数据库事务),仍需程序内调用fsync() - 不解决硬件写缓存问题:如果硬盘自身开启了 write cache(如某些 SATA SSD),还需配合
hdparm -W0或sdparm --clear=WO关闭,否则sync仍可能被设备缓存拦截
本质上,sync 是用户层对内核缓存刷新机制的一次显式请求。它简单、可靠、无需额外依赖,是保障数据落地的最后一道确定性操作。


















