4. Система блокирует системные файлы на своих местах и выполняет другую подготовку к выключению.
5. Система демонтирует все файловые системы, кроме корневой.
6. Система заново монтирует корневую файловую систему в режиме «только чтение».
7. Система записывает все буферизованные данные в файловую систему с помощью команды sync.
8. На последнем шаге она дает указание ядру о перезагрузке или останове с помощью системного вызова reboot(2). Это может быть выполнено с помощью команды init или какой-либо вспомогательной команды вроде reboot, halt или poweroff.
Команды reboot и halt ведут себя по-разному, в зависимости от того, как они вызваны. По умолчанию эти команды вызывают команду shutdown с параметром -r или -h. Однако если система уже находится на уровне запуска, который соответствует останову или перезагрузке, эти команды приказывают ядру немедленно отключиться. Если вам действительно необходимо спешно выключить компьютер, несмотря на возможные повреждения в результате неорганизованного выключения, используйте параметр -f.
6.8. Начальная файловая система оперативной памяти
Несмотря на то что процесс загрузки системы Linux довольно прост, один компонент постоянно приводит в замешательство:
Проблема заключается в доступности различных типов аппаратных средств для хранения данных. Как вы помните, ядро системы Linux не взаимодействует с интерфейсами BIOS или EFI для получения данных с дисков, поэтому для монтирования корневой файловой системы ему нужны драйверы, поддерживающие механизм хранения, заложенный в основу системы. Если, например, корневая файловая система расположена на дисковом массиве RAID, подключенном к контроллеру от стороннего разработчика, то ядру в первую очередь понадобится драйвер для такого контроллера. К сожалению, существует такое множество драйверов для контроллеров устройств хранения данных, что в ядро системы невозможно включить их все, поэтому многие драйверы поставляются в качестве загружаемых модулей. Однако загружаемые модули являются файлами, и, если у ядра не будет смонтированной в первую очередь файловой системы, оно не сможет загрузить необходимые модули драйверов.
Обходной путь заключается в объединении небольшой подборки модулей драйверов для ядра, а также некоторого количества других утилит в виде архива. Загрузчик системы загружает этот архив в память перед запуском ядра. Во время запуска ядро считывает содержимое архива во временную файловую систему оперативной памяти (initramfs), монтирует ее в корневой каталог и в пользовательском режиме выполняет передачу управления команде init в файловой системе initramfs. Затем включенные в состав initramfs утилиты позволяют ядру загрузить необходимые модули драйверов для реальной корневой файловой системы. Наконец, утилиты монтируют реальную корневую файловую систему и запускают настоящую команду init.
Реализации этого процесса различны и более сложны. В некоторых версиях команда init в файловой системе initramfs — это всего лишь простой сценарий оболочки, который запускает демон udevd для загрузки драйверов, а затем монтирует реальный корневой каталог и выполняет в нем команду init. В версиях, использующих вариант systemd, как правило, можно увидеть полноценную сборку systemd, которая не использует файлы конфигурации модулей и содержит совсем немного файлов конфигурации демона udevd.
Одной из основных характеристик начальной файловой системы оперативной памяти, которая (пока) остается неизменной, является возможность обойти ее, если она вам не нужна. То есть, если ядро содержит все необходимые для монтирования корневой файловой системы драйверы, вы можете изъять начальную файловую систему оперативной памяти из конфигурации загрузчика системы. Если это удается сделать, время загрузки системы сокращается, как правило, на несколько секунд. Попробуйте выполнить это самостоятельно во время загрузки системы, использовав редактор меню загрузчика GRUB для удаления строки initrd. Лучше не экспериментировать с изменениями файла конфигурации загрузчика GRUB, поскольку можно совершить ошибку, которую будет трудно исправить. С недавних пор обойти начальную файловую систему оперативной памяти стало труднее, поскольку такие функции, как монтирование по идентификатору UUID, могут быть недоступны для обобщенных версий ядра.