我正在观察该命令的使用情况sync
,并且我读到该命令确保内存中的任何内容都写入磁盘。
当我考虑在可移动磁盘(USB)上安装 Ubuntu 时,我想知道是否有必要执行此命令。
我担心的是,当关闭计算机时,如果数据仍在写入,这些数据最终会因系统关闭而丢失。
sync
关机或者重启系统前是否需要运行?
有人对此进行更详细的解释吗?
答案1
意外关机或系统崩溃时可能会丢失数据 - 此时操作系统无法将数据从内存刷新到磁盘。在正常关机或重启期间,操作系统仍处于控制状态,因此它会将数据写入磁盘。
换句话说,正常关机/重启是可以的。还有一种情况称为halt
状态 - 机器仍在运行,但操作系统已完成关机过程并放弃对硬件的控制。在这种情况下,关闭机器也是可以的。不正常的断电和关机是不可以的。
答案2
正常关机sync
在磁盘卸载后(或以只读方式重新安装,就根文件系统而言)最后会执行 。通常,这不会执行任何操作,因为文件系统已在 上同步umount
,因此数据应该在“卸载文件系统”阶段写入。
由于当服务器无法访问时,网络文件系统可能需要任意长的时间才能卸载,因此某些 init 系统会实现超时umount
,并且如果磁盘中的挂载点仍处于挂载状态,则无法卸载磁盘,这可能会导致无法彻底卸载文件系统的连锁故障,在这种情况下,当达到关机点时可能仍有未写入的数据。然后,最终同步将确保即使文件系统未彻底卸载也不会丢失任何数据。下次启动时进行的文件系统检查和/或日志重放(取决于文件系统)应该会清除此问题。
最终同步在(理想情况下)不存在读写挂载且没有其他程序仍在运行时运行,因此此后不会生成任何新的写入请求。此时,持有已删除文件的打开文件句柄的僵尸进程也应该已被清理。
磁盘可以实现自己的缓存,这应该是完全透明的,但是 Linux 通常还是会向驱动器发送关机命令并等待报告完成;驱动器固件通常足够智能,可以在那之前完成所有待处理的写入。
对于 USB 设备,SCSI 命令被包装在 USB 数据包中,因此相同的序列对它们有效,但由于 USB 比 SCSI 慢很多,内核缓存通常会变得大很多,因此sync
可能需要几分钟才能完成,但内核会尽职尽责地等待。