Требуется ли выполнение sync (8) до выключения Linux?

19

Я все еще вижу, что люди рекомендуют использовать sync; sync; sync; sleep 30; haltзаклинания, когда говорят о закрытии или перезагрузке Linux.

Я использую Linux с самого начала, и хотя это было рекомендуемой процедурой в BSD 4.2 / 4.3 и SunOS 4 дня, я не могу вспомнить, что мне приходилось делать это как минимум в течение последних десяти лет, в течение которых я, вероятно, проходил выключение / перезагрузку Linux может быть тысячи раз.

Я подозреваю, что это анахронизм со времен, когда ядро ​​не могло размонтировать и синхронизировать корневую файловую систему и другие критически важные файловые системы, требуемые даже в однопользовательском режиме (например, / tmp), и поэтому необходимо было явно указать ему сбросить как можно больше данных на диск.

В наши дни, пока не найдя соответствующий код в исходном коде ядра (копаясь в http://lxr.linux.no и google), я подозреваю, что ядро ​​достаточно умен, чтобы безошибочно демонтировать даже корневую файловую систему, а файловая система достаточно умен. эффективно выполнить синхронизацию (2) перед размонтированием себя во время нормального shutdown/ reboot/ poweorff.

Это "sync; sync; sync"необходимо только в крайних случаях, когда файловая система не будет размонтирована без ошибок (например, сбой физического диска) или система находится в состоянии, когда только принудительная перезагрузка (8) выведет ее из заморозки (например, нагрузка слишком велика). высоко, чтобы позволить ему запланировать команду выключения).

Я также никогда не выполняю эту syncпроцедуру, прежде чем размонтировать съемные устройства, и никогда не сталкиваюсь с проблемой.

Другой пример - Xen позволяет DomU отправлять shutdownкоманду из Dom0, это считается «чистым завершением», при котором никто не должен входить в систему и sync; sync; syncсначала вводить магический код .

Я прав или мне повезло несколько тысяч отключений системы?

Амос Шапира
источник
Как насчет перемонтирования файловой системы только для чтения как чтение / запись? Я смонтировал rootfs как только для чтения, и я перемонтировал его как чтение / запись с помощью этой команды: mount -o remount, rw /, а затем, когда я изменил rootfs, я запускаю mount -o remount, ro /, но я вижу некоторые проблемы при проверке fs с помощью fsck. Вызывает ли вторая команда SYNC перед монтированием только для чтения?

Ответы:

18

Причина, по которой люди запускаются sync; syncраньше, haltзаключается в том, что haltкоманда не будет корректно завершать работу системы на старых Linux. Правильный способ сделать это в системах SYSVr4 всегда должен указывать init переходить на другой уровень выполнения.

BSD и SunOS 4 не являются операционными системами SYSVr4, поэтому они отличаются. Solaris (SunOS 5) - это SYSVr4, и Linux выбирает биты стандарта SYSVr4, которые он хочет использовать.

Использование halt на самом деле является довольно плохим способом сделать это в большинстве UNIX (Linux является одним из исключений), так как он фактически не запускается через сценарии инициализации для выполнения таких вещей, как остановка процессов и размонтирование дисков - он просто останавливает процессор.

Если вы можете гарантировать, что никогда и никогда не будете использовать какую-либо систему UNIX, кроме Linux, тогда вы можете продолжать использовать halt- если есть вероятность, что вы собираетесь использовать другие UNIX, то я бы порекомендовал привыкнуть к использованию init _runlevel_или shutdown,

Команда shutdownфактически указывает initпроцессу изменить свой уровень запуска уровня выполнения - при этом init затем продолжает выполнение каждого из сценариев K * init и сценариев S * init, связанных с этим уровнем запуска. Один из сценариев на уровне выполнения 0 выполняет размонтирование файловых систем.

На Линуксе haltкоманда просто вызывает shutdownкоманду , если уровень выполнения уже не является 0 (закрытие) или 6 (перезагрузка) в любом случае ; так что без потерь.

Акт размонтирования файловой системы с помощью umountсинхронизирует данные на диск перед размонтированием.

