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:48] – uf4n | linux_loading_process [2024/09/18 14:08] (current) – uf4n | ||
|---|---|---|---|
| Line 7: | Line 7: | ||
| ===== Master Boot Record ===== | ===== Master Boot Record ===== | ||
| - | 2. MBR находится на первом секторе загрузочного диска, её объём | + | MBR находится на первом секторе загрузочного диска, её объём |
| составляет 512 байт. Она состоит из трёх компонентов: | составляет 512 байт. Она состоит из трёх компонентов: | ||
| - Первичный загрузчик, | - Первичный загрузчик, | ||
| Line 43: | Line 43: | ||
| ====== GRUB ====== | ====== GRUB ====== | ||
| - | 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 153: | Line 98: | ||
| 6 - Перезагрузка. | 6 - Перезагрузка. | ||
| - | init определяет уровни для выполнения по умолчанию исходя из настроек | + | init определяет уровни для выполнения по умолчанию исходя из настроек в / |
| - | в / | + | |
| - | Исходя из заданного уровня выполнения, | + | Исходя из заданного уровня выполнения, |
| - | соответствии с нижеприведёнными директориями: | + | |
| - Выполнение уровня 0 - / | - Выполнение уровня 0 - / | ||
| - Выполнение уровня 1 - / | - Выполнение уровня 1 - / | ||
| Line 172: | 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.1726667313.txt.gz · Last modified: 2024/09/18 13:48 by uf4n