Linuxのシャットダウンまたは再起動について話すときに、人々がsync; sync; sync; sleep 30; halt
の呪文の使用を推奨しているのを見ています。
私はLinuxを最初から実行しており、これはBSD 4.2/4.3およびSunOS 4日間で推奨される手順でしたが、少なくとも過去10年間はそれを実行しなければならなかったことを思い出せません。 Linuxのシャットダウン/再起動を数千回行った。
カーネルがルートファイルシステムや他の重要なファイルシステムをアンマウントして同期できなかった時代はシングルユーザーモード(/ tmpなど)でも必要だったので、これは時代錯誤であり、フラッシュするように明示的に指示する必要があったできる限り多くのデータをディスクに保存します。
最近、関連するコードをカーネルソースでまだ見つけていない( http://lxr.linux.no とgoogleを掘り下げる)ので、カーネルは十分にスマートで、ルートもアンマウントできますファイルシステムとファイルシステムは、通常のshutdown
/reboot
/poweorff
の間に自身をアンマウントする前に、sync(2)を効果的に実行できるほどスマートです。
"sync; sync; sync"
が必要になるのは、ファイルシステムがきれいにアンマウントされない(物理ディスクの障害など)か、システムが直接リブート(8)を強制しただけでフリーズ状態が解除される状態にある場合だけです。たとえば、負荷が高すぎてシャットダウンコマンドをスケジュールできません)。
また、リムーバブルデバイスをマウント解除する前にsync
手順を実行することはなく、問題が発生することもありません。
別の例-Xenでは、DomUからDomUにshutdown
コマンドを送信できます。これは、誰もが最初にログインして魔法のsync; sync; sync
を入力する必要がない「クリーンシャットダウン」と見なされます。
私は正しいのですか、それとも数千回のシステムシャットダウンで幸運でしたか?
人々がhalt
の前にsync; sync
を実行する理由は、halt
コマンドが古いLinuxでシステムを正常にシャットダウンしないためです。 SYSVr4システムでこれを行う正しい方法は、常にinitに別の実行レベルに移動するように指示することです。
BSDとSunOS 4はSYSVr4オペレーティングシステムではないため、違いがあります。 Solaris(SunOS 5)はSYSVr4であり、Linuxは使用したいSYSVr4標準のビットを選択します。
Haltの使用は、ほとんどのUNIX(Linuxは例外の1つです)で実際に行うのはかなり悪い方法です。なぜなら、プロセスの停止やディスクのアンマウントなどを実行するためにinitスクリプトを実際に実行するのではなく、プロセッサを停止するだけだからです。
絶対にしないことが保証できる場合は、Linux以外のあらゆる種類のUNIXシステムを使用することで、halt
を使用し続けることができます-他のUNIXを使用する可能性がある場合は、init _runlevel_
またはshutdown
を使用する習慣を身に付けることをお勧めします。
shutdown
コマンドは、実際に init
プロセスに実行レベルを変更するように指示します run level -そうすることで、initはそれぞれの実行に進みますその実行レベルに関連付けられたK * initスクリプトとS * initスクリプト。実行レベル0のスクリプトの1つは、ファイルシステムのアンマウントを実行します。
Linuxでは、実行レベルがすでに0(シャットダウン)または6(再起動)でない限り、halt
コマンドはshutdown
コマンドを呼び出すだけです とにかく ;そこで損失はありません。
umount
を使用してファイルシステムをマウント解除すると、マウント解除する前にデータがディスクに同期されます。
Linuxでsync; sync; halt
を実行している場合、開発者はhalt
がright事;ただし、使用する方が正しいでしょう:shutdown now
onlysync
を複数回発行する理由を説明します。コマンドはディスクへのフラッシュをスケジュールしますが、実際のフラッシュが完了する前に戻ります。後続のsync
コマンドは、未処理のフラッシュが進行するまでブロックしてから、別のフラッシュをスケジュールして終了します。したがって、sync; sync
は同期フラッシュを保証します。 2回以上行う必要はなく、sleep
を混ぜる必要もありません。
複数のsync
呼び出しを使用したのは、OSとディスクに書き込みキューをフラッシュする時間を与えるためです。 "sync; sync; sync"
はそれほど有用とは見なされていませんでした。 1つは"sync<cr> sync<cr> sync<cr"
およびASR-33がキャリッジリターン/改行を行っている間の遅延により、十分な遅延が提供されました。 Haltは常に呼び出し同期を行いました。問題は、電源を切る前にキューをフラッシュするのに十分な時間があるかどうかでした。
元のポスターのsync; sleep 30
は、意図したものとより一致しています。
"sync; sync; sync"に目的がないと言っているのはあなたの年齢を明らかにすることです。
昔、Unixがティーンエイジャーにとって何かになる前は、ストリーミング/バックアップのニーズのためにTAPEを使用する必要がありました。多くの場合、バックアップをストリーミングするためにテープベースのファイルシステムをマウントします。磁気プラスチックテープのこの1本の細長い帯は、ファイルを..
'sync; sync; sync'コマンドは、これらの古いテープマシンが最後まで(シャットダウンの前に)巻き戻すように指示される方法でした-彼らはボード上にsync cmdを受け取るファームウェアを持っていました(すべての適切なファイルシステムのように) do)、そして直後にさらに2つのsync bufferコマンドが続く場合、テープドライブ自体がこれを「テープを巻き戻してアンマウントする」と解釈します。この方法を超えて、テープドライブに巻き戻すように指示する方法はありませんでした。そして、それは一種の行き詰まりです。この習慣は、ハードドライブが利用可能になったときにWordに引き継がれました。 )あなたが知っている私たちの筋肉の記憶!テープが一般的でなくなり、ハードドライブが利用可能になった直後に、民間伝承の地位を獲得したと私は信じていますが、それでもテープドライブを使用する私たちにはその用途があります。