Модуль 16. Работа с подсистемой печати

Введение

Из этого модуля вы узнаете, почему служба печати в Linux называется CUPS и причем здесь Стив Джобс. Мы посмотрим, из каких компонентов она состоит и как они взаимодействуют между собой, познакомимся с основными настройками и сценариями ее использования, не выходя за рамки рабочих станций. Ну, что… разрыв строки, возврат каретки, погнали!

Служба печати в Linux

Как известно, после внедрения электронного документооборота сотрудники меньше печатать не стали, поэтому хотим мы того или нет, а со службой печати в Linux придется разбираться.

В операционной системе Astra Linux подсистема печати реализована на базе CUPS от англ. Common UNIX Printing System — общая система печати для UNIX. Разработчики этого продукта хотели создать универсальный кроссплатформенный инструмент с модульной архитектурой, которая бы упростила разработку драйверов для принтеров, и, учитывая тот факт, что CUPS принят сейчас большинством современных дистрибутивов Linux, можно сказать, что у них все удалось.

Первый релиз CUPS вышел в конце 90-х и за несколько лет был принят сразу несколькими nix-подобными дистрибутивами, включая Mac OS X. На первое время компании Apple удалось согласовать с разработчиками ряд оговорок в лицензионном соглашении, которые позволили использовать этот продукт в коммерческой операционной системе, но в дальнейшем они договорились о расширении сотрудничества, и в 2007 году Стив Джобс не только презентовал свой первый iPhone, но и приобрел права на исходные коды CUPS.

Более десяти лет продукт развивался под зонтиком Apple, по причине чего вы будете довольно часто встречать упоминания о компании в документации, но с 2020 года отделился под новым брендом OpenPrinting. В наши дни Apple CUPS — это версия, которая поставляется с macOS/iOS, а ветку OpenPrinting CUPS продолжают развивать для всех остальных nix-подобных операционных систем.

Архитектура CUPS

Службы печати для Linux и Windows развивались независимо, поэтому нельзя сказать, что они напрямую заимствовали идеи друг у друга, но обе этих разработки опирались на идеи предшествующих решений, поэтому во многом похожи. Если смотреть крупноблочно, то CUPS состоит из следующих компонентов, см. рис. 88:

  • Диспетчер печати. В роли диспетчера выступает служба cupsd. Она упорядочивает задания для отправки на печать и выполняет те же функции, что и Print Spooler в операционной системе Windows.

    Однако, если в Windows приложения взаимодействуют с диспетчером печати по API Win32, то в Linux вместо программных интерфейсов выступает сетевой протокол IPP (Internet Printing Protocol), который расширяет возможности привычного протокола HTTP для организации взаимодействия с принтерами.

    Локальные приложения обращаются к диспетчеру печати напрямую через unix-сокет /run/cups/cups.sock, не используя сетевой стек, а при обращении к общим принтерам компьютера извне используется порт 631/TCP или 443/TCP (в случае SSL).

  • Система фильтров. Каждый фильтр представляет собой приложение для преобразования направленных на печать данных в понятный для принтера набор простых инструкций. Кроме фильтров общего назначения существуют специальные фильтры, учитывающие особенности конкретной модели устройства, которые распространяются через специальные драйверы CUPS.

    Если у старых матричных принтеров набор инструкций включал всего несколько команд, таких как «напечатать строку, сделать разрыв и перевести каретку», то в современных принтерах используют язык описания страниц PostScript, который поддерживает настолько большой набор инструкций, что сопоставим по сложности с языками программирования высокого уровня. К счастью, обычным администраторам знать этот язык не требуется, и он остается уделом разработчиков драйверов.

    Если же вы станете счастливым обладателем устройства, которое не поддерживает набор инструкций PostScript, то в этом случае CUPS автоматически задействует универсальный фильтр Ghostscript, который преобразует инструкции PostScript в растровое изображение и отправит уже его на печать.

  • Система передачи данных или бэкенд. Этот компонент отвечает за доставку данных до конкретного принтера, подключенного к устройству напрямую через USB (а может быть даже COM/LPT) или по сети. Если принтер использует нестандартный способ передачи данных, то соответствующий программный код этого бэкенда может быть установлен через специальный драйвер CUPS.

../_images/alse_mod16_image4.png

