Czy wykonanie synchronizacji (8) jest nadal wymagane przed zamknięciem systemu Linux?

19

Nadal widzę, że ludzie zalecają stosowanie sync; sync; sync; sleep 30; haltinkantacji, gdy mówią o wyłączeniu lub ponownym uruchomieniu Linuxa.

Używam Linuksa od jego powstania i chociaż była to zalecana procedura w BSD 4.2 / 4.3 i SunOS 4 dni, nie mogę sobie przypomnieć, że musiałem to robić przez co najmniej dziesięć ostatnich lat, podczas których prawdopodobnie przeszedł przez zamknięcie / ponowne uruchomienie Linuksa może tysiące razy.

Podejrzewam, że jest to anachronizm od czasów, gdy jądro nie mogło odmontować i zsynchronizować głównego systemu plików i innych krytycznych systemów plików wymaganych nawet w trybie pojedynczego użytkownika (np. / Tmp), i dlatego konieczne było wyraźne poinformowanie go o konieczności opróżnienia jak najwięcej danych na dysk.

Obecnie, nie znajdując jeszcze odpowiedniego kodu w źródle jądra (przeglądając http://lxr.linux.no i google), podejrzewam, że jądro jest wystarczająco inteligentne, aby czysto odmontować nawet główny system plików, a system plików jest wystarczająco inteligentny aby skutecznie wykonać synchronizację (2) przed odmontowaniem się podczas normalnego shutdown/ reboot/ poweorff.

Jest "sync; sync; sync"to konieczne tylko w skrajnych przypadkach, gdy system plików nie odmontuje się czysto (np. Awaria dysku fizycznego) lub system jest w stanie, że wymuszenie bezpośredniego ponownego uruchomienia (8) spowoduje jego zawieszenie (np. Obciążenie jest zbyt duże high, aby zaplanować polecenie zamknięcia).

Nigdy też nie wykonuję tej syncprocedury przed odmontowaniem urządzeń wymiennych i nigdy nie napotkałem problemu.

Kolejny przykład - Xen pozwala DomU na wysłanie shutdownpolecenia z Dom0, jest to uważane za „czyste zamknięcie” bez konieczności logowania się i wpisywania magicznej nazwy sync; sync; sync.

Czy mam rację, czy miałem szczęście przez kilka tysięcy wyłączeń systemu?

Amos Shapira
źródło
Co powiesz na ponowne zamontowanie systemu plików tylko do odczytu jako do odczytu / zapisu? Zainstalowałem rootfs jako tylko do odczytu i ponownie zamontowałem go jako odczyt / zapis za pomocą tej komendy: mount -o remount, rw /, a następnie po zmianie rootfsa uruchamiam mount -o remount, ro / ale widzę pewne problemy, kiedy sprawdzam fs z fsck. Czy drugie polecenie wywołuje SYNC przed zamontowaniem tylko do odczytu?

Odpowiedzi:

18

Powodem, dla którego ludzie uruchamiali się sync; syncprzed a, haltjest to, że haltpolecenie nie zamknęło systemu czysto na starszych linuksach. Prawidłowym sposobem na to w systemach SYSVr4 jest zawsze polecenie initowi przejścia na inny poziom działania.

BSD i SunOS 4 nie są systemami operacyjnymi SYSVr4, dlatego się różnią. Solaris (SunOS 5) to SYSVr4, a Linux wybiera elementy standardu SYSVr4, z których chce korzystać.

Użycie zatrzymania jest w rzeczywistości dość złym sposobem na zrobienie tego w większości UNIXÓW (Linux jest jednym z wyjątków), ponieważ tak naprawdę nie uruchamia się przez skrypty inicjujące, aby wykonywać takie czynności, jak zatrzymywanie procesów i odmontowywanie dysków - po prostu zatrzymuje procesor.

Jeśli możesz zagwarantować, że nigdy , nigdy nie użyjesz systemu UNIX innego niż Linux, możesz go nadal używać halt- jeśli istnieje szansa, że ​​będziesz używać innych systemów UNIX, to polecam nabrać zwyczaju używania init _runlevel_lub shutdown.

shutdownKomenda faktycznie opowiada initproces, aby zmienić jej poziom run poziomu pracy - w ten sposób startowych następnie przechodzi do uruchomienia każdego z K * skryptów startowych i S * skryptów startowych związanych z tym poziomie roboczym. Jeden ze skryptów na poziomie 0 wykonuje odmontowywanie systemów plików.

Na Linuksem haltpolecenie tylko wywołuje shutdownpolecenie, chyba że poziom prowadzony jest już 0 (w dół zamykając) lub 6 (restartu) w każdym razie ; więc nie ma tam strat.

Czynność odmontowania systemu plików umountspowoduje zsynchronizowanie danych z dyskiem przed jego odmontowaniem.

Jeśli korzystasz sync; sync; haltz Linuksa, jesteś w porządku ze stanem systemu plików, ponieważ programiści zapewnili, że haltrobi to dobrze ; jednak bardziej poprawne byłoby użycie:shutdown now

DaveG
źródło
Dziękuję za wyjaśnienie. Żeby wyjaśnić, co mówisz - „programiści upewnili się, że zatrzymanie robi właściwą rzecz” oznacza, że ​​„zatrzymanie” również wywołuje „synchronizację” lub uruchamia odpowiednie skrypty inicjujące, które ostatecznie nazywają „synchronizować”? A co z byciem w trybie pojedynczego użytkownika i po prostu wywoływaniem „halt”? Czy mam rację, zakładając, że jądro Linuksa jest na tyle inteligentne, że nie można tak naprawdę gwałtownie zamknąć, ale odmontuje wszystkie systemy plików przed zamknięciem?
Amos Shapira
1
haltpołączenia, shutdownktóre wywołuje umountsynchronizację.
DaveG
Dzięki DaveG. Więc mówisz, że wszystko dzieje się na poziomie użytkownika, a jądro nie umountuje i nie synchronizuje systemów plików? W każdym razie wygląda na to, że ceremonia „synchronizacji; zamknięcia” jest dziś zbędna.
Amos Shapira
7

Wykorzystanie wielu syncwywołań miało pozwolić systemowi operacyjnemu i dyskom na opróżnienie kolejek zapisu. "sync; sync; sync"nie było uważane za przydatne; jeden zrobił "sync<cr> sync<cr> sync<cr"i opóźnienie, podczas gdy twój ASR-33 zrobił powrót karetki / nowej linii, zapewnił wystarczające opóźnienie. Halt zawsze synchronizował połączenia; pytanie brzmiało, czy będzie wystarczająco dużo czasu, aby opróżnić kolejki przed odłączeniem zasilania.

Oryginalny plakat sync; sleep 30jest bardziej zgodny z tym, co było zamierzone.

mpez0
źródło
7

Mogę tylko powiedzieć, dlaczego wydałeś syncwiele razy. Polecenie planuje opróżnianie na dysk, ale powraca przed zakończeniem faktycznego opróżniania. Każde kolejne syncpolecenie będzie blokowane, dopóki nie zaliczy się zaległy kolor przed zaplanowaniem kolejnego koloru i zakończeniem. Dlatego sync; synczapewnia synchroniczne spłukiwanie. Nie musisz robić tego więcej niż 2 razy ani sleepmieszać.

szemrać
źródło
5

Ci z was, którzy mówią nam, że „synchronizacja; synchronizacja; synchronizacja” nie ma sensu ujawniać waszego wieku.

W dawnych dobrych czasach, zanim Unix był czymś przeznaczonym dla nastolatków, musieliśmy używać TAPE do naszych potrzeb w zakresie przesyłania strumieniowego / tworzenia kopii zapasowych. Często montowaliśmy system plików oparty na taśmie, aby przesyłać strumieniowo kopie zapasowe i tak dalej. Ten jeden długi cienki pasek magnetycznej taśmy z tworzywa sztucznego był wszystkim, który mieliśmy, do przechowywania naszych plików ...

Polecenie „sync; sync; sync” było sposobem, w jaki te stare maszyny taśmowe mogły zostać poproszone o przewinięcie się do samego końca (przed zamknięciem) - mieli na pokładzie oprogramowanie, które odbierałoby cmd synchronizacji (jak wszystkie dobre systemy plików do), a gdyby prawie natychmiast po nim nastąpiły dwa kolejne polecenia bufora synchronizacji, sam napęd taśm interpretowałby to jako „przewinięcie taśmy i odmontowanie”. Nie było żadnego sposobu, aby powiedzieć napędowi taśmowemu, aby przewinął do tyłu, poza tą metodą, i to utknęło. Ten zwyczaj przeszedł do słowa, gdy dyski twarde stały się bardziej dostępne - nasi cholerni starzy operatorzy nie tylko zmieniają położenie ( ) nasza pamięć mięśni, wiesz! Wierzę, że osiągnął status folkloru wkrótce po tym, jak taśmy stały się mniej popularne, a dyski twarde stały się bardziej dostępne, ale nadal ma zastosowanie dla tych z nas, którzy mają napędy taśmowe.

Jay Vaughan
źródło
3
Taśmy są urządzeniami znakowymi. „mount” działa na urządzeniach blokowych. Byłem tam (uruchomiłem „zrzut” na Vax 11/750 z BSD 4.2 w połowie lat 80-tych) i nie było czegoś takiego i uruchomiłem „synchronizację” na urządzeniu taśmowym. Taśma zostanie automatycznie przewinięta, jeśli otworzysz ją jako nazwę jednego urządzenia i pozostanie tam, gdzie była, jeśli otworzysz ją za pomocą innego, i możesz wysyłać jawne polecenia za pomocą „mt”, jeśli trzeba.
Amos Shapira