Процесс запуска Linux - Linux startup process

Linux запуска процесса является процесс инициализации многоступенчатый выполняется во время загрузки в Linux установки. Он во многом похож на BSD и другие процессы загрузки в стиле Unix , от которых он произошел.

Загрузка установки Linux включает несколько этапов и программных компонентов, включая инициализацию прошивки , выполнение загрузчика , загрузку и запуск образа ядра Linux , а также выполнение различных сценариев запуска и демонов . Для каждого из этих этапов и компонентов существуют разные варианты и подходы; например, GRUB , coreboot или Das U-Boot могут использоваться в качестве загрузчиков (исторические примеры - LILO , SYSLINUX или Loadlin ), в то время как сценарии запуска могут быть либо традиционными в стиле init , либо конфигурация системы может выполняться с помощью современных альтернатив например systemd или Upstart .

Обзор

Ранние этапы процесса запуска Linux во многом зависят от архитектуры компьютера. IBM PC совместимое оборудование - это одна из архитектур, на которой обычно используется Linux; в этих системах важную роль играет BIOS , который может не иметь точных аналогов в других системах. В следующем примере предполагается оборудование, совместимое с IBM PC:

  1. BIOS выполняет задачи запуска, специфичные для конкретной аппаратной платформы. После установки оборудования перечислено и аппаратное обеспечение , которое необходимо для загрузки инициализируются правильно, нагрузки BIOS и выполняет код загрузки из настроенного загрузочного устройства.
  2. Загрузчик часто представляет пользователю меню возможных вариантов загрузки и имеет параметр по умолчанию, который выбирается по прошествии некоторого времени. После того, как выбор сделан, загрузчик загружает ядро ​​в память, передает ему некоторые параметры и передает управление.
  3. Ядро, если оно сжато, распакуется само. Затем он настраивает системные функции, такие как необходимое оборудование и подкачку памяти, а также вызовы, start_kernel()которые выполняют большую часть настройки системы (прерывания, остальное управление памятью, инициализация устройства и драйвера и т. Д.). Затем он запускает отдельно незанятый процесс , планировщик и процесс инициализации , который выполняется в пользовательском пространстве .
  4. Инициализация состоит либо из сценариев, которые выполняются оболочкой (sysv, bsd, runit), либо из файлов конфигурации, которые выполняются двоичными компонентами (systemd, upstart). Init имеет определенные уровни (sysv, bsd) или цели (systemd), каждый из которых состоит из определенного набора служб (демонов). Они предоставляют различные службы и структуры, не связанные с операционной системой, и формируют пользовательскую среду. Типичная серверная среда запускает веб-сервер, службы базы данных и сеть.
  5. Типичная среда рабочего стола начинается с демона, называемого диспетчером отображения, который запускает графическую среду, состоящую из графического сервера, который предоставляет базовый базовый графический стек, и диспетчера входа в систему, который предоставляет возможность вводить учетные данные и выбирать сеанс. После того, как пользователь ввел правильные учетные данные, менеджер сеанса начинает сеанс. Сеанс - это набор программ, таких как элементы пользовательского интерфейса (панели, рабочие столы, апплеты и т. Д.), Которые вместе могут образовывать законченную среду рабочего стола.

При завершении работы вызывается init, чтобы закрыть все функции пользовательского пространства контролируемым образом. После завершения всех других процессов init выполняет системный вызов ядра, инструктируя его выключить систему.

Фаза загрузчика