рис. 88 Упрощенная схема печати из локального приложения

Следует понимать, что CUPS работает как клиент-серверное приложение даже при его использовании на рабочей станции. В этом случае клиентами выступают локальные приложения, которые обращаются к службе по локальному unix-сокету. Предлагаем подробнее разобрать работу CUPS на примере распечатки документа из LibreOffice.

Диспетчер печати

После того как мы в приложении LibreOffice нажали кнопку Печать, приложение подключается к сокету /run/cups/cups.sock и передает диспетчеру печати документ по протоколу IPP (HTTP).

Диспетчер печати — это серверное приложение cupsd, которое получает запросы по протоколу IPP и позволяет управлять принтерами, заданиями и другими сущностями системы печати. Протокол IPP использует POST-запросы протокола HTTP с типом контента «application/ipp» для расширения возможностей этого сетевого протокола прикладного уровня.

Диспетчер печати разработан как стандартный однопоточный серверный процесс. Он запускает внешние процессы для выполнения длительных операций, таких как печать документов, отправка уведомлений, сканирование устройств и драйверов, а также удалённый мониторинг принтеров. Служба работает от root, а внешние процессы выполняются из-под учётной записи lp с ограниченными правами доступа.

Максимальное количество одновременно поддерживаемых клиентов и заданий печати ограничивается только возможностями процессора, доступной оперативной памятью и свободными файловыми дескрипторами на сервере. Сам планировщик не накладывает каких-либо ограничений.

Все документы, которые отправляются на печать, в конечном итоге поступают к планировщику по протоколу IPP. Локальные приложения делают это через unix-сокет, а для внешних клиентов может быть открыт порт 631/TCP. При необходимости можно настроить безопасное подключение к службе CUPS по порту 443/TCP. Задания на печать, созданные планировщиком, проходят через фильтры и мониторы портов. Затем они преобразуются в подготовленные данные для печати и отправляются на принтеры или другие устройства. В обратном направлении передаются сведения о состоянии этих заданий.

Система фильтров

Для преобразования исходного файла задания в набор инструкций PostScript, понятный для принтера, используются так называемые фильтры. Фильтр считывает данные из стандартного ввода (или из файла, если он указан), выполняет обработку и передает дальше по цепочке через стандартный вывод. Дополнительные фильтры создаются разработчиками драйверов печатающих устройств и реализуют стандартный набор параметров, в том числе: имя принтера, идентификатор задания, имя пользователя, название задания, количество копий и другие параметры заданий.

В CUPS присутствуют фильтры для печати текста, PDF, HP-GL/2 и многих типов файлов изображений. CUPS также предоставляет фильтры драйверов принтеров для HP-PCL, ESC/P и для нескольких типов принтеров этикеток. Дополнительные фильтры регистрируются при установке драйверов через файлы mime.convs и PPD по следующим путям соответственно: /usr/share/cups/mime/mime.convs и /etc/cups/ppd/.

В рамках фильтров отдельно выделяют так называемые мониторы портов, но этот термин будет правильнее перевести как наставники портов. Эти специальные фильтры позволяют выполнить дополнительное форматирование данных для передачи конкретному устройству печати по конкретному каналу связи. По умолчанию доступно два фильтра:

  • монитор порта bcp, который поддерживает протокол двоичной связи PostScript (англ. Binary Communications Protocol, BCP).

  • монитор порта tbcp, который поддерживает протокол двоичной связи с тегами PostScript (англ. Tagged Binary Communications Protocol, TBCP).

Установка драйверов CUPS обычно выполняется с помощью стандартного пакетного менеджера APT, например, для управления устройствами Hewlett Packard предназначен пакет hplip. Некоторые драйвера, например, для принтеров Canon устанавливаются с помощью инсталляционных Bash-скриптов, см. страницу на wiki.astralinux.ru.

Система передачи данных (бэкенды)

Набор инструкций для принтера готов, осталось только передать их на принтер с учетом того, как он подключен к службе печати. И здесь в игру вступает бэкенд.

