学而实习之 不亦乐乎

Linux 使用 sync命令同步数据

2023-11-07 21:14:54

一、概述

在 linux/unix 系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率。这样虽然可以提高磁盘写入数据的效率,但是也带来了安全隐患,如果数据还未写入磁盘时,系统断电或者其他严重问题出现时,将会导致数据丢失。

所有可以使用 sync 命令强制将内存缓冲区中的数据立即写入磁盘。用户通常无需执行 sync 命令,系统会自动执行 update 或 bdflush 操作,将缓冲区的数据写入磁盘。

二、语法格式

格式:sync

功能:更新 i-node 表,并将缓冲文件写到硬盘中。

sync 命令是在关闭 Linux 系统时使用的。 用户需要注意的是,不能用简单的关闭电源的方法关闭系统,因为 Linux 象其他 Unix 系统一样,在内存中缓存了许多数据,在关闭系统时需要进行内存数据与硬盘数据的同步校验,保证硬盘数据在关闭系统时写入硬盘当中,只有这样才能确保数据不会丢失。一般正常的关闭系统的过程是自动进行这些工作的,在系统运行过程中也会定时做这些工作,不需要用户干预。 sync命令是强制把内存中的数据写回硬盘,以免数据的丢失。用户可以在需要的时候使用此命令。这个命令在系统关机或重新启动之前,最好多运行几次!

sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。

三、Linux 中 sync命令的作用分析

在用 reboot 命令启动 unix 系统后,系统提示出错信息,部分应用程序不能正常工作。经仔细检查系统文件,并和初始的正确备份进行比较,发现某些文件确实被破坏了,翻来覆去找不到文件遭破坏的原因,最后想到了写缓存命令:sync,在 reboot 前没有运行 sync 命令,导致了系统文件的改变而不能正常工作。

sync 命令的作用是,将有关文件系统的存储器常驻信息送入物理介质内。在暂停系统之前,比如要重新启动机器,一定要去执行 sync 命令。unix 系统运行经验表明,为确保可靠起见,应执行两遍 sync 命令,这是因为 sync 命令完成时,并不保证信息实际写到了磁盘上,虽然已经执行了一遍这个命令。在执行 sync 命令以后,要等待磁盘工作灯灭了(假定有系统工作指示灯的话),再去真正暂停机器的运行或启动机器。

unix 系统遭受破坏是随时都可能发生的事情,因此在启动机器或关机之前一定要运行 sync 命令。记住在任何情况下,慎重地执行 sync 命令决不会有任何坏处。

umount 时间过长,sync 命令的使用

有一个问题,比如 cp 一个文件到SD卡上,是不是首先先将这个文件写到SDRAM上,然后 umount 的时候再将 SDRAM 中的内容真正写 SD 卡上? 我 umount 的时候会过多一会才出现终端的提示符,根据写入文件的大小确定 umount 的时间?  

后来查了一下资料,Linux文件系统更新是一个复杂的过程,当用户程序对文件系统进行修改以后,例如进行了写操作,文件数据把修改记录在内核缓冲中,在数据没有写到磁盘的时候,依然能够执行用户进程,所有数据的改变都在inode的内容中得到反映。磁盘的数据更新实际上是异步进行的,很有可能在写操作已经完成很长时间以后才真正对磁盘的数据进行更新。

sync 命令强制把磁盘缓冲的所有数据写入磁盘,如果在没有把磁盘缓冲区的信息写入磁盘之前终止系统,则磁盘的文件系统就会处在一个不稳定的状态。而在正常模式下即使没有对分区进行umount的操作,在重启之前系统会调用sync命令强制把磁盘缓冲的所有数据写入磁盘,而在急救模式下必须对所挂的分区进行umount的操作,系统才会调用sync命令强制把磁盘缓冲的所有数据写入磁盘,请在急救模式下的朋友注意这个问题。其实“reboot -n(Don’t sync before reboot or halt)”在重启之前不用sync命令强制把磁盘缓冲的所有数据写入磁盘,就很能说明问题。

所以要 cp 完之后要执行 sync 命令将缓冲区的内容写到磁盘中,然后再umount 就不会出现延时了.

经验证,采用此方法,延迟写入问题可以解决