在关闭Linux之前是否仍需要执行sync(8)?


19

我仍然看到人们sync; sync; sync; sleep 30; halt在谈论关闭或重新引导Linux时建议使用咒语。

自Linux诞生以来,我一直在运行Linux,尽管这是BSD 4.2 / 4.3和SunOS 4天中推荐的过程,但我不记得我至少在最近十年中必须这样做。经历了Linux的关闭/重新启动的过程可能有数千次。

我怀疑这是不合时宜的,因为即使在单用户模式下,内核也无法卸载并同步所需的根文件系统和其他关键文件系统(例如/ tmp),因此有必要明确告知它刷新尽可能多地将数据存储到磁盘。

这些天来,我还没有在内核源代码中找到相关的代码(通过http://lxr.linux.no和google进行挖掘),我怀疑内核足够聪明,甚至可以干净地卸载根文件系统,并且文件系统也足够聪明。到在正常卸载本身之前有效做同步(2)shutdown/ reboot/ poweorff

"sync; sync; sync"其中的文件系统不会卸载干净(如物理磁盘故障)或系统处于这样的状态,只有直接强迫重新启动(8)将它弄出来的冷冻(如负载过只在极端的情况下有必要高以安排关机命令)。

我也从未sync在卸载可移动设备之前执行此过程,也从未遇到问题。

另一个示例-Xen允许向DomU发送shutdown来自Dom0 的命令,这被认为是“干净关闭”,而无需任何人先登录并输入魔法sync; sync; sync

我是对的还是对数千次系统关闭感到幸运?


将只读文件系统重新安装为读/写怎么样?我已经将rootfs挂载为只读,并使用以下命令将其重新挂载为读/写:mount -o remount,rw /,然后当我更改了rootfs时,我会运行mount -o remount,ro /,但是当我检查fs时我发现了一些问题与fsck。在挂载为只读之前,第二个命令会调用SYNC吗?

Answers:


18

人们之所以会sync; sync在a之前运行halt是因为该halt命令无法在较旧的linux上彻底关闭系统。在SYSVr4系统上执行此操作的正确方法始终是告诉init移至其他运行级别。

BSD和SunOS 4不是SYSVr4操作系统,这就是它们不同的原因。Solaris(SunOS 5)是SYSVr4,Linux挑选了它要使用的SYSVr4标准。

在大多数UNIX(Linux是例外之一)上,使用halt实际上是一种非常糟糕的方法,因为它实际上并没有运行init脚本来执行诸如停止进程和卸载磁盘的操作-它只是停止了处理器。

如果您可以保证永远不会使用Linux以外的任何UNIX系统,那么您可以继续使用halt-如果有机会使用其他UNIX,那么我建议您养成使用init _runlevel_或的习惯。shutdown

shutdown命令实际上告诉init进程更改其运行级别运行级别 -这样做时,init会继续运行与该运行级别关联的每个K *初始化脚本和S *初始化脚本。运行级别0中的脚本之一执行文件系统的卸载。

在Linux上,除非运行级别已经为0(关闭)或6(重新引导)否则该halt命令仅调用该shutdown命令;所以在那里没有损失。

使用卸载文件系统的操作umount会将数据同步到磁盘上,然后再将其卸载。

如果您已经sync; sync; halt在Linux 上运行,那么文件系统状态就可以了,因为开发人员已确保这样halt正确。但是使用以下方法会更正确:shutdown now


感谢您的解释。只是为了澄清您的意思-“开发人员确保了停止做对的事情”意味着“停止”也调用“同步”,还是运行适当的初始化脚本最终将其称为“同步”?在单用户模式下并仅调用“停止”怎么办?我是否认为Linux 内核足够聪明,不会突然关闭,但会在关闭之前先卸载所有文件系统呢?
阿莫斯·夏皮拉

1
halt呼叫shutdown该呼叫umount,其执行同步。
DaveG

感谢DaveG。因此,您要说的是,这一切都发生在用户级别,并且内核不会自行卸载和同步文件系统吗?无论如何,今天听起来“同步;关闭”仪式是多余的。
阿莫斯·夏皮拉

7

使用多个sync调用是为了让OS和磁盘有时间刷新写队列。 "sync; sync; sync"被认为没有用;一个就这样做了"sync<cr> sync<cr> sync<cr",而当您的ASR-33进行回车/换行时,则有足够的延迟。总是停止通话同步。问题是在断电之前是否有足够的时间冲洗队列。

原始海报sync; sleep 30更符合预期。


7

只能说为什么你要发行sync多次。该命令将刷新计划到磁盘,但在实际刷新完成之前返回。任何后续sync命令都将阻塞,直到正在进行任何未完成的刷新为止,然后再安排另一个刷新并退出。因此,sync; sync确保同步刷新。您不需要做超过2次,也不需要sleep混合使用。


5

那些告诉我们“ sync; sync; sync”毫无用处的人正在透露您的年龄。

回顾过去,在青少年使用Unix之前,我们曾经不得不使用TAPE满足我们的流/备份需求。通常,我们会挂载一个基于磁带的文件系统,以将备份流式传输到其中,依此类推。我们所有人都拥有这条细长的磁性塑料带,用于将文件存储在..

'sync; sync; sync'命令是一种方法,可以让这些旧的磁带机完全回卷到结束(关闭之前)-它们具有可以接收sync cmd的固件(就像所有好的文件系统一样)这样做),并且如果紧随其后的是另外两个同步缓冲区命令,则磁带驱动器本身会将其解释为“倒带并卸下磁带”。除了这种方法之外,没有任何方法可以告诉磁带驱动器倒带,而且这种卡住了..当硬盘变得更可用时,这种习惯随后传到了这个词上—我们cru脚的老运营商不只是重新分配( )我们的肌肉记忆力!我相信,在磁带变得不那么普遍并且硬盘驱动器变得越来越普及之后,它很快就获得了民间文学的地位,但是对于我们这些使用磁带驱动器的人来说,它仍然有其用途。


3
磁带是字符设备。“安装”在块设备上运行。我去过那里(在80年代中期使用BSD 4.2在Vax 11/750上运行“转储”),没有这样的事情,并且在磁带设备上运行了“同步”。如果您将磁带作为一个设备名打开,则磁带将自动倒带,如果您使用另一设备名将其打开,磁带将保留在原位置,并且如果需要,您可以使用“ mt”发送明确的命令。
阿莫斯·夏皮拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.