Процесс загрузки Linux
Linux Процесс загрузки включает в себя несколько этапов и во многом похож на BSD и другие процессы загрузки в стиле Unix , на основе которых он происходит. Хотя процесс загрузки Linux во многом зависит от архитектуры компьютера, эти архитектуры имеют схожие этапы и программные компоненты. [ 1 ] включая запуск системы, выполнение загрузчика , загрузку и запуск образа ядра Linux , а также выполнение различных сценариев запуска и демонов . [ 2 ] Они сгруппированы в 4 этапа : запуск системы , этап загрузчика , этап ядра и процесс инициализации . [ 3 ] Когда система Linux включается или перезагружается, ее процессор выполняет специальную прошивку/программу для инициализации системы , например, самотестирование при включении питания , вызывая вектор сброса для запуска программы по известному адресу во флэш-памяти/ПЗУ (в встроенные устройства Linux), затем загрузите загрузчик в ОЗУ для последующего выполнения. [ 2 ] На персональном компьютере (ПК), а не только ПК с Linux-дистрибутивом, эта прошивка/программа называется BIOS и хранится на материнской плате. [ 2 ] Во встроенной системе Linux эта прошивка/программа называется загрузочным ПЗУ . [ 4 ] [ 5 ] После загрузки в ОЗУ загрузчик (также называемый загрузчиком первого этапа или основным загрузчиком ) запустится для загрузки загрузчика второго этапа. [ 2 ] (также называемый вторичным загрузчиком ). [ 6 ] Загрузчик второго этапа загрузит образ ядра в память, распакует и инициализирует его, а затем передаст управление этому образу ядра. [ 2 ] Загрузчик второго этапа также выполняет в системе несколько операций, таких как проверка оборудования системы, монтирование корневого устройства, загрузка необходимых модулей ядра и т. д. [ 2 ] Наконец, первый процесс пользовательского пространства ( init
процесс) запускается и выполняются другие высокоуровневые инициализации системы (которые связаны со сценариями запуска). [ 2 ]
Для каждого из этих этапов и компонентов существуют разные варианты и подходы; например, GRUB , coreboot или Das U-Boot могут использоваться в качестве загрузчиков (исторические примеры — LILO , SYSLINUX или Loadlin ), в то время как сценарии запуска могут быть либо традиционными в стиле init , либо конфигурация системы может выполняться с помощью современных альтернатив, таких как как systemd или Upstart .
Запуск системы
[ редактировать ]Запуск системы имеет разные этапы в зависимости от оборудования, на котором загружается Linux, особенно между встроенным Linux и ПК с Linux. [ 7 ] Как упоминалось ранее во вводной части, на этапе запуска системы микропрограмма BIOS вызывается . Аппаратное обеспечение, совместимое с IBM PC, — это одна из архитектур, на которой обычно используется Linux; в этих системах BIOS играет важную роль. BIOS соответственно выполнит самотестирование при включении питания (POST), то есть проверит аппаратное обеспечение системы, затем определит локальное устройство и, наконец, инициализирует систему . [ 7 ] При инициализации системы BIOS начнет поиск загрузочного устройства в системе, на котором хранится ОС. Загрузочным устройством могут быть устройства хранения, такие как дискета, компакт-диск, флэш-накопитель USB, раздел на жестком диске (где на жестком диске хранится несколько ОС, например Windows и Fedora), устройство хранения в локальной сети и т. д. [ 7 ] На жестком диске для загрузки Linux хранится основная загрузочная запись ( MBR ), которая содержит первый этап/основной загрузчик для загрузки в ОЗУ. [ 7 ] Совместимость с IBM PC заменяет BIOS на UEFI. В системах UEFI ядро Linux может выполняться непосредственно прошивкой UEFI через EFISTUB. [ 8 ] но обычно использует GRUB 2 или systemd-boot . в качестве загрузчика [ 9 ] [ 10 ]
Этап запуска системы во встроенной системе Linux начинается с выполнения прошивки/программы во встроенном загрузочном ПЗУ , которое хранится на запоминающем устройстве системы, таком как USB-накопитель, SD-карта, eMMC, флэш-память NAND, флэш-память NOR и т. д. . [ 5 ] Последовательность запуска системы во встроенном загрузочном ПЗУ зависит от процессора. [ 5 ] но все они включают этапы инициализации оборудования и тестирования аппаратного обеспечения системы . [ 7 ] Например, в системе с процессором i.MX7D и загрузочным устройством, на котором хранится ОС (включая U-Boot, внешний загрузчик), встроенное загрузочное ПЗУ сначала настраивает контроллер памяти DDR , который позволяет программе загрузочного ПЗУ для получения данных конфигурации SoC из внешнего загрузчика на загрузочном устройстве. [ 5 ] Затем встроенное загрузочное ПЗУ загружает U-Boot в ОЗУ для этапа загрузчика. [ 11 ]
Этап загрузчика
[ редактировать ]Загрузчик первого этапа , входящий в состав MBR, представляет собой 512-байтовый образ, содержащий программный код конкретного поставщика и таблицу разделов . [ 6 ] Как упоминалось ранее во вводной части, загрузчик первого этапа найдет и загрузит загрузчик второго этапа . [ 6 ] Это делается путем поиска в таблице разделов активного раздела. [ 6 ] После обнаружения активного раздела загрузчик первого этапа продолжит сканирование остальных разделов в таблице, чтобы убедиться, что все они неактивны. [ 6 ] После этого шага загрузочная запись активного раздела считывается в ОЗУ и выполняется как загрузчик второго этапа. [ 6 ] Задача загрузчика второго этапа заключается в загрузке образа ядра Linux в память и (необязательно) начальный RAM-диск . [ 12 ] Образ ядра — это не исполняемое ядро, а «сжатый файл» ядра , сжатый в zImage или bzImage форматы с помощью zlib . [ 13 ]
На ПК x86 загрузчики первого и второго этапов объединены в GR и унифицированный загрузчик ( GRUB ), а ранее — загрузчик Linux ( LILO ). [ 12 ] GRUB 2 , который сейчас используется, отличается от GRUB 1 возможностью автоматического обнаружения различных операционных систем и автоматической настройки. Стадия 1 загружается и выполняется либо BIOS из главной загрузочной записи (MBR). Загрузчик промежуточного этапа (stage1.5, обычно core.img) загружается и выполняется загрузчиком stage1. Загрузчик второго этапа (этап 2, файлы /boot/grub/) загружается этапом 1.5 и отображает меню запуска GRUB, которое позволяет пользователю выбирать операционную систему или проверять и редактировать параметры запуска. После выбора пункта меню и указания дополнительных параметров GRUB загружает ядро Linux в память и передает ему управление. GRUB 2 также способен загружать другой загрузчик по цепочке. В системах UEFI stage1 и stage1.5 обычно представляют собой один и тот же файл приложения UEFI (например, grubx64.efi для систем UEFI x64 ).
Помимо GRUB, есть еще несколько популярных загрузчиков:
- systemd-boot (ранее Gummiboot), загрузчик, входящий в состав systemd и требующий минимальной настройки ( UEFI ). только для систем
- SYSLINUX/ISOLINUX — это загрузчик, который специализируется на загрузке полных установок Linux из файловых систем FAT. Он часто используется для загрузочных или аварийных дискет, живых USB-накопителей и других легких загрузочных систем. ISOLINUX обычно используется на живых компакт-дисках 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 включает логику для чтения общих файловых систем во время выполнения для доступа к файлу конфигурации. [ 14 ] Это дает GRUB 1 возможность читать свой файл конфигурации из файловой системы, а не встраивать его в MBR, что позволяет ему изменять конфигурацию во время выполнения и указывать диски и разделы в удобочитаемом формате, а не полагаться на смещения. Он также содержит интерфейс командной строки , который упрощает исправление или изменение GRUB, если он неправильно настроен или поврежден. [ 15 ]
- Loadlin — это загрузчик, который может заменять работающее ядро DOS или Windows 9x ядром Linux во время выполнения. Это может быть полезно в случае оборудования, которое необходимо включать через программное обеспечение и для которого такие программы настройки являются проприетарными и доступны только для DOS. В настоящее время этот метод загрузки менее необходим, поскольку в Linux есть драйверы для множества аппаратных устройств, но он нашел некоторое применение на мобильных устройствах . Другой вариант использования — когда Linux расположен на запоминающем устройстве, которое недоступно для загрузки BIOS: DOS или Windows могут загрузить соответствующие драйверы, чтобы компенсировать ограничения BIOS, и загрузить Linux оттуда.
Ядро
[ редактировать ]Стадия ядра происходит после стадии загрузчика. Ядро Linux обрабатывает все процессы операционной системы, такие как управление памятью , планирование задач , ввод-вывод , межпроцессное взаимодействие и общий контроль над системой. Он загружается в два этапа: на первом этапе ядро (в виде сжатого файла образа) загружается в память и распаковывается , а также настраиваются несколько фундаментальных функций, таких как базовое управление памятью, минимальный объем настройки оборудования. [ 13 ] Стоит отметить, что образ ядра самораспаковывается , что является частью процедуры работы с образом ядра . [ 13 ] Для некоторых платформ (например, 64-разрядной версии ARM) распаковка ядра должна выполняться загрузчиком, например U-Boot. [ 16 ]
Для получения подробной информации об этих шагах рассмотрим пример с микропроцессором i386 . Когда вызывается его bzImage, функция start()
(из ./arch/i386/boot/head.S
) вызывается для выполнения базовой настройки оборудования, а затем вызывает startup_32()
(находится в ./arch/i386/boot/compressed/head.S
). [ 13 ] startup_32()
выполнит базовую настройку среды (стек и т. д.), очистит блок, начатый символом (BSS), а затем вызовет decompress_kernel()
(находится в ./arch/i386/boot/compressed/misc.c
), чтобы распаковать ядро. [ 13 ] Запуск ядра затем выполняется через другой startup_32()
функция, расположенная в ./arch/i386/kernel/head.S
. [ 13 ] Функция запуска startup_32()
для ядра (также называемого свопером или процессом 0) устанавливает управление памятью (таблицы подкачки и подкачка памяти), определяет тип ЦП и любые дополнительные функции, такие как возможности с плавающей запятой , а затем переключается на неспецифические для архитектуры функции ядра Linux через звонок в start_kernel()
расположен в ./init/main.c
. [ 13 ]
start_kernel()
выполняет широкий спектр функций инициализации. Он настраивает обработку прерываний ( IRQ ), дополнительно настраивает память, монтирует исходный RAM-диск (« initrd »), который был загружен ранее в качестве временной корневой файловой системы на этапе загрузчика. [ 13 ] Initrd, действующий как временная корневая файловая система в оперативной памяти, позволяет полностью загружать ядро и модули драйверов непосредственно из памяти, не полагаясь на другие устройства (например, жесткий диск). [ 13 ] initrd содержит необходимые модули, необходимые для взаимодействия с периферийными устройствами, [ 13 ] например, драйвер SATA и поддержка большого количества возможных конфигураций оборудования. [ 13 ] Такое разделение некоторых драйверов, статически скомпилированных в ядро, и других драйверов, загружаемых из initrd, позволяет уменьшить размер ядра. [ 13 ] initramfs , также известный как раннее пользовательское пространство , доступен начиная с версии 2.5.46 ядра Linux. [ 17 ] с намерением заменить как можно больше функций, которые раньше ядро выполняло во время процесса запуска. Обычно раннее пользовательское пространство используется для определения драйверов устройств, необходимых для загрузки основной файловой системы пользовательского пространства, и загрузки их из временной файловой системы . Многие дистрибутивы используют dracut для создания и поддержки образа initramfs.
Корневая файловая система позже переключается посредством вызова pivot_root()
который отключает временную корневую файловую систему и заменяет ее реальной, как только последняя становится доступной. [ 13 ] Затем память, используемая временной корневой файловой системой, освобождается. [ нужны разъяснения ]
Окончательно, kernel_thread
(в arch/i386/kernel/process.c
) вызывается для запуска процесса Init (первый процесс в пользовательском пространстве), а затем запускает задачу простоя через cpu_idle()
. [ 13 ]
Таким образом, на этапе ядра инициализируются устройства, монтируется корневая файловая система, указанная загрузчиком как доступная только для чтения , и выполняется Init ( /sbin/init
), который обозначается как первый процесс, запускаемый системой ( PID = 1). [ 18 ] Сообщение выводится ядром при монтировании файловой системы и Init при запуске процесса Init. [ 18 ]
По словам Red Hat , подробный процесс ядра на этом этапе резюмируется следующим образом: [ 14 ]
- «Когда ядро загружается, оно немедленно инициализирует и настраивает память компьютера, а также настраивает различное оборудование, подключенное к системе, включая все процессоры, подсистемы ввода-вывода и устройства хранения. Затем оно ищет сжатый образ initrd в заранее определенном месте. в памяти, распаковывает его, монтирует и загружает все необходимые драйверы. Затем он инициализирует виртуальные устройства, связанные с файловой системой, такие как LVM или программный RAID, прежде чем размонтировать образ диска initrd и освободить всю память, которую когда-то занимал образ диска. Затем ядро создает корневое устройство. [ нужны разъяснения ] монтирует корневой раздел только для чтения и освобождает неиспользуемую память. На этом этапе ядро загружается в память и работает. Однако, поскольку не существует пользовательских приложений, которые бы позволяли вводить в систему осмысленный ввод, мало что можно сделать». Загрузка в стиле initramfs аналогична, но не идентична описанной загрузке initrd.
На этом этапе, когда прерывания включены, планировщик может взять под свой контроль общее управление системой, чтобы обеспечить упреждающую многозадачность, а процесс инициализации остается продолжать загрузку пользовательской среды в пользовательском пространстве.
Процесс инициализации
[ редактировать ]После запуска ядра оно запускает процесс инициализации . [ 19 ] демон , который затем загружает пользовательское пространство , например, проверяя и монтируя файловые системы , а также запуская другие процессы . Система инициализации — это первый демон, который запускается (во время загрузки) и последний демон, который завершает работу (во время завершения работы ).
Исторически это была «SysV init», которая называлась просто «init». Более поздние дистрибутивы Linux, вероятно, будут использовать одну из более современных альтернатив, таких как systemd . Ниже приведено краткое описание основных процессов инициализации:
- SysV init ( он же просто «init») аналогичен процессам инициализации Unix и BSD , от которых он произошел. В стандартной системе Linux init выполняется с параметром, известным как уровень выполнения , который принимает значение от 0 до 6 и определяет, какие подсистемы становятся работоспособными. Каждый уровень выполнения имеет свои собственные сценарии , которые кодифицируют различные процессы, связанные с установкой или выходом из данного уровня выполнения, и именно эти сценарии используются по мере необходимости в процессе загрузки. Сценарии инициализации обычно хранятся в каталогах с такими именами, как
"/etc/rc..."
. Файл конфигурации верхнего уровня для init находится по адресу/etc/inittab
. [ 20 ] Во время загрузки системы он проверяет, указан ли уровень запуска по умолчанию в /etc/inittab, и запрашивает уровень запуска для входа через системную консоль , если нет. Затем он приступает к выполнению всех соответствующих загрузочных сценариев для данного уровня выполнения, включая загрузку модулей , проверку целостности корневой файловой системы (которая была смонтирована только для чтения), а затем ее повторное монтирование для полного доступа для чтения и записи, а также настраивает сеть . [ 18 ] После запуска всех указанных процессов init переходит в режим ожидания и ждет одного из трех событий: процессы, которые начали завершаться или умирать, сигнал сбоя питания, [ нужны разъяснения ] или запрос через/sbin/telinit
для дальнейшего изменения уровня выполнения. [ 21 ]
- systemd — современная альтернатива SysV init. Как и init, systemd — это демон, который управляет другими демонами. Все демоны, включая systemd, являются фоновыми процессами . Леннарт Пёттеринг и Кей Сиверс , инженеры-программисты, первоначально разработавшие systemd, [ 22 ] стремился превзойти эффективность демона init несколькими способами. позволить выполнять больше обработки параллельно во время загрузки системы и уменьшить вычислительные затраты оболочки Они хотели улучшить программную среду для выражения зависимостей, чтобы . Инструкции Systemd по инициализации для каждого демона записываются в декларативный файл конфигурации, а не в сценарий оболочки. Для межпроцессного взаимодействия systemd делает сокеты домена Unix и D-Bus доступными для запущенных демонов. Systemd также способен к агрессивному распараллеливанию.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ М. Тим Джонс, 2006 г. , «Введение», «Процесс загрузки системы Linux® состоит из ряда этапов. Но независимо от того, загружаете ли вы стандартный рабочий стол x86 или глубоко встроенную цель PowerPC®, большая часть процесса выполняется удивительно похоже».
- ^ Перейти обратно: а б с д и ж г М. Тим Джонс, 2006 г. , «Обзор», «Рисунок 1. Вид процесса загрузки Linux с высоты 20 000 футов»
- ^ М. Тим Джонс, 2006 г. , «Процесс загрузки Linux сгруппирован в 4 этапа на основе исходного кода IBM»
- ^ Бин, Ню; Децзян, Ли; Чжанцзян, ЛУ; Лисинь, Ян; Чжихуа, Бай; Лонглун, Он; Шэн, Лю (август 2020 г.). «Исследование и разработка Bootrom, поддерживающего безопасный режим загрузки» . Международный симпозиум по компьютерной инженерии и интеллектуальным коммуникациям (ISCEIC) 2020 года . стр. 5–8. дои : 10.1109/ISCEIC51027.2020.00009 . ISBN 978-1-7281-8171-4 . S2CID 231714880 .
- ^ Перейти обратно: а б с д Альберто Либерал Де Лос Риос 2017 , с. 28, «Процесс загрузки Linux».
- ^ Перейти обратно: а б с д и ж М. Тим Джонс 2006 г. , «Загрузчик первой стадии».
- ^ Перейти обратно: а б с д и М. Тим Джонс 2006 , «Запуск системы».
- ^ «Ядро-заглушка EFI — Gentoo Wiki» . wiki.gentoo.org . Проверено 2 ноября 2020 г.
- ^ Кинни, Майкл (1 сентября 2000 г.). «Решение проблем с загрузкой BIOS с помощью EFI» (PDF) . стр. 47–50. Архивировано из оригинала (PDF) 23 января 2007 года . Проверено 14 сентября 2010 г.
- ^ «MS отрицает, что безопасная загрузка исключает Linux» . Регистр. 23 сентября 2011 года . Проверено 24 сентября 2011 г.
- ^ Альберто Либерал Де Лос Риос 2017 , с. 29, «Процесс загрузки Linux».
- ^ Перейти обратно: а б М. Тим Джонс 2006 , «Загрузчик 2-го этапа».
- ^ Перейти обратно: а б с д и ж г час я дж к л м н М. Тим Джонс 2006 , «Ядро».
- ^ Перейти обратно: а б «Документация на продукцию» . Redhat.com. 30 сентября 2013 г. Проверено 22 января 2014 г.
- ^ «Документация на продукцию» . Redhat.com. 30 сентября 2013 г. Проверено 22 января 2014 г.
- ^ Альберто Либерал Де Лос Риос 2017 , с. 20, , «Загрузчик».
- ^ «Initramfs прибывает» . Проверено 14 ноября 2011 г.
- ^ Перейти обратно: а б с http://oldfield.wattle.id.au/luv/boot.html Процесс загрузки Linux — Ким Олдфилд (2001)
- ^ М. Тим Джонс 2006 , «Init».
- ^ «От включения до Bash Prompt: Init» . users.cecs.anu.edu.au .
- ^ "инит" . man.he.net .
- ^ «Системный README» . сайт freedesktop.org . Проверено 9 сентября 2012 г.
Цитируемые работы
[ редактировать ]- М. Тим Джонс (31 мая 2006 г.). «Внутри процесса загрузки Linux» . ИБМ . Архивировано из оригинала 11 октября 2007 г. Проверено 14 января 2024 г.
- Альберто Либерал Де Лос Риос (2017). Разработка драйверов Linux для встроенных процессоров (2-е изд.). Редакционный Circulo Rojo; Издание 1-е (опубликовано 3 марта 2017 г.). ISBN 978-8491600190 .
Внешние ссылки
[ редактировать ]- Чтение исходников ядра Linux , Викиверситет
- Грег О'Киф - From Power Up To Bash Prompt в Wayback Machine (архивировано 23 октября 2009 г.)
- Bootchar: Визуализация производительности процесса загрузки
- Процесс начальной загрузки в системах EFI , LWN.net , 11 февраля 2015 г., Мэтт Флеминг