Бэкенд (как фильтры) получает информацию через входящий поток данных и передает их принтеру по установленному протоколу. Дополнительные типы бэкендов могут быть добавлены по мере необходимости через установку драйверов, а по умолчанию доступны:

  • USB — подключение принтера через USB-порт.

  • IPP (Internet Printing Protocol) — стандартный протокол для обмена данными между клиентом и сервером печати.

  • AppSocket (JetDirect) — обеспечивает связь между приложением и устройством печати через порт 9100/TCP.

  • DNS-SD (mDNS) и SNMP — механизмы обнаружения и управления принтерами в сети с использованием протоколов Zeroconf и Simple Network Management Protocol соответственно.

  • LPD (Line Printer Daemon) — устаревший протокол печати.

В конечном счете наш документ попал на принтер и был распечатан, проделав большой путь от текста в приложении до текста на бумаге. Уточним несколько промежуточных этапов.

Файлы конфигураций

Диспетчер печати в своей работе использует настройки из конфигурационных файлов, которые находятся в каталоге /etc/cups/:

  • Файл cupsd.conf – здесь хранятся основные настройки CUPS, например, какой порт прослушивается, уровень логирования, включена ли ротация логов и т.д.

  • Файл classes.conf – группы (классов) принтеров. Группы принтеров используются для объединения нескольких принтеров в пул устройств, которые будут обслуживать одну очередь заданий печати. При отправке печати на группу принтеров CUPS начнет балансировать нагрузку (чередование принтеров), поэтому новое задание печати будет отправляться на следующий свободный принтер в группе.

  • Файл printers.conf – настройки установленных принтеров.

  • Файл subscriptions.conf – настройки используемых подписок.

Файлы заданий

Получив документы для распечатки, диспетчер печати не сразу передает их на вход фильтрам, а создает сначала задание в каталоге /var/spool/cups, что обеспечивает надежную работу диспетчера печати даже при сбоях. Файлы заданий бывают двух типов:

  • Управляющие файлы — это сообщения IPP, основанные на исходных сообщениях IPP «Print-Job» или «Create-Job». Они начинаются с буквы «c» («c00001», «c99999», «c100000» и так далее).

  • Файлы данных — это исходные файлы документов, отправленные на печать. Они начинаются с буквы «d» («d00001-001», «d99999-001», «d100000-001» и так далее).

Для каждого задания, известного системе, существует один управляющий файл и ноль или более файлов данных. Управляющие файлы обычно удаляются после отправки 500-го задания, а файлы данных удаляются сразу после успешной печати задания.

Файлы журналов

В случае каких-либо проблем очень помогают файлы журналов CUPS. Планировщик хранит три типа файлов журналов в каталоге /var/log/cups:

  • В файле access_log перечислены все запросы HTTP и IPP, обработанные диспетчером.

  • В файле error_log содержатся сообщения диспетчера и сопутствующих приложений. Этот файл можно использовать для выявления проблем.

  • А в page_log перечисляются все распечатанные страницы, что может пригодиться для учета расходов.

Файлы журналов автоматически меняются планировщиком, когда они достигают установленного ограничениями размера. Если параметру MaxLogSize задано значение 0 (как в Astra Linux по умолчанию), то ротация в планировщике не выполняется. В Astra Linux для централизованной ротации журналов используется утилита logrotate, с которой мы познакомимся в Модуль 21. Работа с журналами и отладка системы.

localadmin@astra:~$ sudo ls /var/log/cups
access_log       access_log.4.gz  error_log       error_log.4.gz
access_log.1     access_log.5.gz  error_log.1     error_log.5.gz
access_log.2.gz  access_log.6.gz  error_log.2.gz  error_log.6.gz
access_log.3.gz  access_log.7.gz  error_log.3.gz  error_log.7.gz

По умолчанию файл page_log вестись не будет. Чтобы включить эту опцию, нужно в файл настроек CUPS /etc/cups/cupsd.conf к параметру PageLogFormat добавить следующее значение:

PageLogFormat %p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}

После внесения изменений в конфигурационный файл можно выполнить проверку. Для этого необходимо выполнить следующую команду:

localadmin@astra:~$ sudo cupsd -t

И перезапустить CUPS:

localadmin@astra:~$ sudo systemctl restart cups

На рисунке рис. 89 приведена более подробная схема взаимодействия компонентов CUPS, включая файлы конфигурации, заданий и журналов.

../_images/alse_mod16_image5.jpg

рис. 89 Компоненты CUPS и их взаимодействие

Веб-интерфейс

