L'exécution de sync (8) est-elle toujours requise avant d'arrêter Linux?

19

Je vois toujours des gens recommander l'utilisation d' sync; sync; sync; sleep 30; haltincantations lorsqu'ils parlent d'arrêter ou de redémarrer Linux.

J'utilise Linux depuis sa création et bien que ce soit la procédure recommandée dans les jours BSD 4.2 / 4.3 et SunOS 4, je ne me souviens pas que je devais le faire pendant au moins les dix dernières années, au cours desquelles j'ai probablement a subi l'arrêt / le redémarrage de Linux peut-être des milliers de fois.

Je soupçonne que c'est un anachronisme depuis l'époque où le noyau ne pouvait pas démonter et synchroniser le système de fichiers racine et d'autres systèmes de fichiers critiques requis même en mode mono-utilisateur (par exemple / tmp), et il était donc nécessaire de lui dire explicitement de vider autant de données que possible sur le disque.

De nos jours, sans trouver encore le code pertinent dans la source du noyau (en fouillant sur http://lxr.linux.no et google), je soupçonne que le noyau est assez intelligent pour démonter proprement même le système de fichiers racine et que le système de fichiers est assez intelligent pour effectuer efficacement une synchronisation (2) avant de se démonter pendant un shutdown/ reboot/ normal poweorff.

Le "sync; sync; sync"n'est nécessaire que dans les cas extrêmes où le système de fichiers ne se démonte pas proprement (par exemple, défaillance du disque physique) ou lorsque le système est dans un état qui ne force que le redémarrage direct (8) à le sortir de son gel (par exemple, la charge est trop élevé pour lui permettre de planifier la commande d'arrêt).

Je ne fais également jamais la syncprocédure avant de démonter les périphériques amovibles et je ne rencontre jamais de problème.

Un autre exemple - Xen permet à la DomU de recevoir une shutdowncommande du Dom0, ceci est considéré comme un "arrêt net" sans que personne n'ait à se connecter et à taper le magique d' sync; sync; syncabord.

Ai-je raison ou ai-je eu de la chance pour quelques milliers d'arrêts du système?

Amos Shapira
la source
Qu'en est-il du remontage d'un système de fichiers en lecture seule en lecture / écriture? J'ai monté rootfs en lecture seule et je le remonte en lecture / écriture avec cette commande: mount -o remount, rw / puis quand j'ai changé rootfs je lance mount -o remount, ro / mais je vois des problèmes quand je vérifie fs avec fsck. La deuxième commande appelle-t-elle SYNC avant de monter en lecture seule?

Réponses:

18

La raison pour laquelle les gens s'exécuteraient sync; syncavant a haltest que la haltcommande n'arrêterait pas proprement le système sur les anciens linux. La bonne façon de procéder sur les systèmes SYSVr4 a toujours été de dire à init de passer à un niveau d'exécution différent.

BSD et SunOS 4 ne sont pas des systèmes d'exploitation SYSVr4, c'est pourquoi ils diffèrent. Solaris (SunOS 5) est SYSVr4 et Linux sélectionne les bits de la norme SYSVr4 qu'il souhaite utiliser.

Utiliser halt est en fait une très mauvaise façon de le faire sur la plupart des UNIX (Linux étant une des exceptions) car il ne passe pas par les scripts d'initialisation pour effectuer des choses comme arrêter les processus et démonter les disques - il arrête juste le processeur.

Si vous ne pouvez garantir que vous ne jamais, jamais utiliser tout type de système UNIX que Linux, vous pouvez continuer à utiliser halt- s'il y a une chance que vous allez utiliser d' autres unix alors je vous recommande de prendre l'habitude d'utiliser init _runlevel_ou shutdown.

La shutdowncommande indique en fait au initprocessus de modifier son niveau d'exécution niveau d' exécution - ce faisant, init procède ensuite à l'exécution de chacun des scripts d'initialisation K * et S * init associés à ce niveau d'exécution. L'un des scripts du niveau d'exécution 0 effectue le démontage des systèmes de fichiers.

Sous Linux, la haltcommande appelle simplement la shutdowncommande à moins que le niveau d'exécution soit déjà 0 (arrêt) ou 6 (redémarrage) de toute façon ; donc pas de perte là-bas.

Le fait de démonter un système de fichiers en utilisant umountsynchronisera les données sur le disque avant de les démonter.

