Ist die Ausführung von sync (8) noch erforderlich, bevor Linux heruntergefahren wird?


19

Ich sehe immer noch Leute, die die Verwendung von sync; sync; sync; sleep 30; haltBeschwörungsformeln empfehlen, wenn sie über das Herunterfahren oder Neustarten von Linux sprechen.

Ich habe Linux von Anfang an ausgeführt, und obwohl dies in BSD 4.2 / 4.3 und SunOS 4 Tage empfohlen wurde, kann ich mich nicht erinnern, dass ich dies in den letzten zehn Jahren getan habe, in denen ich wahrscheinlich war Linux wurde möglicherweise tausende Male heruntergefahren / neu gestartet.

Ich vermute, dass dies ein Anachronismus ist, da der Kernel das Root-Dateisystem und andere wichtige Dateisysteme, die selbst im Einzelbenutzermodus (z. B. / tmp) benötigt werden, nicht mehr aushängen und synchronisieren konnte so viele Daten wie möglich auf die Festplatte.

In diesen Tagen habe ich den Verdacht, dass der Kernel intelligent genug ist, um selbst das Root-Dateisystem und das Dateisystem sauber zu entladen , ohne den relevanten Code in der Kernelquelle zu finden (siehe http://lxr.linux.no und google) um effektiv während eines normalen vor sich Aushängen ein sync (2) do shutdown/ reboot/ poweorff.

Das "sync; sync; sync"ist nur notwendig , in extremen Fällen , in denen das Dateisystem nicht aushänge sauber (zB physischer Plattenausfall) oder das System in einem Zustand ist , dass nur eine direkte Neustart zwingt (8) wird es seine Gefrieren raus (zB die Last zu ist hoch, um den Befehl zum Herunterfahren einzuplanen).

Ich syncführe die Prozedur auch nie vor dem Abmelden von Wechseldatenträgern aus und stoße nie auf ein Problem.

Ein weiteres Beispiel - Xen ermöglicht es der DomU, einen shutdownBefehl von Dom0 zu senden. Dies wird als "sauberes Herunterfahren" betrachtet, ohne dass sich jemand anmelden und zuerst den magischen Befehl eingeben muss sync; sync; sync.

Habe ich recht oder hatte ich Glück für ein paar tausend Systemstillstände?


Was ist mit der erneuten Bereitstellung eines schreibgeschützten Dateisystems als Lese- / Schreibzugriff? Ich habe rootfs als readonly gemountet und mit diesem Befehl als read / write gemountet: mount -o remount, rw / und dann, wenn ich rootfs geändert habe, führe ich mount -o remount, ro / aus, aber ich sehe einige Probleme, wenn ich fs überprüfe mit fsck. Ruft der zweite Befehl SYNC auf, bevor er als readonly gemountet wird?

Antworten:


18

Der Grund, warum Benutzer sync; syncvor a ausgeführt wurden, haltist, dass der haltBefehl das System unter älteren Linux-Betriebssystemen nicht ordnungsgemäß herunterfährt. Der richtige Weg, dies auf SYSVr4-Systemen zu tun, besteht immer darin, init anzuweisen, auf einen anderen Runlevel zu wechseln.

BSD und SunOS 4 sind keine SYSVr4-Betriebssysteme, weshalb sie sich unterscheiden. Solaris (SunOS 5) ist SYSVr4, und Linux greift Bits des SYSVr4-Standards auf, den es verwenden möchte.

Die Verwendung von halt ist auf den meisten UNIX-Systemen eine ziemlich schlechte Methode (Linux ist eine der Ausnahmen), da es die Init-Skripte nicht durchläuft, um Prozesse zu stoppen oder Datenträger abzuhängen - es stoppt lediglich den Prozessor.

Wenn Sie garantieren können, dass Sie niemalshalt ein anderes UNIX-System als Linux verwenden werden, können Sie es auch weiterhin verwenden. Wenn die Möglichkeit besteht, dass Sie andere UNIX-Systeme verwenden, empfehle ich Ihnen, sich an die Verwendung von init _runlevel_oder zu gewöhnen shutdown.

Der shutdownBefehl weist tatsächlich den initProzess seinen Lauf Ebene zu ändern Runlevel - dabei init geht dann mit dieser Ausführungsebene zugeordnet jeden des K * Init - Skripte und S * Init - Skripte auszuführen. Eines der Skripte in Run-Level 0 führt das Unmounten der Dateisysteme durch.

Unter Linux das haltnennt Befehl nur den shutdownBefehl , wenn die Ausführungsebene bereits 0 ist (Herunterfahren) oder 6 (Neustart) sowieso ; also kein verlust da.

Durch das umountAufheben der Bereitstellung eines Dateisystems werden die Daten vor dem Aufheben der Bereitstellung mit der Festplatte synchronisiert.

Wenn Sie unter sync; sync; haltLinux gearbeitet haben, war der Dateisystemstatus in Ordnung, da die Entwickler sichergestellt haben, dass haltdas Richtige getan wird. es wäre jedoch richtiger zu verwenden:shutdown now


Danke für die Erklärung. Nur um zu verdeutlichen, was Sie sagen: "Die Entwickler haben dafür gesorgt, dass halt das Richtige tut." Was ist, wenn Sie sich bereits im Einzelbenutzermodus befinden und nur "halt" aufrufen? Bin ich in meiner Annahme richtig, dass der Linux- Kernel gerade klug genug ist, um nicht wirklich abrupt herunterzufahren, sondern alle Dateisysteme vor dem Herunterfahren zu entfernen?
Amos Shapira

1
haltruft auf, shutdownwelcher ruft auf, umountwelcher führt eine Synchronisierung durch.
DaveG

Danke DaveG. Sie sagen also, dass alles auf Benutzerebene geschieht und der Kernel Dateisysteme nicht automatisch umountet und synchronisiert? In jedem Fall klingt es so, als wäre die "Sync; Shutdown" -Zeremonie heute überflüssig.
Amos Shapira

7

Die Verwendung mehrerer syncAufrufe sollte dem Betriebssystem und den Festplatten Zeit geben, die Schreibwarteschlangen zu leeren. "sync; sync; sync"wurde nicht als nützlich erachtet; ein hat "sync<cr> sync<cr> sync<cr"und die Verzögerung, während Ihr ASR-33 den Wagenrücklauf / Newline tat, stellte genügend Verzögerung zur Verfügung. Halt hat immer Sync aufgerufen. Die Frage war, ob noch genügend Zeit vorhanden sein würde, um die Warteschlangen zu leeren, bevor die Stromversorgung unterbrochen wurde.

Der ursprüngliche Poster entspricht sync; sleep 30eher dem, was beabsichtigt war.


7

Ich kann nur sagen, warum Sie syncmehrmals ausstellen würden . Der Befehl plant das Leeren auf die Festplatte, kehrt jedoch zurück, bevor das eigentliche Leeren abgeschlossen ist. Jeder nachfolgende syncBefehl wird blockiert, bis eine ausstehende Spülung ausgeführt wird, bevor eine weitere Spülung geplant und beendet wird. Somit ist sync; synceine synchrone Spülung gewährleistet. Sie müssen es nicht öfter als zweimal machen oder sleepin den Mix einbringen .


5

Diejenigen von Ihnen, die uns sagen, dass "Synchronisieren; Synchronisieren; Synchronisieren" keinen Zweck hat, enthüllen Ihr Alter.

In der guten alten Zeit, bevor Unix etwas für Teenager war, mussten wir TAPE für unsere Streaming- / Backup-Anforderungen verwenden. Oft mounten wir ein bandbasiertes Dateisystem, um Backups zu streamen und so weiter. Dieses eine lange dünne Band aus magnetischem Plastikband war alles, was einige von uns hatten, um unsere Dateien auf ... zu speichern.

Mit dem Befehl 'sync; sync; sync' konnten diese alten Bandmaschinen angewiesen werden, sich bis zum Ende zurückzuspulen (vor dem Herunterfahren) - sie hatten Firmware an Bord, die den Befehl sync erhalten würde (wie alle guten Dateisysteme) tun), und wenn es fast sofort von zwei weiteren Synchronisierungspufferbefehlen gefolgt würde, würde das Bandlaufwerk dies so interpretieren, dass es "das Band zurückspulen und es aushängen" würde. Es gab keine Möglichkeit, das Bandlaufwerk über diese Methode hinaus zum Zurückspulen zu bewegen, und es blieb irgendwie hängen. Diese Angewohnheit ging dann in das Wort über, als Festplatten immer mehr verfügbar wurden. ) unser Muskelgedächtnis, weißt du! Ich glaube, es hat den Folklorestatus erreicht, kurz nachdem Bänder seltener wurden und Festplatten immer mehr verfügbar wurden, aber es hat immer noch seine Verwendung für diejenigen von uns, die Bandlaufwerke haben.


3
Bänder sind Zeichengeräte. "mount" funktioniert auf Blockgeräten. Ich war dort (lief Mitte der 80er Jahre auf Vax 11/750 mit BSD 4.2 "Dump") und es gab so etwas nicht und lief "Sync" auf dem Bandgerät. Das Band würde automatisch zurückgespult, wenn Sie es als einen Gerätenamen öffnen und dort bleiben, wo es war, wenn Sie es mit einem anderen öffnen, und Sie könnten explizite Befehle mit "mt" senden, wenn Sie müssten.
Amos Shapira
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.