Linux, как мы знаем, — это ядро, а не полноценная операционная система, и он поставляется с различными дистрибутивами, такими как Debian, Fedora, Ubuntu и другими.
Ubuntu, разработанная Марком Шаттлвортом, является одним из самых популярных и широко используемых дистрибутивов в мире. Будучи бесплатной операционной системой с открытым исходным кодом, Ubuntu часто обновляется и ежегодно выпускается с участием тысяч разработчиков, которые вносят свой вклад в её развитие.
Но как Ubuntu работает внутри? Какие процессы и события управляют её работой и почему они важны? В этой статье подробно рассматривается внутренняя работа Ubuntu, что делает её доступной даже для новичков.
Схема системы Ubuntu
В основе работы Ubuntu лежит надёжная система процессов, которые управляют основными функциями, такими как управление питанием, загрузка и обработка сбоев системы. Каждая системная служба в Ubuntu рассматривается как процесс, и у каждого процесса есть файлы конфигурации, расположенные в каталоге /etc/init/
.
Эти файлы конфигурации определяют события, которые запускают старт и остановку процессов, превращая Ubuntu в систему, управляемую событиями.
init
(процесс с идентификатором 1). Это первый процесс, который запускается при включении системы и продолжает работать до её выключения.
Он играет важнейшую роль в управлении событиями запуска и завершения работы и является родительским процессом для всех остальных процессов. Он обеспечивает бесперебойную работу системы от загрузки до завершения работы.
Переход от Upstart к systemd
Ubuntu ранее использовала Upstart, систему инициализации на основе событий, которая в последний раз обновлялась до версии 1.13.2 в сентябре 2014 года. Однако Upstart была снята с производства и с тех пор не обновлялась.
Ubuntu отказалась от Upstart с выходом версии 15.04 (Vivid Vervet) в апреле 2014 года, заменив её systemd в качестве системы инициализации по умолчанию.
Systemd — это более продвинутая система инициализации, которая управляет процессами и службами иначе, чем Upstart, обеспечивая большую гибкость, распараллеливание и лучший контроль над службами.
Systemd также упрощает управление загрузкой и мониторинг служб, что делает его стандартной системой инициализации для большинства современных дистрибутивов Linux, включая Ubuntu.
Понимание процесса загрузки в Ubuntu (Systemd)
При загрузке системы init
запускается первым. Затем этот процесс запускает другие процессы в иерархическом порядке. В типичной системе Ubuntu с systemd последовательность загрузки состоит из ряда шагов и событий, которые запускают службы.
Вот разбивка иерархии загрузки:
- Init (PID 1): первый процесс, запускаемый при загрузке. Он настраивает среду для остальной части системы и запускает события.
- systemd: после инициализации systemd становится основным процессом инициализации, который отвечает за запуск всех остальных системных служб (называемых units). Эти модули определяются в файлах модулей, расположенных в
/etc/systemd/system
и/lib/systemd/system
. - Загрузка служб: systemd начинает процесс загрузки служб. Он запускает базовые службы, такие как монтирование файловых систем, загрузка модулей ядра, настройка сетевых подключений и многое другое.
- Монтирование файловых систем: такие службы, как
mountall
отвечают за монтирование локальных и удалённых файловых систем в процессе загрузки. systemd обрабатывает события, которые сообщают другим службам, когда можно продолжить работу. - Диспетчер отображения: после настройки основных системных служб запускается диспетчер отображения (например,
gdm
илиlightdm
), который позволяет пользователям входить в систему. - Инициализация сеанса пользователя: после входа в систему запускается сеанс пользователя, который включает в себя загрузку настроек среды, запуск графического пользовательского интерфейса и запуск процессов, относящихся к пользователю.
Ключевые цели и события systemd
- Целевое значение по умолчанию:
default.target
— это конечное состояние, в которое система переходит после завершения загрузки. Обычно оно равноgraphical.target
, что запускает пользовательский интерфейс. - Многопользовательская цель: эта цель используется для запуска неграфических многопользовательских сред, обычно устанавливается на
multi-user.target
. - Целевая задача для восстановления: в ситуациях, требующих минимальной работы системы,
rescue.target
обеспечивает однопользовательский режим для устранения проблем с системой.
Управление процессами и событиями
В Ubuntu каждая системная служба или процесс связаны с событиями. Например, systemd и другие менеджеры служб используют файлы конфигурации, в которых указываются условия запуска и остановки служб. Эти условия определяют, когда должен запускаться процесс в зависимости от системных событий (например, при запуске системы или при монтировании определённого файла).
В модели, управляемой событиями Ubuntu, есть два типа процессов:
- Кратковременные процессы (задания, выполняемые до завершения): эти процессы выполняются, а затем завершаются после выполнения своих задач. Примеры: монтирование файловых систем или загрузка модулей ядра.
- Долгоживущие процессы (работающие постоянно): эти процессы сохраняются на протяжении всего времени работы системы, управляя основными службами, такими как сетевое взаимодействие, ведение журналов и пользовательские сеансы.
Службы или модули запускаются событиями и определяются файлами модулей, в которых указываются события, запускающие и останавливающие службу.
Каждый процесс или служба, которыми управляет systemd, определяется как единица, и единицы могут быть разных типов, например:
- Сервисные модули (
.service
), которые определяют службы, которыми управляет systemd. - Блоки сокетов (
.socket
), которые определяют конечные точки связи. - Целевые блоки (
.target
), которые определяют группу сервисов для конкретной цели или этапа процесса загрузки.
Иерархия процессов systemd
С внедрением systemd процессы в Ubuntu организованы иерархически, и для корректной работы каждой службы требуется другая служба. Менеджер служб systemd отвечает за создание и управление этими зависимостями с помощью файлов модулей, которые определяют порядок запуска служб.
Иерархию можно визуализировать следующим образом:
Systemd (PID 1) -> Essential Services (e.g., mounting, kernel modules) -> Display Manager -> User Session
Ключевые службы и события в процессе загрузки
- hostname: устанавливает имя_хоста системы, которое настраивается в
/etc/hostname
. - kmod: загружает модули ядра, как определено в
/etc/modules
. - mountall: монтирует все локальные и удаленные файловые системы, включая
/proc
и/sys
. - plymouth: отображает заставку во время загрузки, предоставляя пользователю визуальную обратную связь.
При необходимости во время загрузки запускаются другие ключевые процессы, такие как dbus
(для межпроцессного взаимодействия), network-manager
(для настройки сети) и udev (для управления устройствами).
Заключение
Процесс загрузки Ubuntu значительно изменился за прошедшие годы. В то время как более ранние версии использовали Upstart, современные версии Ubuntu (начиная с 15.04) используют systemd в качестве системы инициализации по умолчанию.
systemd предлагает множество улучшений, в том числе более эффективную параллелизацию, упрощённое управление службами и большую гибкость. Понимание того, как работает systemd в Ubuntu, крайне важно для всех, кто хочет разобраться во внутренней работе операционной системы, управлять службами или устранять проблемы, связанные с загрузкой.
Разобравшись с ключевыми понятиями systemd, целями и событиями, вы сможете гораздо лучше понять, как Ubuntu работает во время загрузки и после неё.