6 шагов загрузки Linux на пальцах
Нажмите кнопку включения питания на вашем системнике, и спустя несколько секунд вы увидите окно входа в систему.
Посмею предположить, что каждого интересовало хоть когда-либо то, что происходит за занавесом заставок и загрузочных экранов с момента включения питания компьютера к моменту, когда предлагается войти в систему.
Я предлагаю вам познакомиться со следующими уровнями типичной загрузки Linux:
1. BIOS
- BIOS отвечает за базовый ввод/вывод данных с устройств/на устройства.
- Делает некоторые проверки целостности устройств. К тому же, за тестирование работоспособности электроники отвечает POST (Power-on self-test, он же «тест на адекватность себя самого», выполняющийся как этап пре-загрузки), который управляется BIOS
- Ищет, загружает и выполняет программу-загрузчик ОС
- Берет загрузчик из флопика, сидюка или жесткого диска. Во время загрузки BIOS’а вы можете нажать на кнопку (обычно это F12 или F2 или Del, зависит от платформы), если вам требуется внести некоторые изменения касательно настройки железа.
- Как только загрузчик был обнаружен и загружен в память, BIOS передает управление ему.
- Короче говоря, BIOS загружает и выполняет загрузочную запись (MBR).
2. MBR
- MBR — это главная загрузочная запись, хранящаяся на жестком диске
- Она размещена в 1-м секторе загрузочного диска, например /dev/hda или /dev/sda
- MBR занимает меньше, чем 512 байтов. Она состоит из трех компонентов: 1) главная загрузочная информация, «живущая» в первых 446 байтах; 2) информация о таблице разделов — в следующих 64 байтах; 3) и последние 2 байта нужны для проверки корректности mbr.
- Она содержит информацию о GRUB’е (или LILO).
- Простыми словами — MBR загружает и выполняет загрузчик GRUB.
3. GRUB
- GRUB — Grand Unified Bootloader.
- Если в вашей системе установлено более, чем одно ядро, у вас есть возможность выбирать, которое из них должен выполняться
- GRUB отображает
красивую анимацию plymouthзаставку, и, подождав несколько секунд интерактивного воздействия пользователя, если он не нажал ни одной клавиши, он загружает ядро, установленное по умолчанию в файле конфигурации grub. - GRUB понимает, что такое файловая система (древние загрузчики Linux’а, например, LILO этого не понимают).
- Конфигурационный файл Grub обычно лежит по пути /boot/grub/grub.conf (так же /etc/grub.conf может быть символьной ссылкой на него). Вот пример файла конфигурации для CentOS:
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
initrd /boot/initrd-2.6.18-194.el5PAE.img
4. Ядро или Kernel
- Ядро монтирует файловую систему в соответствии с настройкой «root=» в фале grub.conf
- Выполняет программу /sbin/init
- Поскольку init — это первый процесс, запущенный ядром Linux, поэтому она имеет идентификатор процесса (PID) №1. Можете выполнить «ps -ef | grep init» и убедиться в этом.
- initrd — это Initial RAM Disk, он же временный диск в оперативной памяти
- initrd используется самим ядром в качестве временной корневой файловой системы, пока kernel не загрузится в реальную примонтированную файловую систему. Этот временный диск также содержит необходимые для загрузки драйверы, позволяющие получить доступ к разделам дисков и другому оборудованию
5. Init
- Смотрит в файл /etc/inittab для того, чтобы определить уровень выполнения (run level).
- Есть следующие уровни выполнения:
- 0 – прервать выполнение
- 1 – Однопользовательский режим, так называемый «Single user mode», или иными словами, консоль восстановления
- 2 – Многопользовательский режим без поддержки NFS
- 3 – Полноценный многопользовательский режим
- 4 – не используется
- 5 – X11
- 6 – перезагрузка
6. Уровень выполнения программ (Runlevel)
- Когда Линукс выполняет свою загрузку, вы можете наблюдать загрузку различных служб. К примеру, это могут быть сообщения типа «starting Postfix … OK» (запускается Postfix). Эти службы — и называются программами уровня выполнения, выполняемые из директории, которая соответствует нужному уровню выполнения.
- Исходя из настроек по умолчанию, система будет выполнять файлы в соответствии с нижеприведенными директориями.
- Выполнение уровня 0 – /etc/rc.d/rc0.d/
- Выполнение уровня 1 – /etc/rc.d/rc1.d/
- Выполнение уровня 2 – /etc/rc.d/rc2.d/
- Выполнение уровня 3 – /etc/rc.d/rc3.d/
- Выполнение уровня 4 – /etc/rc.d/rc4.d/
- Выполнение уровня 5 – /etc/rc.d/rc5.d/
- Выполнение уровня 6 – /etc/rc.d/rc6.d/
Вот и все. Возможно, некоторым из вас это не ново и особого интереса не было при чтении статью, поскольку она более ориентирована на начально-средний уровень знакомства з Линуксом.
В таком случае могу лишь сказать, что «повторение — мать учения» (с).Дополнения, исправления, уточнения
- artemlight:: «Ну скажем прямо — так грузятся далеко не все дистры». С ним согласилось большинство, отмечая и bsd-style init, u-boot, и хоть initrd в статье пропущен, стоить заметить, что он нужен ядру не во всех дистрибутивах. Также отмечено, что в slackware поддержка rc.d осуществляется только в качестве совместимости, а встраиваемые системы грузятся иначе. На декстопах иногда бывает EFI, а кроме того Linux популярен в мире embedded и там ещё куча разных платформ. Линукс в телефоне вообще иначе грузится.
- soomrack, ссылая на википедию: Еще хочется сделать замечание по поводу MBR, первого сектора и пр. Все несколько усложнилось за последние годы. Сейчас уместней говорить о EFI.
Загрузка Linux
В этой статье описаны основные этапы загрузки операционной системы Linux. Эта тема которую неплохо бы было знать любому ИТ-специалисту.
Основные этапы загрузки хоста с ОС Linux:
- BIOS/UEFI -> MBR/GPT
- MBR/GPT -> Boot loader (GRUB2)
- Boot loader (GRUB2) -> Инициализация ядра (Kernel)
- Инициализация ядра (Kernel) -> Init (Systemd)
В этой статье описываются GRUB2 и Systemd, поскольку они являются основными для большинства основных дистрибутивов, но на практике еще можно найти другие.
BIOS
Первый шаг процесса загрузки не имеет ничего общего с Linux. Это аппаратная часть процесса загрузки, которая является одинаковой для любой операционной системы. При включении питания запускается BIOS (basic input/output system базовая система ввода-вывода), которая запускает POST (Power-On Self-Test — «самотестирование при включении»), который является частью BIOS. В случае сбоя BIOS POST, компьютер нельзя будет использовать, поэтому процесс загрузки не продолжится.
BIOS POST проверяет базовую работоспособность оборудования, а затем BIOS определяет местонахождение главных загрузочных записей (MBR) на всех подключенных загрузочных устройствах. Первый обнаруженный загрузочный сектор, содержащий действительную загрузочную запись, загружается в ОЗУ, а затем управление передается коду (GRUB2), который был загружен из загрузочного сектора.
GRUB2
В большинстве современных дистрибутивов используются загрузчик GRUB2 (можно также встретить GRUB и LILO). GRUB2 (GRand Unified Bootloader, version 2) — это программа, которая делает компьютер достаточно умным, чтобы найти ядро операционной системы (Kernel) и загрузить его в память.
GRUB2 позволяет загружать многие версии Linux и другие бесплатные операционные системы; он также может загружать по цепочке загрузочную запись проприетарных операционных систем. А также, может позволить пользователю выбрать загрузку из нескольких различных ядер для любого данного дистрибутива Linux. Это дает возможность загрузить предыдущую версию ядра, если обновленная версия даст сбой или будет несовместима с важной частью программного обеспечения. GRUB2 можно настроить с помощью файла /boot/grub/grub.conf.
Функция GRUB2 состоит в том, чтобы найти и загрузить ядро Linux в оперативную память и передать управление компьютером ядру. Ядро и связанные с ним файлы находятся в каталоге /boot. Файлы ядра можно идентифицировать, так как все они имеют имена, начинающиеся с vmlinuz. Вы можете посмотреть содержимое каталога /boot, чтобы увидеть установленные в настоящее время ядра в вашей системе. По умолчанию GRUB2 предоставляет предзагрузочное меню установленных ядер, включая опцию rescue и, если настроено, опцию recovery.
GRUB2 загружает выбранное ядро в память и передает управление компьютером ядру.
Kernel (ядро)
Все ядра находятся в каталоге /boot, в самораспаковывающемся сжатом формате для экономии места на диске. После того, как выбранное ядро загружено в память и начинает выполняться, оно сначала извлекает себя из сжатой версии файла, прежде чем сможет выполнять какую-либо полезную работу.
Так как файловые системы еще не смонтированы, ядро при запуске использует временную файловую систему из файла initrd.img, для того чтобы загрузиться полностью. После извлечения оно загружает инициализацию операционной системы — Systemd (PID 1) и передает ей управление.
Systemd
Systemd является основным родителем для всех процессов, имеет первый номер процесса (PID 1) и отвечает за доведение хоста Linux до состояния, в котором можно выполнять работу.
Systemd монтирует файловые системы, как определено в файле /etc/fstab, включая любые файлы подкачки или разделы. На этом этапе он уже может получить доступ к файлам конфигурации, расположенным в /etc, включая свои конфигурационные файлы. Он использует свой файл конфигурации, чтобы определить, в каком состоянии должен загрузить хост.
Загрузка linux с UEFI
Новые компьютеры используют UEFI (Unified Extensible Firmware Interface) вместо BIOS. UEFI содержит множество преимуществ перед BIOS, одна из которых — поддержка GPT, который позволяет использовать большие диски и помещать загрузчик на специальный раздел, а также позволяет создавать много разделов.
Раньше диски разбивались на разделы с помощью MBR, но было ограничение — диск не мог быть больше 2 TB, а разделов не могло быть больше четырёх. При этом таблица разделов и первичный загрузчик помещались на первый сектор диска в MBR. Диск разбитый с помощью GPT в первом секторе продолжает хранить MBR запись, для того, чтобы старые системы с BIOS могли использовать диски с таблицей разделов GPT.
UEFI не использует загрузчик MBR, вместо этого используется загрузчик со специального раздела на диске, который отформатирован в FAT32 и называется ESP или EFI. Обычно это файл /efi/boot/bootx64.efi. Дальше процесс такой же как и загрузкой с помощью BIOS.