Для управления CUPS в каждом дистрибутиве Linux есть свои десктопные утилиты, которые взаимодействуют с подсистемой напрямую по протоколу IPP. Однако CUPS предлагает и универсальный веб-интерфейс, который будет выглядеть одинаково на всех платформах. На обычных рабочих станциях веб-интерфейс доступен по адресу http://localhost:631, а на принт-серверах его обычно открывают с использованием защищенного соединения по 443 порту (https).

../_images/alse_mod16_image6.png

рис. 90 Веб-интерфейс для управления CUPS

Веб-интерфейс управления CUPS реализован в виде нескольких CGI-приложений, которые расположены в папке /usr/lib/cups/cgi-bin/. Если обратите внимание, то каждая программа соответствует вкладке в браузере на странице CUPS:

Программа

Страница

Описание

admin.cgi

/admin

Содержит все инструменты для администрирования cupsd

classes.cgi

/classes

Управление группами (классами) принтеров и их список

help.cgi

/help

Доступ к онлайн документации (на английском языке)

jobs.cgi

/jobs

Управление заданиями и их список

printers.cgi

/printers

Управление принтерами и их список

Поддержка LPD

Протокол LPD (англ. CUPS Line Printer Daemon, LPD) уже давно устарел, поэтому в Astra Linux cups-lpd и inetd по умолчанию не устанавливаются. Но в других системах линукс вы можете обнаружить, что cups-lpd действует в связке со службой inetd, которая прослушивает порт 515/TCP и передает входящие LPD-запросы.

Управление CUPS

Способы управления CUPS

Управлять cupsd можно несколькими способами:

  • Изменением настроек конфигурационного файла /etc/cups/cupsd.conf.

  • Через веб-интерфейс, доступный (по умолчанию) по адресу http://localhost:631.

  • C помощью консольных команд, например, sudo lpinfo -v – выводит список всех устройств.

  • С помощью графической оснастки «Принтеры» (fly-admin-printer). В других Linux системах используются альтернативные приложения.

Управление с помощью графического приложения «Принтеры»

Графическую оснастку «Принтеры» для управления печатающими устройствами можно запустить из терминала командой fly-admin-printer или через меню Пуск ‣ Системные ‣ Принтеры. У приложения простой интуитивно понятный интерфейс, к которому не требуется мануал на 1000 страниц, но дополнительную информацию вы все же можете получить клавишей F1.

По следующим скриншотам вы можете увидеть, что управление печатью в Linux может быть не многим сложнее, чем в Windows. Технические подробности доступных настроек рассмотрим в следующих разделах.

../_images/alse_mod16_image7.png

рис. 91 Интерфейс графической оснастки «Принтеры»

../_images/alse_mod16_image8.png

рис. 92 Настройка сервера CUPS Сервер ‣ Настроить…

../_images/alse_mod16_image9.png

рис. 93 Меню управления принтерами

Управление через веб-интерфейс

Веб-интерфейс доступен по адресу http://localhost:631 и предоставляет унифицированный доступ для любых Linux-систем вне зависимости от того, какие графические оснастки для них разработаны.

В разделе «Сервер» можно задать некоторые параметры или перейти к прямому редактированию конфигурационного файла /etc/cups/cupsd.conf.

../_images/alse_mod16_image10.png

рис. 94 Страница администрирования веб-портала CUPS

../_images/alse_mod16_image11.png

рис. 95 Страница редактирования конфигурационного файла cupsd.conf

Добавление принтера, создание группы – все эти действия интуитивно понятны и не требуют уточнения. Технические подробности доступных настроек рассмотрим в следующих разделах.

Управление через параметры конфигурационного файла

Настройки CUPS могут быть выполнены через конфигурационный файл /etc/cups/cupsd.conf. Чтение конфигурации производится сервером cupsd только в момент запуска, поэтому для вступления изменений в силу необходимо перезапустить демон cupsd командой sudo systemctl restart cups.service.

localadmin@astra:~$ sudo systemctl restart cups.service

Опция «Listen»

По умолчанию на рабочих станциях служба cups слушает входящие подключения только на localhost. Проверить это можно командой sudo netstat -plutn | grep cupsd.

localadmin@astra:~$ sudo netstat -plutn | grep cupsd
tcp       0     0 127.0.0.1:631          0.0.0.0:*              LISTEN      3468/cupsd
tcp6      0     0 ::1:631                :::*                   LISTEN      3468/cupsd

