Сосредоточение на Linux здесь:
«Перезагрузка» пользовательского пространства (и некоторых аппаратных компонентов)
Вы упускаете что-то из своей последовательности загрузки с точки зрения того, какслужбы, демоны и программы запускаются.
Введите init
в Linux.Цель /sbin/init
, которая может быть system V init, 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 большинство из них возможно.