Если вы работали sync; sync; haltв Linux, у вас все будет в порядке с состоянием файловой системы, потому что разработчики убедились, что haltэто правильно ; однако было бы правильнее использовать:shutdown now

DaveG
источник
Спасибо за объяснение. Просто чтобы прояснить то, что вы говорите - «разработчики убедились, что halt делает правильные вещи», означает, что «halt» тоже вызывает «sync» или что он запускает правильные сценарии инициализации, которые в конечном итоге вызывают «sync»? Как насчет того, чтобы уже быть в однопользовательском режиме и просто вызывать «остановку»? Правильно ли я полагаю, что ядро Linux достаточно умен, чтобы не отключаться по-настоящему, но размонтирует все файловые системы перед выключением?
Амос Шапира
1
haltзвонки shutdownкакие звонки umountкоторые выполняет синхронизацию.
DaveG
Спасибо DaveG. Итак, вы говорите, что все это происходит на уровне пользователя, и ядро ​​не будет размонтировать и синхронизировать файловые системы самостоятельно? В любом случае, это звучит так, как будто церемония «синхронизация; отключение» сегодня избыточна.
Амос Шапира
7

Использование нескольких syncвызовов состояло в том, чтобы дать ОС и дискам время для очистки очередей записи. "sync; sync; sync"не считал это полезным; один сделал, "sync<cr> sync<cr> sync<cr"и задержка, в то время как ваш ASR-33 сделал возврат каретки / перевод строки, обеспечил достаточно задержки. Halt всегда вызывал sync; вопрос заключался в том, будет ли достаточно времени, чтобы очистить очереди, прежде чем отключить питание.

Оригинальный постер sync; sleep 30больше соответствует тому, что предполагалось.

mpez0
источник
7

Я могу говорить только о том, почему вы выпускаете syncнесколько раз. Команда планирует сброс на диск, но возвращается до завершения фактической очистки. Любая последующая syncкоманда будет блокироваться до тех пор, пока не будет выполнен какой-либо ожидающий сброс, прежде чем запланировать еще один сброс и выйти. Следовательно, sync; syncобеспечивается синхронный сброс. Вам не нужно делать это более 2 раз, ни вносить sleepв смесь.

jeberle
источник
5

Те из вас, кто говорит нам, что «синхронизация; синхронизация; синхронизация» не имеет никакой цели, раскрывают свой возраст.

В прежние добрые времена, до того, как Unix был чем-то для подростков, мы привыкли использовать TAPE для наших потоковых / резервных копий. Часто мы монтировали файловую систему на ленте для потокового резервного копирования и т. Д. Эту длинную тонкую ленту из магнитопластика нам всем хватало для хранения наших файлов ...

Команда 'sync; sync; sync' позволила этим старым ленточным машинам полностью перемотать себя до конца (до выключения) - на них было встроенное программное обеспечение, которое получало бы команду sync cmd (как и все хорошие файловые системы). do), и если за ним почти сразу последовали еще две команды буфера синхронизации, сам накопитель на магнитной ленте интерпретировал бы это как «перемотать ленту и размонтировать ее». Не было никакого способа сказать перемотке стримера, кроме этого метода, и он как бы застрял ... Эта привычка затем перешла в слово, когда жесткие диски стали более доступными - мы, старые твердые операторы, не просто перераспределяем ( ) нашу мышечную память ты знаешь! Я полагаю, что он достиг фольклорного статуса вскоре после того, как ленты стали менее распространенными и жесткие диски стали более доступными, но он все еще имеет свое применение для тех из нас, кто использует ленточные накопители.

Джей Воан
источник
3
Ленты - это символьные устройства. «mount» работает на блочных устройствах. Я был там (запускал «dump» на Vax 11/750 с BSD 4.2 в середине 80-х), и такого не было и запускал «sync» на ленточном устройстве. Лента будет автоматически перематываться, если вы откроете ее как одно имя устройства и останетесь там, где она была, если вы открыли ее с другим, и вы могли бы при необходимости отправить явные команды, используя «mt».
Амос Шапира