Так как в этом модуле мы ведем речь в основном только о локальной печати, т.е. о локальном диспетчере печати, то прослушивание только localhost будет достаточным решением.

Но если вы захотите открыть доступ к локальному принтеру, как в Windows, то нужно:

  1. Удалить или закомментировать строку «Listen localhost:631».

  2. Добавить строку «Port 631» после строки «Listen /run/cups/cups.sock».

  3. После строки комментария «# Only listen for connections from the local machine» можно добавить необходимые адреса/подсети, которые будут иметь доступ к cups.

#Listen localhost:631
Listen /run/cups/cups.sock
Port 631

Опция «Browsing»

Обнаружение сетевых и общих (англ. shared) принтеров управляется через опцию: «Browsing No». Если опция включена («On»), то компьютеры в сети будут видеть список всех принтеров, подключенных к серверу печати (что не очень удобно, если парк принтеров большой). Принцип работы заключается в рассылке широковещательных пакетов через avahi (кстати, именно поэтому мы не рекомендуем использовать доменную зону .local).

Каждый широковещательный пакет описывает один общий принтер или группу принтеров. Любая другая система CUPS в подсети (клиенты) получит широковещательную рассылку и сделает этот принтер доступным для локальных пользователей. Если клиент перестает получать широковещательные сообщения от сервера или если сервер отправляет специальное широковещательное сообщение «deleted», клиент удалит свою копию принтера.

Опция «DefaultAuthType»

Опция «DefaultAuthType Basic» определяет права доступа к веб-интерфейсу CUPS. Чтобы определенный пользователь имел доступ к администрированию CUPS, его нужно добавить в группу «lpadmin»: sudo usermod -aG lpadmin <имя_пользователя>. Группа «lpadmin» является группой по умолчанию для предоставления административного доступа, и ее можно поменять на любую другую. Для этого в файле /etc/cups/cups-files.conf в опции «SystemGroup» через пробел добавьте свою группу и перезапустите службу CUPS.

Разделы «Location»

Далее в файле идут разделы «Location», что актуально только при настройке общего доступа к принтерам для других компьютеров в сети.

# Restrict access to the server...
<Location />
 Order allow,deny
</Location>

# Restrict access to the admin pages...
<Location /admin>
 Order allow,deny
</Location>
. . .

Первый параметр «Order allow,deny» ограничивает все подключения, если они не разрешены явно. Ниже нужно добавить адреса, подсети, хосты которым разрешен доступ к серверу печати:

Allow from 10.1.10.*

Allow from localhost

Allow from printserver

Allow from 172.16.20.1

Управление через консольные команды

Установка/удаление виртуального принтера

Управление принтерами через консольные команды требуется только в заданиях автоматизации, но они помогут нам наиболее полно раскрыть механизмы работы CUPS. В случае если у вас не будет физического принтера, то для тестов достаточно будет установить пакет printer-driver-cups-pdf, который создаст виртуальный PDF-принтер:

localadmin@astra:~$ sudo apt install printer-driver-cups-pdf

Этот пакет установит нам принтер с именем PDF, убедимся в этом:

localadmin@astra:~$ lpstat -t
планировщик запущен
назначение системы по умолчанию: PDF
устройство для PDF: cups-pdf:/
PDF принимает запросы с момента Пн 27 мая 2024 15:28:07
принтер PDF свободен. Включен с момента Пн 27 мая 2024 15:28:07

Давайте создадим еще один PDF-принтер, чтобы иметь возможность объединить принтеры в группу (пул принтеров):

localadmin@astra:~$ sudo lpadmin -p ONE-MORE-PDF -v cups-pdf:/ -E -i /usr/share/ppd/cups-pdf/CUPS-PDF_noopt.ppd

Утилита lpadmin управляет принтерами и их настройками в Linux. Мы использовали следующие ключи:

  • Ключ -p — указывает имя создаваемого принтера. В данном случае — «ONE-MORE-PDF».

  • Ключ -v — указывает бэкенд CUPS для нового принтера. В данном случае — «cups-pdf».

  • Ключ -E — если ключ указан после ключа -p, то разрешает принтеру принимать задания.

  • Ключ -i — указывает путь к файлу PPD для нового принтера. В данном случае — /usr/share/ppd/cups-pdf/CUPS-PDF_noopt.ppd. Этот файл содержит параметры и настройки для работы принтера. Он был установлен пакетом printer-driver-cups-pdf.

