Можно ли частично выключить ОС, а затем загрузиться обратно в работоспособное состояние?

#operating-system #kernel #boot

#операционная система #ядро #загрузка

Вопрос:

Я прочитал этот очень интересный вопрос / ответ о том, как компьютеры перезагружаются, и хотя я вообще мало что знаю о разработке ОС, мне было интересно, можете ли вы частично выключить систему, а затем снова загрузиться с этого момента.

Например, в Linux, если я правильно прочитал выходные данные во время выключения, это выглядит примерно так:

  1. Отправить Terminate / KILL всем процессам.
  2. Службы / демоны завершения работы
  3. Выключение питания.

И последовательность запуска выглядит примерно так:

  1. BIOS, загрузчик
  2. Загрузить ядро и модули
  3. Запуск служб / демонов
  4. Запуск процессов

Итак, можем ли мы завершить работу до истечения 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 можно «перезагрузить» без фактической перезагрузки. Итак, что теперь осталось?

  1. Я не могу перезагрузить ядро.
  2. Я не могу легко размонтировать корневую файловую систему. Я полагаюсь на это для этого недавно загруженного пользовательского пространства. Отказ от ответственности: вы могли бы просто перезагрузить initramfs во время «перезагрузки» ядра, поэтому здесь мы полагаемся на 1.

Теперь вопрос в том, как вы перезагружаете ядро? Ну, ядро на самом деле не является какой-то особой магией, это просто еще одна компьютерная программа, скопированная в память, поэтому мы можем просто написать где-нибудь программу, которая выполняет запись поверх нашего ядра и передает выполнение ему…

Это существует, хотите верьте, хотите нет, и вызывается kexec . Я оставлю страницу в Википедии, чтобы кратко описать проблемы, связанные с ней:

Хотя это возможно, внедрение такого механизма, как kexec, вызывает две основные проблемы:

  1. новое ядро перезапишет память текущего ядра, пока оно все еще выполняется
  2. новое ядро обычно ожидает, что все физические устройства будут находиться в четко определенном состоянии (как после перезагрузки системы, когда BIOS (или прошивка) переводит их в «нормальное» состояние). Обход реальной перезагрузки может привести к тому, что устройства окажутся в неизвестном состоянии, и новому ядру придется восстанавливаться после этого.

kexec, в отличие от завершения работы системы, автоматически не останавливает файловые системы или процессы для вас; вы несете за это ответственность.

Итак, вот оно. В зависимости от того, какую часть вам нужно перезагрузить, в Linux это возможно в большинстве случаев.

Ответ №2:

У большинства производителей процессоров / компьютеров есть несколько разных режимов питания, в которых может находиться компьютер. Intel, вероятно, наиболее применимы к вашему вопросу, который звучит так, как будто речь идет о компьютерах общего назначения. Проверьте эту ссылку:

Все о состояниях питания системы (S0-S5)

Чтобы узнать больше о том, как работают состояния питания для intel, какой системный контекст сохраняется в каждом состоянии и т.д. В общем, чем выше введенное вами S-состояние, тем меньше системного контекста требуется для сохранения, и, следовательно, тем больше времени потребуется системе для выхода из этого состояния и возврата в S0 (полностью работоспособное).

Комментарии:

1. Вопросы и ответы SU на самом деле дали мне много информации об этом, так что в этом отношении все в порядке.