
- •Ответы на экзаменационные вопросы по соСиА
- •Классификация операционных систем
- •Обобщенная структура операционных систем
- •Сравнение моделей osi и tcp/ip
- •Сравнение моделей atm и tcp/ip
- •Модель клиент-сервер на базе микроядра
- •Сетевое по: иерархия протоколов, разработка уровней
- •Настройка сети
- •Службы, примитивы и протоколы
- •Распределенные системы: доступ, прозрачность
- •Прозрачность в распределенных системах.
- •Доступ в распределенных системах
- •Методы управления доступом
- •Распределенные системы: масштабируемость, открытость
- •Открытость
- •Масштабируемость
- •Концепции аппаратных решений
- •Гомогенные и гетерогенные сети
- •Концепции программных решений, сравнение систем
- •Мультипроцессорные ос
- •Мультикомпьютерные ос
- •Системы с распределенной разделяемой памятью
- •Программное обеспечение промежуточного уровня
- •Разделение приложений по уровням
- •Архитектура клиент-сервер: многозвенные архитектуры
- •Структура файловой системы: принципы и особенности
- •Структура файловой системы: стандарт fhs
- •Структура файловой системы: принципы организации данных на диске
- •Структура файловой системы: монтирование и размонтирование
- •Структура файловой системы: журналирование
- •Структура файловой системы: принципы создания стартового виртуального диска
- •Досистемная загрузка: первичный и вторичный загрузчик
- •Досистемная загрузка: загрузчики lilo и grub
- •Загрузка системы: первый процесс init
- •Загрузка системы: стартовый виртуальный диск и модули ядра
- •Загрузка системы: демоны системных служб
- •Загрузка системы: схема «.D»
- •Загрузка системы: уровни выполнения
- •Работа с внешними устройствами: файлы-дырки, драйверы
- •Разметка диска и наименование устройств
- •Область подкачки
- •Проектирование свойств системы
- •Профиль системы
- •Управление пакетами
- •Установщики пакетов
- •Сетевые и серверные возможности
Загрузка системы: первый процесс init
С запуска init начинается загрузка самой системы. Если ядро содержало подпрограммы для работы со всеми необходимыми устройствами (т. н. «драйверы»), оно загружалось и запускало init. Если ядру недоставало каких-то важных драйверов (например, поддержки дискового массива, с которого и шла загрузка) — не загружалось и не запускало. Из положения выходили просто: в ядро старались включить как можно больше драйверов. Такое ядро называлось базовым (generic), и имело довольно внушительный размер. Загрузивши систему с базовым ядром, администратор обычно пересобирал его: убирал из специального файла-профиля драйверы всех отстутсвующих в системе устройств, быть может, добавлял новые (те, что не нужны для загрузки, но нужны для работы, например, звуковые), и компилировал из исходных текстов новое, профильное ядро.
Отец всех процессов
Если в параметрах не сказано иного, ядро считает, что init называется /sbin/init. В стартовом виртуальном диске это обычно некоторый простейший сценарий, а в полноценной системе у init другая задача: он запускает все процессы. Если не он сам, то его потомки, так что все процессы Linux, кроме ядерных, происходят от init.
Первым делом init разбирает собственный конфигурационный файл — /etc/inittab. Файл этот имеет довольно простую структуру: каждая строка (если она не комментарий) имеет вид «id: уровни: действие: процесс», где id — это некоторая двух- или однобуквенная метка, уровни — это слово, каждая буква которого соответствует уровню выполнения, (об уровнях выполнения будет рассказано далее), действие — это способ запуска процесса. Например, запись 4:2345:respawn:/sbin/mingetty tty4 означает, что меткой «4» помечен запуск /sbin/mingetty tty46 на уровнях выполнения 2, 3, 4 и 5 по алгоритму «respawn» (запустить в фоне, а когда процесс завершится, запустить заново). Помимо «respawn» существуют методы «once» (запустить в фоне однократно), «wait» (запустить интерактивно, при этом никаких других действий не выполняется, пока процесс не завершится) и множество других, включая даже «ctrlaltdel» — процесс, запускаемый, когда пользователь нажимает на консоли Ctrl+Alt+Del7.
getty ведёт себя так непохоже на остальные процессы: не просто запускает из-под себя login, а дожидается окончания его работы, отсутствуя при этом в таблице процессов. На самом деле дожидается не getty, а init, используя метод «respawn»: порождается (в фоне) процесс getty с определённым PID, а init бездействует до тех пор, пока существует процесс с этим PID getty, login, стартовый командный интерпретатор или программа, запущенная из него с помощью exec); когда же процесс, наконец, умирает, порождается новый getty.
Загрузка системы: стартовый виртуальный диск и модули ядра
Модуль ядра — это часть ядра Linux, которую можно добавлять и удалять во время работы системы. Модуль ядра — не процесс, он работает в режиме супервизора и в таблице процессов не регистрируется: это набор подпрограмм для работы с определённым устройством, которые добавляются к возможностям ядра5. При загрузке в память модуль компонуется с ядром, образуя с ним одно целое. Просмотреть список загруженных модулей можно командой lsmod, а подгрузить модуль в память, добавив его к ядру, и удалить его оттуда — командами insmod и rmmod соответственно.
модуль ядра
Необязательная часть ядра, расширяющая его функциональность. Модуль можно загрузить в память или удалить оттуда в процессе работы системы.
Подсистема загрузки GRUB умеет разбираться в файловых системах и даже подключать модули к ядру, однако для того, чтобы сделать процесс загрузки более или менее универсальным, пришлось бы обучить GRUB всем видам логики RAID, и всем способам подключения модулей. И то, и другое постоянно изменяется, и успевать за этими изменениями означает поддерживать собственную, параллельную Linux, дисковую подсистему.
Вдумаемся. Для того, чтобы средствами Linux подключить модуль ядра, работающий с дисковым устройством, необходимо загрузить Linux с этого же устройства. Так ли это невозможно? Ведь если можно прочесть оттуда «ядро», то, наверное, можно прочесть и «Linux»? Более точно, вдобавок к одной области данных, соответствущей ядру, надо прочитать вторую, соответствующую некоторой уменьшенной до предела установке Linux, в которой содержатся только нужные программы и модули, загрузить оттуда «маленький Linux», который настроит и подключит злополучный RAID и запустит процесс загрузки полноценной системы оттуда.
стартовый виртуальный диск
Минимальный набор программ и модулей Linux, необходимый для обеспечения загрузки системы. Представляет собой виртуальную файловую систему в оперативной памяти. Загружается вторичным загрузчиеом вместе с ядром.
Предельно сжатый вариант Linux есть, это проект busybox, используемый во встроенных системах, где дорог каждый байт. Разместить файловую систему в памяти тоже легко, этим, например, занимается модуль tmpfs, который можно включить в базовое ядро (подробнее о типах файловых систем рассказано в лекции Работа с внешними устройствами). Осталось только обучить подсистемы загрузки GRUB и LILO считывать не одну, а две области данных — ядро и образ файловой системы. Ядру при этом передаётся параметр «пользуйся виртуальным диском», чтобы оно подключило загруженный образ в качестве временной корневой файловой системы. Можно также потребовать, чтобы память, занимаемая временной файловой системой, освобождалась в процессе дальнейшей загрузки.
Такой механизм называется initrd (initial ram ddisk, где «ram» — это не «баран», а random access memory, то есть оперативная память) или стартовым виртуальным диском. Стартовый виртуальный диск собирается по команде mkinitrd в соответствии с профилем компьютера, и записывается на диск по тем же правилам, что и ядро.