Si vous avez exécuté sync; sync; haltsous Linux, vous aurez été d'accord avec l'état du système de fichiers parce que les développeurs se sont assurés que cela haltfait la bonne chose; cependant il serait plus correct d'utiliser:shutdown now

DaveG
la source
Merci pour l'explication. Juste pour clarifier ce que vous dites - "les développeurs ont veillé à ce que halt fasse la bonne chose" signifie que "stop" appelle aussi "sync" ou qu'il exécute les scripts d'initialisation appropriés qui finissent par appeler "sync"? Qu'en est-il déjà d'être en mode mono-utilisateur et d'appeler simplement "stopper"? Ai-je raison de supposer que le noyau Linux est juste assez intelligent pour ne pas vraiment s'arrêter brutalement mais démontera tous les systèmes de fichiers avant de s'arrêter?
Amos Shapira
1
haltappels shutdownqui appelle umountqui effectue une synchronisation.
DaveG
Merci DaveG. Donc, ce que vous dites, c'est que tout se passe au niveau utilisateur et que le noyau ne démontera pas et ne synchronisera pas les systèmes de fichiers tout seul? En tout cas, cela ressemble à la cérémonie de "synchronisation; arrêt" qui est redondante aujourd'hui.
Amos Shapira
7

L'utilisation d' syncappels multiples devait permettre au système d'exploitation et aux disques de vider les files d'attente d'écriture. "sync; sync; sync"n'était pas considéré comme utile; on l'a fait "sync<cr> sync<cr> sync<cr"et le retard tandis que votre ASR-33 a fait le retour chariot / nouvelle ligne a fourni suffisamment de retard. Halt a toujours appelé la synchronisation; la question était de savoir s'il y aurait suffisamment de temps pour vider les files d'attente avant de couper l'alimentation.

L'affiche originale sync; sleep 30est plus conforme à ce qui était prévu.

mpez0
la source
7

Je ne peux que vous expliquer pourquoi vous émettez syncplusieurs fois. La commande planifie le vidage sur disque mais revient avant la fin du vidage réel. Toute synccommande ultérieure sera bloquée jusqu'à ce qu'un vidage en cours soit en cours avant de planifier un autre vidage et de quitter. Par conséquent, sync; syncassure un rinçage synchrone. Vous n'avez pas besoin de le faire plus de 2 fois, ni de le faire entrer sleepdans le mix.

jeberle
la source
5

Ceux d'entre vous qui nous disent que "sync; sync; sync" n'a aucun but révèlent votre âge.

Au bon vieux temps, avant qu'Unix ne soit quelque chose pour les adolescents, nous devions utiliser TAPE pour nos besoins de streaming / sauvegarde. Souvent, nous montions un système de fichiers sur bande pour diffuser des sauvegardes, etc. Cette seule longue bande mince de bande magnétique en plastique était tout ce que certains d'entre nous avaient, pour stocker nos fichiers sur ..

La commande 'sync; sync; sync' était un moyen de dire à ces vieilles magnétophones de se rembobiner jusqu'à la fin (avant l'arrêt) - elles avaient à bord un micrologiciel qui recevrait la cmd de synchronisation (comme tous les bons systèmes de fichiers faire), et si elle était suivie presque immédiatement par deux autres commandes de tampon de synchronisation, le lecteur de bande lui-même interpréterait cela comme signifiant "rembobiner la bande et la démonter". Il n'y avait aucun moyen de dire au lecteur de bande de rembobiner, au-delà de cette méthode, et il est en quelque sorte bloqué .. Cette habitude est ensuite passée au mot lorsque les disques durs sont devenus plus disponibles - nous, les anciens opérateurs croustillants, ne faisons pas que réallouer ( ) notre mémoire musculaire, vous savez! Je crois qu'il a atteint le statut folklorique peu de temps après que les bandes sont devenues moins courantes et que les disques durs sont devenus plus disponibles, mais il a toujours ses utilisations pour ceux d'entre nous qui ont des lecteurs de bandes.

Jay Vaughan
la source
3
Les bandes sont des dispositifs de caractères. "mount" fonctionne sur les périphériques blocs. J'y suis allé (exécutant "dump" sur Vax 11/750 avec BSD 4.2 au milieu des années 80) et il n'y avait rien de tel et exécutant "sync" sur le périphérique à bande. La bande serait automatiquement rembobinée si vous l'ouvriez sous un nom de périphérique et resterait où elle était si vous l'ouvriez avec un autre, et vous pourriez envoyer des commandes explicites en utilisant "mt" si vous le deviez.
Amos Shapira