Введение
Это статья для тех кто хотел чуть побольше узнать о Linux, но либо стеснялся спросить, либо пока не задумался. Начнем мы с самого большого разочарования — операционной системы Linux нет.
ОС Linux нет
Для начала давайте разберемся в терминологии и как работает компьютер. У нас есть программы. Их работу обеспечивает операционная система (ОС). Работу операционной системы обеспечивает ядро ОС. Вот такая матрешка: Ядро -> ОС -> Программы.
По большому секрету, с тем что “я поставлю себе Linux” есть большая терминологическая путаница. Верно говорить, например, “я поставлю себе Debian GNU/Linux”.
Дело в том, что Linux — это универсальное ядро ОС. Оно может работать с любой ОС совместимой с ним. Короче Linux — это только ядро.
Операционная система, к которой мы все привыкли и которая стоит на наших серверах и десктопах называется GNU. GNU совместим с ядром Linux и именно эта ОС идет в паре с этим ядром в большинстве дистрибутивов.
А что же такое дистрибутив? Дистрибутив — это готовый набор “Ядро+ОС+Программы”. Каждый дистрибутив — это просто хорошо собранный и отлаженный пазл из ядра Linux + ОС GNU + набора программ. Например Debian GNU/Linux.
Кстати тот же Debian есть в варианте с другим ядром, сборка имеет ключевое слово kfreebsd — это Debian GNU с ядром от FreeBSD.
В общем ОС Linux нет, есть ядро, классное красивое и универсальное. На этом ядре делают ОС для мейнфреймов (1 место в мире), для серверов (1 место в мире), десктопов (3 место в мире) и сетевого оборудования (например для домашних роутеров).
С чего все начинается?
Помимо того что у нас есть уже установленный Debian GNU/Linux, он должен как то запускаться. Вернее кто то должен его запускать. Вместе с Debian идет универсальный загрузчик ОС — GRUB. Grub может запускать не только Linux, но и любую ОС поддерживающую протокол multiboot — freebsd, netbsd, openbsd, любой Linux+GNU, а можно и без GNU. Помимо этого Grub может запустить MacOS и Windows без multiboot.
Так как же стартует наш компьютер с Linux?
Сперва запускается материнская плата и её встроенные программы. Они организуют доступ процессора к коду BIOS и запускают процессор (CPU). CPU начинает выполнять код BIOS.
Единственная задача BIOS в этом случае — найти и запустить загрузчик. Он находит загрузчик на одном из дисков. Вот то, что нашел BIOS — это не сам GRUB, это boot-загрузчик размером 512 байт. Он называется stage1. Этот маленький 512 байт загрузчик, единственное что делает — загружает GRUB с того же диска.
Ну вот GRUB загрузился и у нас на экране есть приветствие с выбором варианта загрузки ОС и обратный отсчет до загрузки в режиме “по умолчанию”. Мы ждем эти три секунды…
Далее GRUB делает следующее.
Он загружает в память ядро Linux и так называемый initramfs. initramfs — это минимальный образ системы GNU, необходимый для того, чтобы загрузить саму систему. В этом образе собраны драйвера для работы с железом и имеются настройки необходимые для запуска ОС.
Ядро и initramfs загружены и GRUB передает управление в точку входа в ядре. Ядро инициализируется. Запускает модули, находит и регистрирует оборудование, файловые системы, сетевые интерфейсы и прочее. Когда ядро завершит свою прелюдию — оно запускает /sbin/init из initramfs. Эта программа делает одну задачу — подготовку к запуску ОС — сборку RAID, LVM, монтирование файловых систем.
Когда /sbin/init сделал свое дело происходит магическая операция — Change Root. Ядро убивает загруженный в память образ initramfs и монтирует корневую файловую систему нашей ОС.
После, управление передается в /sbin/init уже из нашей “настоящей” системы. Он выполняет тоже только одну задачу — запускает программы из списка запуска.
Программы запускаются, настраивается сеть, запускается графическая оболочка.
Ну вот, наша ОС загружена.
Коротко, обо всех шагах загрузки GNU/Linux:
- BIOS — загружает boot-loader
- boot-loader 512 байт — загружает grub
- GRUB — загружает ядро и initramfs
- Ядро ищет и стартует оборудование
- initramfs (/sbin/init) готовит всё для запуска ОС
- Change Root на настоящую систему
- /sbin/init настоящей системы запускает программы
- Мы видим приветствие для входа в систему (одна из запущенных на шаге 7 программ, например gdm)
Зачем всё так сложно?
Да нет! Всё только кажется сложно — каждая отдельная часть проста и выполняет маленькую свою задачу, каждая часть простая как пробка. Не верите?
BIOS, который найдет диск и загрузит 512 байт в память прост. Если бы я знал спецификацию на мою материнскую плату я бы написал его за несколько часов.
boot-loader, который загружает GRUB просто до невозможного — он даже весит всего 512 байт. Я его писал несколько раз — поверьте 40 минут для этого хватит “за глаза”. Он очень прост.
GRUB единственное, что умеет — загружать ОС. Кстати GRUB внутри разбит на мелкие и простые кусочки.
Ядро — единственное, что умеет — работать с железом и файловыми системами. Оно кстати тоже внутри разбито на мелкие кусочки — модули. Каждый модуль — выполняет только свою задачу.
Initramfs — проста до безобразия — в ней только файлы с модулями ядра нужными для работы с железом и файловыми системами. И маленький /sbin/init, который написан на bash и просто собирает RAID так, как написано в конфиге, который тоже прост до безобразия.
Change Root — операция, которая написана в коде ядра Linux, выглядит магической, но поверьте — она проста до безобразия — грохнуть несколько страниц памяти и воспользоваться уже запущенными модулями, чтобы смонтировать корневую FS.
/sbin/init из настоящей системы? Да это просто цикл for, который пройдет по файлам из директорий /etc/rc*.d в нужном порядке и запустит каждый файл.
ОС не сложна. Сложны программы в ней. Сам GNU/Linux прост и прозрачен. Ядро максимально отделено от системы, загрузчик отделен от всего остального. Каждый делает свое маленькое дело и в результате получается гибкая и универсальная система. Это и есть пример правильной и красивой архитектуры ОС.
Ядро и модули
Ядро Linux — не монолит. Оно было бы слишком сложным, а никто этого не любит (м.б. кроме индусов из “некоторых компаний”). Оно разбито на модули. Каждый модуль умеет работать с чем то одним — с какой то одной железкой или файловой системой или еще чем то одним.
Я не раз писал модули ядра и это действительно просто, т.к. большую часть за тебя уже сделали и тебе просто нужно сделать “свою часть”.
И как я это всё себе установлю? Я не умею!
А ничего уметь и не надо. Установочная программа, того же Debian GNU/Linux сама найдет ваши диски и предложит настроить FS. Вообще настройка FS — это единственное что придется настроить при установке Linux. На эту FS и ваши диски она сама поставит GRUB и boot-loader, сама установит ОС и ядро, сама сделает образ initramfs.
В конце она предложит Вам поставить сразу готовые наборы программ, например для Desktop. Смело ставьте и у Вас будет уже готовый и настроенный компьютер для работы.
Как этим управлять то потом?
Это тоже не сложно. Обычному пользователю из управления системой нужно всего две команды:
apt-get install программа
apt-get remove программа
Debian GNU/Linux настолько прост в использовании, что Вам даже не придется искать нужный софт — всё уже нашли за Вас, дали название и положили в репозиторий.
Вы просто скажите ОС — “поставь мне chromium“ (apt-get install chromium) и через несколько секунд у Вас уже будет скачан и установлен Ваш любимый браузер.
Я хочу тоже писать Linux!
Linux — как ядро, GNU — как ОС, Debian — как дистрибутив — полностью открытое ПО. Каждый желающий может написать что то свое, отладить “на себе” или “на кошках” и отправить патч (или ныне модный pull-request) меинтейнерам. Они посмотрят Ваш код и идею и если это действительно нужная людям вещь — включат её в ядро, в ОС или дистрибутив (смотря что вы там написали).
Откуда истории о бубнах и ”сексе с Linux”
Таких историй масса и выражают они свое негодование. А причина негодования проста — я хочу настраивать (я же админ!), но не хочу читать документацию. Вообще в Linux и GNU всё стандартизировано и описано. Если вы, простите, извращенец и хотите запустить Linux на какой то странной файловой системе — прочитайте — умеет ли её GRUB. Вы поймете, сможет ли GRUB запустить вашу ОС (прочитать файл с ядром и initramfs). В той же документации прочитайте, возможно в GRUB нужно будет добавить специальный модуль для вашей “странной” FS.
Вторая причина бубнов — тоже не читают документацию, только к железу. Сейчас на рынке масса железа. Не всё железо поддерживается всеми ОС. Не верите? Windows работает везде? Поставьте Windows 7 на IBM System-Z, а я посмеюсь. Это беда некоторых производителей железа — отсутствие открытой документации и в следствие чего отсутствие драйверов. Сейчас Linux можно запустить на любом железе. Странности возникают с нестандартным (или очень редким оборудованием), обычно приобретаемом дополнительно от компьютера. Такие вещи как web-камеры или графические планшеты уже давно не проблема для Linux — почти все производители подобного оборудования либо сами написали драйвера, либо открыли документацию и это сделал разработчики Linux. Но всё же, прежде чем купить железку — убедитесь, что Linux с ней знаком.
Всё идеально? Но есть же сложности
Сложности есть — единственная сложность, которую до сих пор мне приходится обходить — форматы офисных документов. К сожалению MS, как монополист рынка офисного ПО пожелал не раскрывать эти форматы. Но я выхожу из ситуации легко — Google Docs, это даже удобнее чем MS Office.
Послесловие
Система GNU, ядро Linux и многочисленные дистрибутивы — просты. В этой статье мне удалось быстро и кратко рассказать об одной из основных задач системы — её загрузке. И вы поняли! Это говорит о том, что все не так сложно и не нужно этого боятся.
Удачи тебе, начинающий Linuxоид (а может и будущий разработчик этой прекрасного ядра и ОС GNU).
Автор: piromanlynx