Фаза загрузчика зависит от архитектуры компьютера. Поскольку предыдущие этапы не относятся к операционной системе, процесс загрузки на основе BIOS для архитектур x86 и x86-64 считается запускаемым, когда код основной загрузочной записи (MBR) выполняется в реальном режиме и загрузчик первого этапа загружен. В системах UEFI ядро Linux может выполняться напрямую прошивкой UEFI через EFISTUB, но обычно в качестве загрузчика используется GRUB 2 или systemd-boot . Ниже приведены некоторые популярные загрузчики:

  • GRUB 2 отличается от GRUB 1 способностью автоматического обнаружения различных операционных систем и автоматической настройки. Stage1 загружается и выполняется BIOS из основной загрузочной записи (MBR). Загрузчик промежуточной стадии (stage1.5, обычно core.img) загружается и запускается загрузчиком stage1. Загрузчик второго уровня (stage2, / boot / grub / files) загружается stage1.5 и отображает меню запуска GRUB, которое позволяет пользователю выбрать операционную систему или проверить и изменить параметры запуска. После выбора пункта меню и указания дополнительных параметров GRUB загружает ядро ​​Linux в память и передает ему управление. GRUB 2 также может загружать по цепочке другой загрузчик. В системах UEFI stage1 и stage1.5 обычно являются одним и тем же файлом приложения UEFI (например, grubx64.efi для систем x64 UEFI).
  • systemd-boot (ранее Gummiboot), загрузчик, включенный в systemd, который требует минимальной настройки (только для систем UEFI ).
  • SYSLINUX / ISOLINUX - это загрузчик, который специализируется на загрузке полных установок Linux из файловых систем FAT. Он часто используется для загрузочных или аварийных дискет, живых USB-накопителей и других легких загрузочных систем. ISOLINUX обычно используется на live-компакт-дисках Linux и загрузочных установочных компакт-дисках.
  • rEFInd , менеджер загрузки для систем UEFI .
  • coreboot - это бесплатная реализация UEFI или BIOS, обычно развертываемая вместе с системной платой , а также полевые обновления, предоставляемые поставщиком при необходимости. Части coreboot становятся BIOS системы и остаются в памяти после загрузки.
  • Das U-Boot - загрузчик для встраиваемых систем. Он используется в системах, в которых нет BIOS / UEFI, но используются специальные методы для чтения загрузчика в память и его выполнения.

Исторические загрузчики, которые больше не используются повсеместно, включают:

  • LILO не понимает и не разбирает структуру файловой системы. Вместо этого /etc/lilo.confв действующей системе создается файл конфигурации ( ), который отображает необработанную информацию о смещении (инструмент сопоставления) о местоположении ядра и RAM-дисков (initrd или initramfs). Файл конфигурации, который включает такие данные, как загрузочный раздел и путь к ядру для каждого из них, а также при необходимости настраиваемые параметры, затем записывается вместе с кодом загрузчика в загрузочный сектор MBR. Когда этот загрузочный сектор считывается и передается управление BIOS, LILO загружает код меню и рисует его, а затем использует сохраненные значения вместе с пользовательским вводом для расчета и загрузки ядра Linux или последовательной загрузки любого другого загрузчика .
  • GRUB 1 включает логику для чтения общих файловых систем во время выполнения, чтобы получить доступ к своему файлу конфигурации. Это дает GRUB 1 возможность читать свой файл конфигурации из файловой системы, а не встраивать его в MBR, что позволяет ему изменять конфигурацию во время выполнения и указывать диски и разделы в удобочитаемом формате, а не полагаться на смещения. Он также содержит интерфейс командной строки , который упрощает исправление или изменение GRUB, если он неправильно настроен или поврежден.
  • Loadlin - это загрузчик, который может заменить работающее ядро DOS или Windows 9x ядром Linux во время выполнения. Это может быть полезно в случае аппаратного обеспечения, которое необходимо включить с помощью программного обеспечения, и для которого такие программы настройки являются проприетарными и доступны только для DOS. В настоящее время этот метод загрузки менее необходим, поскольку в Linux есть драйверы для множества аппаратных устройств, но он нашел свое применение в мобильных устройствах . Другой вариант использования - когда Linux находится на запоминающем устройстве, недоступном для загрузки в BIOS: DOS или Windows могут загрузить соответствующие драйверы, чтобы компенсировать ограничение BIOS, и загрузить Linux оттуда.

Фаза ядра

В ядре Linux обрабатывает все системные процессы эксплуатации, такие как управление памятью , задачи планирование , ввод / вывод , межпроцессное взаимодействие , и общее управление системой. Он загружается в два этапа: на первом этапе ядро ​​(в виде сжатого файла изображения) загружается в память и распаковывается, а также настраиваются несколько основных функций, таких как базовое управление памятью. Затем управление в последний раз передается процессу запуска основного ядра. Когда ядро ​​полностью готово к работе - и как часть его запуска, после загрузки и выполнения - ядро ​​ищет процесс инициализации для запуска, который (отдельно) настраивает пользовательское пространство и процессы, необходимые для пользовательской среды и окончательного входа в систему. . Само ядро ​​затем может бездействовать при вызовах других процессов.

