Amo*_*ira 19 filesystems synchronization
我仍然看到人们sync; sync; sync; sleep 30; halt
在谈论关闭或重新启动 Linux 时建议使用咒语。
我从 Linux 开始就一直在运行,虽然这是 BSD 4.2/4.3 和 SunOS 4 天的推荐程序,但我不记得至少在过去的十年里我必须这样做,在此期间我可能经历了 Linux 的关闭/重启可能数千次。
我怀疑这是一个时代错误,因为内核无法卸载和同步根文件系统和其他关键文件系统,即使在单用户模式下(例如 /tmp),因此有必要明确告诉它刷新尽可能多的数据到磁盘。
这些天,还没有在内核源代码中找到相关代码(通过http://lxr.linux.no和 google挖掘),我怀疑内核足够聪明,甚至可以干净地卸载根文件系统,文件系统也足够聪明在正常shutdown
/ reboot
/期间卸载自身之前有效地执行同步(2)poweorff
。
在"sync; sync; sync"
其中的文件系统不会卸载干净(如物理磁盘故障)或系统处于这样的状态,只有直接强迫重新启动(8)将它弄出来的冷冻(如负载过只在极端的情况下有必要高以让它安排关闭命令)。
sync
在卸载可移动设备之前,我也从未执行过该程序,也从未遇到过问题。
另一个例子 - Xen 允许 DomUshutdown
从 Dom0发送命令,这被认为是“干净的关闭”,无需任何人先登录并输入魔法sync; sync; sync
。
我是对的还是我幸运地关闭了数千次系统?
Dav*_*veG 18
人们会sync; sync
在 a 之前运行的原因halt
是因为该halt
命令不会在较旧的 linux 上干净地关闭系统。在 SYSVr4 系统上执行此操作的正确方法始终是告诉 init 移动到不同的运行级别。
BSD 和 SunOS 4 不是 SYSVr4 操作系统,这就是它们不同的原因。Solaris (SunOS 5) 是 SYSVr4,Linux 挑选出它想要使用的 SYSVr4 标准。
在大多数 UNIX 上(Linux 是一个例外),使用暂停实际上是一种非常糟糕的方式,因为它实际上并没有通过 init 脚本运行来执行诸如停止进程和卸载磁盘之类的事情——它只是停止处理器。
如果您可以保证永远不会使用 Linux 以外的任何类型的 UNIX 系统,那么您可以继续使用halt
- 如果您有机会使用其他 UNIX,那么我建议您养成使用init _runlevel_
或shutdown
.
该shutdown
命令实际上告诉init
进程更改其运行级别运行级别- 在这样做时 init 然后继续运行与该运行级别关联的每个 K* init 脚本和 S* init 脚本。运行级别 0 中的脚本之一执行文件系统的卸载。
在 Linux 上,除非运行级别已经是 0(关闭)或 6(重新启动),否则该halt
命令只会调用该shutdown
命令;所以没有损失。
使用卸载文件系统的行为umount
将在卸载之前将数据同步到磁盘。
如果您一直sync; sync; halt
在 Linux上运行,那么您会对文件系统状态感到满意,因为开发人员已确保它halt
做正确的事情;但是使用会更正确:shutdown now
小智 8
我只能说为什么你会sync
多次发出。该命令计划刷新到磁盘,但在实际刷新完成之前返回。sync
在调度另一个刷新并退出之前,任何后续命令都将阻塞,直到任何未完成的刷新正在进行。因此,sync; sync
确保同步刷新。你不需要做超过 2 次,也不需要sleep
混合。
多次sync
调用的使用是为了让操作系统和磁盘有时间刷新写入队列。 "sync; sync; sync"
被认为没有那么有用;一个做了"sync<cr> sync<cr> sync<cr"
,而你的 ASR-33 做回车/换行的延迟提供了足够的延迟。暂停总是进行呼叫同步;问题是在断电之前是否有足够的时间来刷新队列。
原始海报sync; sleep 30
更符合预期。
归档时间: |
|
查看次数: |
17684 次 |
最近记录: |