Убедимся, что наш новый принтер появился в системе:

localadmin@astra:~$ lpstat -p
принтер ONE-MORE-PDF свободен. Включен с момента Пн 27 мая 2024 15:53:06
принтер PDF свободен. Включен с момента Пн 27 мая 2024 15:28:07

Для удаления группы принтеров достаточно воспользоваться ключом -x утилиты lpadmin:

localadmin@astra-ald:~$ sudo lpadmin -x ONE-MORE-PDF
localadmin@astra-ald:~$ sudo lpadmin -x PDF

Создание/удаление группы принтеров

Следующая команда создаст группу принтеров по имени «PDF_Printer_Group» и поместит в неё принтер PDF:

localadmin@astra:~$ sudo lpadmin -p PDF -c PDF_Printer_Group

Поместим в эту группу второй созданный нами принтер «ONE-MORE-PDF»:

localadmin@astra:~$ sudo lpadmin -p ONE-MORE-PDF -c PDF_Printer_Group

Проверим, что группа действительно содержит оба наших принтера:

localadmin@astra:~$ lpstat -c PDF_Printer_Group
члены группы PDF_Printer_Group:
        PDF
        ONE-MORE-PDF

Сделаем группу общедоступной и разрешим ей принимать задания на печать:

localadmin@astra-ald:~$ sudo lpadmin -p PDF_Printer_Group -o printer-is-shared=true -E

Группа принтеров удаляется так же, как обычный принтер, ключом -x утилиты lpadmin:

localadmin@astra-ald:~$ sudo lpadmin -x PDF_Printer_Group

Печать заданий

Отправим файл .profile на печать из командной строки (из PowerShell мы такое не делали чуть чаще, чем никогда, никогда, никогда):

localadmin@astra:~$ lpr -P PDF_Printer_Group -T “profile” .profile

Где:

  • Ключ -P – указывает, куда утилита lpr должна отправить файл. В нашем случае файл будет передан группе принтеров, а уже группа передаст первому свободному принтеру.

  • Ключ -T – указывает имя задания.

Примечание

При отправке печати на группу принтеров, CUPS начнет балансировать нагрузку (чередование принтеров), тем самым новое задание печати будет отправляться на следующий принтер в группе.

Учитывая, что в группу входят виртуальные PDF-принтеры, при получении заданий они будут создавать pdf-файлы в папке PDF домашнего каталога пользователя:

localadmin@astra-ald:~$ ls ~/PDF
profile-job_1.pdf

Проверка статуса CUPS

Проверка статуса подсистемы печати выполняется командой lpstat -t.

localadmin@astra:~$ lpstat -t
планировщик запущен
Нет назначение системы по умолчанию
устройство для MFU_Epson: socket://192.168.1.115:9100
MFU_Epson принимает запросы с момента Пт 15 сен 2023 09:49:26
принтер MFU_Epson свободен. Включен с момента Пт 15 сен 2023 09:49:26
       Файл "/opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper" имеет
небезопасные права доступа  (0100755/uid=1000/gid=1000).

На приведенном выше примере система сообщает, что файл /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper (созданный в процессе установки драйверов) имеет небезопасные права доступа (0100755/uid=1000/gid=1000).

Для принтеров epson требуется дополнительно настраивать права доступа, но об этом всегда указывают в дополнительных инструкциях по подключению конкретных устройств:

localadmin@astra:~$ sudo chown root:root -R /opt/epson-inkjet-printer-escpr/cups/lib
localadmin@astra:~$ ls -l /opt/epson-inkjet-printer-escpr/cups/lib
итого 4
drwxr-xr-x 2 root root 4096 сен 15 09:44 **filter**

Практика и тестирование

Заключение

В этом модуле мы познакомились с подсистемой печати CUPS и ее архитектурой, научились добавлять принтеры, создавать группы и управлять заданиями печати.

Следующий модуль будет посложнее. Он посвящен вопросам процесса запуска ОС и подсистеме инициализации и управления службами systemd.

Дополнительные источники информации