Для некоторых платформ (например, 64-битной ARM) распаковка ядра должна выполняться загрузчиком.

Ядро обычно загружается как файл изображения, сжатый в форматы zImage или bzImage с помощью zlib . Начальная процедура выполняет минимальную настройку оборудования, полностью распаковывает образ в верхнюю память и принимает к сведению любой RAM-диск, если он настроен. Затем он выполняет запуск ядра через ./arch/i386/boot/headпроцесс startup_32 ()(для процессоров на базе x86).

Функция запуска для ядра (также называемая swapper или процессом 0) устанавливает управление памятью (таблицы подкачки и подкачку памяти), определяет тип ЦП и любые дополнительные функции, такие как возможности с плавающей запятой , а затем переключается на Linux, не зависящий от архитектуры. функциональность ядра через вызов start_kernel().

start_kernel выполняет широкий спектр функций инициализации. Он настраивает обработку прерываний ( IRQ ), дополнительно настраивает память, запускает процесс Init (первый процесс пользовательского пространства), а затем запускает простаивающую задачу через cpu_idle(). Примечательно, что в процессе запуска ядра также монтируется начальный RAM-диск («initrd»), который был загружен ранее как временная корневая файловая система на этапе загрузки. Initrd позволяет загружать модули драйверов непосредственно из памяти, не полагаясь на другие устройства (например, жесткий диск) и драйверы, необходимые для доступа к ним (например, драйвер SATA). Такое разделение некоторых драйверов, статически скомпилированных в ядро, и других драйверов, загружаемых из initrd, позволяет уменьшить размер ядра. Корневая файловая система позже переключается с помощью вызова, pivot_root()который отключает временную корневую файловую систему и заменяет ее реальной, когда последняя становится доступной. Затем восстанавливается память, используемая временной корневой файловой системой.

Таким образом, ядро ​​инициализирует устройства, монтирует корневую файловую систему, указанную загрузчиком, как доступную только для чтения , и запускает Init ( /sbin/init), который обозначен как первый процесс, запускаемый системой ( PID = 1). Сообщение выводится ядром при монтировании файловой системы и Init при запуске процесса Init. Он также может опционально запустить Initrd, чтобы разрешить настройку и вопросы, связанные с устройством ( RAM-диск или аналогичные), до монтирования корневой файловой системы.

Согласно Red Hat , подробный процесс ядра на этом этапе резюмируется следующим образом:

"Когда ядро ​​загружено, оно немедленно инициализирует и настраивает память компьютера и настраивает различное оборудование, подключенное к системе, включая все процессоры, подсистемы ввода-вывода и устройства хранения. Затем оно ищет сжатый образ initrd в заранее определенном месте. в памяти, распаковывает его, монтирует и загружает все необходимые драйверы. Затем он инициализирует виртуальные устройства, связанные с файловой системой, такие как LVM или программный RAID, прежде чем размонтировать образ диска initrd и освободить всю память, которую образ диска когда-то занимал . Затем ядро ​​создает корневое устройство, монтирует корневой раздел в режиме только для чтения и освобождает всю неиспользуемую память. На этом этапе ядро ​​загружается в память и работает. система, с ней мало что можно сделать ". Загрузка в стиле initramfs похожа, но не идентична описанной загрузке initrd.

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

Пространство раннего пользователя

initramfs , также известный как раннее пользовательское пространство , доступен с версии 2.5.46 ядра Linux с целью заменить как можно больше функций, которые раньше ядро ​​выполняло бы во время процесса запуска. Типичное использование раннего пользовательского пространства - определить, какие драйверы устройств необходимы для загрузки основной файловой системы пользовательского пространства и загрузить их из временной файловой системы . Многие дистрибутивы используют dracut для создания и поддержки образа initramfs.

Процесс инициализации

Как только ядро ​​запущено, оно запускает процесс инициализации . Исторически это был «SysV init», который назывался просто «init». Более поздние дистрибутивы Linux, вероятно, будут использовать одну из более современных альтернатив, такую ​​как systemd.

В основном они сгруппированы как управление службами операционной системы .

Смотрите также

использованная литература

внешние ссылки