linux_loading_process
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| linux_loading_process [2024/09/18 13:39] – uf4n | linux_loading_process [2024/09/18 14:08] (current) – uf4n | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Процесс загрузки Linux от включения компьютера до ввода пароля ====== | + | ====== Процесс загрузки Linux от включения компьютера до ввода пароля |
| - | 1. BIOS запускает POST (Power-on self test), который проверяет | + | ===== BIOS ===== |
| - | целостность аппаратуры; | + | |
| - | каком-либо из дисков загрузочную запись MBR (Master boot record) и | + | |
| - | передаст ей управление. | + | |
| - | 2. MBR находится на первом секторе загрузочного диска, её объём | + | BIOS запускает POST (Power-on self test), который проверяет целостность аппаратуры; |
| + | |||
| + | ===== Master Boot Record ===== | ||
| + | |||
| + | MBR находится на первом секторе загрузочного диска, её объём | ||
| составляет 512 байт. Она состоит из трёх компонентов: | составляет 512 байт. Она состоит из трёх компонентов: | ||
| - Первичный загрузчик, | - Первичный загрузчик, | ||
| - | - Таблица разделов (Partition Table) в следующих 64-х байтах. Она | + | - Таблица разделов (Partition Table) в следующих 64-х байтах. Она описывает 4 первичных раздела номерами их первых и последних цилиндров, |
| - | | + | |
| - | | + | |
| - | | + | |
| - Последние 2 байта - " | - Последние 2 байта - " | ||
| что данный сектор является загрузочным. Это не контрольная сумма. | что данный сектор является загрузочным. Это не контрольная сумма. | ||
| - | Формат MBR стандартен для всех операционных систем, | + | Формат MBR стандартен для всех операционных систем, |
| - | области, | + | |
| - | загрузчиком стоит одна задача: | + | |
| - | загрузчика следующего этапа, разворачивающего саму операционную систему. | + | |
| - | Он анализирует разделы, | + | |
| - | активный. Потом она передаёт управление PBR (Parimary Boot Record) | + | |
| - | (иногда говорят VBR) - основной загрузочной записи активного | + | |
| - | раздела. Раздел с основной загрузочной записью содержит загрузчик Linux. | + | |
| - | MBR находится в начале жёсткого диска и содержит информацию о всех | + | MBR находится в начале жёсткого диска и содержит информацию о всех разделах на диске. PBR содержит информацию о файловой системе и выполнении процедуры загрузки для данного раздела. Может содержать (чаще всего содержит) сполняемые файлы загрузчика непосредственно операционной системы (LILO или GRUB). |
| - | разделах на диске. PBR содержит информацию о файловой системе и | + | |
| - | выполнении процедуры загрузки для данного раздела. Может содержать | + | |
| - | (чаще всего содержит) | + | |
| - | операционной системы (LILO или GRUB). | + | |
| - | Возможность интерактивного взаимодействия с пользователем, | + | Возможность интерактивного взаимодействия с пользователем, |
| - | предоставляемая сложными загрузчиками операционных систем, | + | |
| - | за счёт чтения файлов с диска. Загрузчик зависит от файловой системы, | + | |
| - | причём от такой, которая не оптимизирует дисковое пространство, | + | |
| - | сжимает данные. С другими файловыми системами загрузка ядра была бы | + | |
| - | невозможна. | + | |
| - | Время работы MBR называют первой фазой загрузки, | + | Время работы MBR называют первой фазой загрузки, |
| - | говорят, | + | |
| - | Программа, | + | Программа, |
| - | передачи чему-то из этого управления. В то же время, принято говорить, | + | |
| - | что LILO и GRUB являются вторичными загрузчиками, | + | |
| - | назвать их загрузчиками третей фазы. Однако, | + | |
| - | существующей терминологии, | + | |
| - | GRUB или LILO. | + | |
| - | 3. Стандартный загрузчик Linux — LILO (LInux LOader) — состоит из двух | + | ====== |
| - | частей: | + | |
| - | MBR и умеет только загружать LO, который передает управление | + | |
| - | ядру или вызывает другой первичный загрузчик (например, | + | |
| - | 9х). LO находится в файле на диске (по умолчанию / | + | |
| - | О файловых системах LI не знает, поэтому карта размещения этого файла | + | |
| - | хранится в нем в виде «цилиндр/ | + | |
| - | утилита /sbin/lilo, которую нужно запускать после любого изменения LO | + | |
| - | или его конфигурационного файла / | + | |
| - | У вторичного загрузчика LO есть | + | Стандартный загрузчик Linux — LILO (LInux LOader) — состоит из двух частей: |
| - | (по умолчанию /boot/map). По ней он ищет загружаемое ядро и образ | + | |
| - | виртуального диска, поэтому | + | |
| - | емых модулей тоже обязательно запускать утилиту lilo. Эта утилита | + | |
| - | обновляет загрузчику информацию о расположении | + | |
| - | которая | + | |
| - | файловых систем. | + | |
| - | 4. После того как ядро загружено в память и ему передано управление, | + | У вторичного загрузчика LO есть собственная карта размещения файлов (по умолчанию /boot/map). По ней он ищет загружаемое ядро и образ виртуального диска, поэтому после любого изменения ядра или загружаемых модулей тоже обязательно запускать утилиту lilo. Эта утилита обновляет загрузчику информацию о расположении данных на диске, |
| - | оно должно смонтировать корневую файловую систему. Чтобы это сделать, | + | которая нужна ему в весьма специфичном виде, ввиду непонимания файловых систем. |
| - | ядро должно загрузить драйвер контроллера жёсткого диска, | + | |
| - | расположенный на корневой файловой системе (каталог | + | ====== Initrd ====== |
| - | / | + | |
| - | технологии initrd (Initial RAM disk): вместе с ядром LILO загружает в | + | После того как ядро загружено в память и ему передано управление, |
| - | оперативную(!) память образ стартового диска, и ядро монтирует его как | + | |
| - | обычную файловую систему. В этой файловой системе находятся модули, | + | |
| - | необходимые для работы со всевозможными внешними устройствами (диски в | + | |
| - | том числе) и сетью, и утилиты для их подгрузки. Подключив модули, | + | |
| - | отсоединяет виртуальный диск и монтирует настоящую корневую файловую | + | |
| - | систему. | + | |
| Файл образа виртуального диска обычно называется | Файл образа виртуального диска обычно называется | ||
| - | / | ||
| - | Если скомпилировать ядро сразу с необходимыми модулями, | + | / |
| - | необходимость в initrd и скорость загрузки системы возрастёт. | + | |
| + | Если скомпилировать ядро сразу с необходимыми модулями, | ||
| + | |||
| + | ====== GRUB ====== | ||
| - | 5. GRUB (GRand Unified Bootloader) использует несколько отличную от | + | GRUB (GRand Unified Bootloader) использует несколько отличную от LILO схему загрузки. Вторичный загрузчик хранится не в каком-то файле, а в не используемом системой пространстве. Обычно это весь остаток от первой дорожки диска. Первые 512 байт занимает MBR, 31744 байта вторичный загрузчик. Если места для полноценного вторичного загрузчика там недостаточно, |
| - | LILO схему загрузки. Вторичный загрузчик хранится не в каком-то файле, | + | загружает в оперативную память ядро и initrd, затем передаёт управление ядру. |
| - | а в не используемом системой пространстве. Обычно это весь остаток от | + | |
| - | первой дорожки диска. Первые 512 байт занимает MBR, 31744 байта | + | |
| - | вторичный загрузчик. Если места для полноценного вторичного загрузчика | + | |
| - | там недостаточно, | + | |
| - | этапа, «полуторный», | + | |
| - | инструкций для вызова настоящего, | + | |
| - | загрузчика. Благодаря такой организации GRUB поддерживает большинство | + | |
| - | файловых систем (FAT и FAT32, ext2fs и ext3fs, ReiserFS, XFS, BSD | + | |
| - | FFS), понимает большинство форматов исполняемых файлов и изменения в | + | |
| - | конфигурационном файле вступают в силу сразу же, без прописывания их в | + | |
| - | специальном месте специальной утилитой. Также, как и LILO, GRUB | + | |
| - | загружает в оперативную память ядро и initrd, затем передаёт | + | |
| - | управление ядру. | + | |
| + | ====== Распаковка и инициализация ядра в оперативной памяти ====== | ||
| - | 6. Ядро после загрузки в оперативную память ещё не в состоянии полной | + | 6. Ядро после загрузки в оперативную память ещё не в состоянии полной готовности. Загрузчик выгружает с диска только заархивированный образ ядра - vmlinuz. Он состоит из трёх частей: |
| - | готовности. Загрузчик выгружает с диска только заархивированный образ | + | |
| - | ядра - vmlinuz. Он состоит из трёх частей: | + | |
| vmlinuz = header + kernel setup code + vmlinuX (actual compressed kernel) | vmlinuz = header + kernel setup code + vmlinuX (actual compressed kernel) | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | Заголовок - это часть ядра, в которой загрузчик операционной системы | + | Заголовок - это часть |
| - | располагает параметры для его работы. Их можно найти и изменить в | + | |
| - | конфигурационных файлах загрузчика. | + | |
| - | Как же так получается, | + | Как же так получается, |
| - | оно ещё представляет из себя сжатым образом в оперативной памяти? | + | |
| - | Загрузчик передаёт управление процедуре автозапуска - части образа | + | Загрузчик передаёт управление процедуре автозапуска - части образа ядра, которая сама по себе не является сжатыми данными. Процедура автозапуска определяет объем доступной оперативной памяти, |
| - | ядра, которая сама по себе не является сжатыми данными. Процедура | + | делается для того, чтобы выбрать из возможных вариантов выполнения ядром основных функций |
| - | автозапуска определяет объем доступной оперативной памяти, | + | процедура определяет системную консоль, |
| - | тактовую частоту процессора, | + | |
| - | жесткие диски, не полагаясь на инициализацию, | + | |
| - | делается для того, чтобы выбрать из возможных вариантов выполнения | + | |
| - | ядром основных функций оптимизированные именно для данной архитектуры | + | |
| - | компьютера, повысив тем самым быстродействие всей системы. Эта же | + | |
| - | процедура определяет системную консоль, | + | |
| - | диагностические сообщения. | + | |
| Наконец, | Наконец, | ||
| - | фактический | + | фактический образ ядра (на этом этапе вы видите сообщение: |
| - | «Uncompressing Linux...») и передает ему управление (, что иногда | + | |
| - | знаменуется сообщением «OK, booting the kernel»). Теперь ядро | + | |
| - | инициализирует таблицу страниц виртуальной памяти, | + | |
| - | обработчики прерываний, | + | |
| - | диспетчером загрузки, | + | |
| - | Завершив самонастройку, | + | Завершив самонастройку, |
| - | фактически представляющих собой части самого ядра (их можно увидеть в | + | |
| - | выводе команды ps): планировщик процессов, | + | |
| - | памяти, | + | |
| - | Один из них получает идентификатор 1, он станет полноценным | + | Один из них получает идентификатор 1, он станет полноценным пользовательским процессом, |
| - | пользовательским процессом, | + | |
| - | init. Этот демон запустит все остальные службы и пользовательскую | + | |
| - | среду. Все программы, | + | |
| - | дочерними процессами от других процессов, | + | |
| - | Ядро монтирует корневую файловую систему сначала в режиме «только | + | Ядро монтирует корневую файловую систему сначала в режиме «только чтение», |
| - | чтение», | + | |
| - | или там, где вы укажете, | + | |
| - | init=/ | + | |
| - | его код в процесс номер 1. Все остальные процессы порождает init и его | + | |
| - | потомки путем деления с помощью системного вызова fork(). | + | |
| - | Системный вызов exec() заменяет текущую программу новой, при этом | + | Системный вызов exec() заменяет текущую программу новой, при этом идентификатор процесса сохраняется, |
| - | идентификатор процесса сохраняется, | + | |
| - | процесс с новым идентификатором. Этот идентификатор потомком | + | |
| - | возвращается родителю для обеспечения их связности. Таким образом | + | |
| - | выстраивается древовидная иерархия процессов. | + | |
| - | Ядро покорно запустит в качестве первого процесса любую программу, | + | Ядро покорно запустит в качестве первого процесса любую программу, |
| - | которую вы укажете ему как init в конфигурационных файлах загрузчика: | + | |
| LILO: my_linux init=/ | LILO: my_linux init=/ | ||
| - | В данном случае вместо системы инициализации ядро запустит командную | + | В данном случае вместо системы инициализации ядро запустит командную оболочку. |
| - | оболочку. | + | |
| - | 7. Процесс init прочитывает свой конфигурационный файл / | + | ====== Init (SystemV init) ====== |
| - | запускает другие процессы согласно указанным в нем инструкциям. В этот | + | |
| - | момент выводится приглашение нажать определенную клавишу | + | |
| - | чтобы войти в интерактивный режим, позволяющий запускать каждый | + | |
| - | процесс вручную или отказываться от запуска вовсе. | + | |
| - | В каждый момент времени система находится на одном из уровней | + | Процесс init читает свой конфигурационный файл / |
| - | выполнения. Уровень выполнения (runlevel) - это такой режим работы | + | |
| - | системы, | + | В каждый момент времени система находится на одном из уровней выполнения. Уровень выполнения (runlevel) - это такой режим работы системы, |
| - | группы процессов. На каком уровне система находится в данный момент | + | |
| - | можно узнать с помощью команды who -r. Она также покажет каким был | + | |
| предыдущий отработавший уровень. | предыдущий отработавший уровень. | ||
| - | Разрешенные на каждом уровне процессы указаны в файле / | + | Разрешенные на каждом уровне процессы указаны в файле / |
| - | Демон init заведует переключением уровней, | + | |
| - | процессов на новом уровне и запуском предписанных. В ОС Linux | + | |
| определено 7 уровней выполнения: | определено 7 уровней выполнения: | ||
| 0 - Останов системы. | 0 - Останов системы. | ||
| Line 195: | Line 98: | ||
| 6 - Перезагрузка. | 6 - Перезагрузка. | ||
| - | init определяет уровни для выполнения по умолчанию исходя из настроек | + | init определяет уровни для выполнения по умолчанию исходя из настроек в / |
| - | в / | + | |
| - | Исходя из заданного уровня выполнения, | + | Исходя из заданного уровня выполнения, |
| - | соответствии с нижеприведёнными директориями: | + | |
| - Выполнение уровня 0 - / | - Выполнение уровня 0 - / | ||
| - Выполнение уровня 1 - / | - Выполнение уровня 1 - / | ||
| Line 214: | Line 115: | ||
| Не спрашивайте зачем все эти ссылки в каталоге /etc/. | Не спрашивайте зачем все эти ссылки в каталоге /etc/. | ||
| - | В каталоге / | + | В каталоге / |
| - | файлы, соответствующие какому-либо запускаемому демону. | + | |
| - | В каталогах / | + | В каталогах / |
| - | указывающие на какой-либо демон, находящийся в / | + | |
| - | последнем названном каталоге находятся вообще все демоны, | + | |
| - | на каком либо из уровней. Когда init' | + | |
| - | например, | + | |
| - | в / | + | |
| - | / | + | |
| - | Ссылки, | + | Ссылки, |
| - | те, которые начинаются с " | + | |
| - | идут номера, | + | |
| - | программ. | + | |
| - | Каждый из настоящих сценариев, | + | Каждый из настоящих сценариев, |
| - | запускает свой демон, а с аргументом stop останавливает ее. Какой | + | |
| - | аргумент будет ему передан, | + | |
| - | символической ссылки: | + | |
| - | Сначала выполняются все сценарии завершения работы демонов, | + | Сначала выполняются все сценарии завершения работы демонов, |
| - | соответствующие символическим ссылкам с буквой K - эти демоны могли | + | |
| - | быть запущены на другом уровне ранее - потом выполняются все сценарии | + | |
| - | запуска, | + | |
| - | Для наглядности сравните между собой каталоги / | + | Для наглядности сравните между собой каталоги / |
| - | / | + | |
| - | Термин «уровень выполнения» унаследован с тех времен, | + | Термин «уровень выполнения» унаследован с тех времен, |
| - | была обязана проходить уровни последовательно, | + | любом порядке. Для переключения на уровень n нужно от имени суперпользователя ввести команду |
| - | при загрузке и обратно при выключении. Сейчас их можно переключать в | + | |
| - | любом порядке. Для переключения на уровень n нужно от имени | + | |
| - | суперпользователя ввести команду | + | |
| # telinit n | # telinit n | ||
| - | Эта команда посылает соответствующий сигнал процессу init. Ее | + | Эта команда посылает соответствующий сигнал процессу init. Ее исполняемый файл представляет собой символическую ссылку на /sbin/init, так что вместо нее можно писать команду init, при этом не будет запущена копия процесса init: стартующий процесс первым делом проверяет свой PID и, если тот не равен 1 то он, просто передает сообщение настоящему процессу init. |
| - | исполняемый файл представляет собой символическую ссылку на | + | |
| - | /sbin/init, так что вместо нее можно писать команду init, при этом не | + | |
| - | будет запущена копия процесса init: стартующий процесс первым делом | + | |
| - | проверяет свой PID и, если тот не равен 1 то он, просто передает | + | |
| - | сообщение настоящему процессу init. | + | |
| - | Переключением уровней выполнения занимается не init как таковой | + | Переключением уровней выполнения занимается не init как таковой (/ |
| - | (/ | + | |
| - | Команда init (или telinit) n, где n - номер включаемого уровня, | + | Команда init (или telinit) n, где n - номер включаемого уровня, |
| - | запускает сценарий / | + | |
| - | выполняет в каталоге /etc/rcN.d сначала все стоп-сценарии, | + | |
| - | старт-сценарии. | + | |
| - | Запустив все процессы, | + | Запустив все процессы, |
| - | засыпает до получения сигнала: | + | |
| - о завершении дочернего процесса | - о завершении дочернего процесса | ||
| - об отключении питания | - об отключении питания | ||
| - требования переключить уровень выполнения. | - требования переключить уровень выполнения. | ||
| - | При получении какого-либо из них, init просыпается, | + | При получении какого-либо из них, init просыпается, |
| - | конфигурационный файл и, если нужно, выполняет записанные в нем | + | |
| - | инструкции. Чтобы заставить init перечитать измененный вами | + | |
| - | / | + | |
| # telinit q | # telinit q | ||
| - | Самое основное в этой части можно резюмировать следующим образом: | + | Самое основное в этой части можно резюмировать следующим образом: |
| - | чтобы обеспечить автоматический запуск какого-нибудь демона, | + | |
| - | создать сценарий для его запуска и поместить его в каталог | + | Выполнив все сценарии, |
| - | / | + | |
| - | /etc/rcN.d нужно создать символические ссылки на этот сценарий для его | + | |
| - | запуска и завершения. | + | |
| - | Выполнив все сценарии, | + | ====== |
| - | относящимся к текущему уровню. Обычно там остаются только | + | |
| - | перезапускаемые (respawn) действия. Мы их ещё рассмотрим | + | |
| - | . Инициализация системы считается законченной, | + | |
| - | перезапускаемые процесс и init остается только следить за ними. | + | |
| - | 8. Первая незакомментированная строка файла конфигурационного файла | + | Первая незакомментированная строка файла конфигурационного файла / |
| - | / | + | |
| - | в котором стартует система, | + | |
| - | иное. Эта строка выглядит как | + | |
| id: | id: | ||
| - | Обычно в качестве уровня по умолчанию выбирают 3 (полнофункциональный | + | Обычно в качестве уровня по умолчанию выбирают 3 (полнофункциональный многопользовательский текстовый режим) или графический 5 (запускается X Window и выдается графическое приглашение для входа в систему). Если оставить поле уровня пустым, |
| - | многопользовательский текстовый режим) или графический 5 (запускается | + | |
| - | X Window и выдается графическое приглашение для входа в систему). Если | + | |
| - | оставить поле уровня пустым, | + | |
| - | загрузки. Если указать в поле уровня несколько значений, | + | |
| - | наибольшее. Уровни 0 (останов) и 6 (перезагрузка) указывать нельзя. | + | |
linux_loading_process.1726666760.txt.gz · Last modified: 2024/09/18 13:39 by uf4n