#operating-system #kernel #boot
#операционная система #ядро #загрузка
Вопрос:
Я прочитал этот очень интересный вопрос / ответ о том, как компьютеры перезагружаются, и хотя я вообще мало что знаю о разработке ОС, мне было интересно, можете ли вы частично выключить систему, а затем снова загрузиться с этого момента.
Например, в Linux, если я правильно прочитал выходные данные во время выключения, это выглядит примерно так:
- Отправить Terminate / KILL всем процессам.
- Службы / демоны завершения работы
- Выключение питания.
И последовательность запуска выглядит примерно так:
- BIOS, загрузчик
- Загрузить ядро и модули
- Запуск служб / демонов
- Запуск процессов
Итак, можем ли мы завершить работу до истечения 2, а затем запустить резервное копирование с 3 и далее? По сути, я думаю, что это должно сбросить процессы и демонов, сохранив ядро в памяти, тем самым сэкономив время загрузки ядра при обычной (повторной) загрузке.
Ответ №1:
Здесь основное внимание уделяется Linux:
«Перезагрузка» пользовательского пространства (и некоторых аппаратных частей)
В вашей последовательности загрузки чего-то не хватает с точки зрения того, как запускаются эти службы, демоны и программы.
Введите init
в Linux. Цель /sbin/init
, которая может быть инициализацией system V, upstart или systemd, заключается именно в запуске всех этих других процессов. Все эти утилиты инициализации имеют функции для управления службами, которые они запускают под ними.
Теперь в системе Linux также есть концепция уровней выполнения, а именно:
0 = shutdown
1 = single user recovery mode, no networking
2 = ?
3 = multi user networking no X
4 = ?
5 = multi user networking X
Чем? единицы не определены строго. В любом случае, если вы подадите запрос root и наберете init 3
прямо сейчас, предполагая, что вы используете Linux, X и каждый x-клиент будут завершены. Конечно, если что-то разрешено на данном уровне выполнения, это не будет отключено, но если вы хотите только перезагрузку определенного процесса, то это достигается довольно хорошо. Вариант использования для перезапуска системных демонов в ответ на обновление, и большинство менеджеров пакетов в наши дни фактически сделают это за вас с помощью выбранного вами инструмента initscript.
Таким образом, мы можем перезапустить весь наш графический интерфейс, мы можем перезапустить любого демона. Мы могли бы также отключить любой другой процесс. Перезагрузка драйверов оборудования? Я уже могу сделать это на лету через modprobe
, поэтому, если мне захочется обновить мои графические драйверы, я могу init 3
удалить старые, вставить новые и продолжить.
Ваш менеджер пакетов знает, как перезапускать системных демонов, и вы всегда можете последовать его совету выйти из системы и снова войти; таким образом, Linux уже достаточно эффективен с точки зрения предотвращения перезагрузок при обновлении.
«Перезагрузка» ядра
Итак, в принципе, мне нравится думать, что большую часть Linux можно «перезагрузить» без фактической перезагрузки. Итак, что теперь осталось?
- Я не могу перезагрузить ядро.
- Я не могу легко размонтировать корневую файловую систему. Я полагаюсь на это для этого недавно загруженного пользовательского пространства. Отказ от ответственности: вы могли бы просто перезагрузить initramfs во время «перезагрузки» ядра, поэтому здесь мы полагаемся на 1.
Теперь вопрос в том, как вы перезагружаете ядро? Ну, ядро на самом деле не является какой-то особой магией, это просто еще одна компьютерная программа, скопированная в память, поэтому мы можем просто написать где-нибудь программу, которая выполняет запись поверх нашего ядра и передает выполнение ему…
Это существует, хотите верьте, хотите нет, и вызывается kexec
. Я оставлю страницу в Википедии, чтобы кратко описать проблемы, связанные с ней:
Хотя это возможно, внедрение такого механизма, как kexec, вызывает две основные проблемы:
- новое ядро перезапишет память текущего ядра, пока оно все еще выполняется
- новое ядро обычно ожидает, что все физические устройства будут находиться в четко определенном состоянии (как после перезагрузки системы, когда BIOS (или прошивка) переводит их в «нормальное» состояние). Обход реальной перезагрузки может привести к тому, что устройства окажутся в неизвестном состоянии, и новому ядру придется восстанавливаться после этого.
kexec, в отличие от завершения работы системы, автоматически не останавливает файловые системы или процессы для вас; вы несете за это ответственность.
Итак, вот оно. В зависимости от того, какую часть вам нужно перезагрузить, в Linux это возможно в большинстве случаев.
Ответ №2:
У большинства производителей процессоров / компьютеров есть несколько разных режимов питания, в которых может находиться компьютер. Intel, вероятно, наиболее применимы к вашему вопросу, который звучит так, как будто речь идет о компьютерах общего назначения. Проверьте эту ссылку:
Чтобы узнать больше о том, как работают состояния питания для intel, какой системный контекст сохраняется в каждом состоянии и т.д. В общем, чем выше введенное вами S-состояние, тем меньше системного контекста требуется для сохранения, и, следовательно, тем больше времени потребуется системе для выхода из этого состояния и возврата в S0 (полностью работоспособное).
Комментарии:
1. Вопросы и ответы SU на самом деле дали мне много информации об этом, так что в этом отношении все в порядке.