Файлы целей и юнитов в загрузочной системе

За последние несколько дней я просматривал все документы и примеры, касающиеся целей (так называемый уровень выполнения), но я все еще не понимаю эту тему.

Может кто-нибудь объяснить мне разницу между уровнями выполнения в init и Targets в systemd? Что такое файл модуля с точки зрения процесса загрузки?

Основы уровня выполнения против целей

Фон

В sysV (init) уровни запуска были просто числами 0-6. Система может быть настроена только на определенный уровень выполнения, обычно 3 (сеть + консоль) или 5 (X windows). Эти уровни выполнения в sysV просто были состояниями, в которых основной процесс init мог бы быть в любой момент времени. При использовании systemd цели служат аналогичной цели, но мультипликаторы могут применяться одновременно.

https://wiki.archlinux.org/index.php/systemd#Targets

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

ss1

Цели

Учитывая эту возможность, в systemd типичная система, в которой есть сеть, но не работает X, находится в target multi-user.target .

 $ systemctl get-default multi-user.target 

Но цель – это инкапсуляция (группировка) многих целей. Это одно из ключевых преимуществ systemd перед sysV. Вы можете увидеть это, если посмотрите на целевые файлы.

Страница man systemd.target

Файл конфигурации модуля, имя которого оканчивается на «.target», кодирует информацию о целевом модуле systemd, который используется для группировки модhive и известных точек синхронизации во время запуска. ….

…. Они существуют просто для группировки модhive по зависимостям (полезно в качестве целей загрузки) и для установки стандартизированных имен для точек синхронизации, используемых в зависимостях между модулями. Помимо прочего, целевые модули являются более гибкой заменой уровней запуска SysV в classической системе инициализации SysV. (И по соображениям совместимости существуют специальные целевые модули, такие как runlevel3.target, которые используются кодом совместимости уровня запуска SysV в systemd. Подробности смотрите в systemd.special (7)).

Например:

 $ grep target /usr/lib/systemd/system/anaconda.target Requires=basic.target After=basic.target 

ПРИМЕЧАНИЕ. Здесь для запуска anaconda.target требуется basic.target , и он должен запускаться после basic.target .

Из моей системы CentOS 7.x мы можем видеть, какие цели загружены:

 $ systemctl list-units --type=target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Local Encrypted Volumes getty-pre.target loaded active active Login Prompts (Pre) getty.target loaded active active Login Prompts local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network.target loaded active active Network nfs-client.target loaded active active NFS client services paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rpc_pipefs.target loaded active active rpc_pipefs.target slices.target loaded active active Slices sockets.target loaded active active Sockets swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, ie generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 19 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. 

Что такое модуль в systemd?

Файлы модhive в systemd – это просто файлы конфигурации, которые определяют одну из 5 вещей. Единицы могут быть, например:

  • услуги (.service)
  • точки монтирования (.mount)
  • устройства (.device)
  • розетки (.socket)
  • цели (.target)

Вы можете увидеть эти файлы модhive в этом каталоге на CentOS 7.x:

 $ for i in target socket service device mount;do ls -l /usr/lib/systemd/system | grep $i | head -3;done -rw-r--r-- 1 root root 415 May 3 16:05 anaconda.target -rw-r--r-- 1 root root 517 Apr 11 03:36 basic.target drwxr-xr-x. 2 root root 4096 Jul 28 14:56 basic.target.wants -rw-r--r-- 1 root root 874 Apr 10 23:42 avahi-daemon.socket -r--r--r-- 1 root root 131 Apr 11 01:03 cups.socket -rw-r--r-- 1 root root 102 Apr 11 03:23 dbus.socket -rw-r--r-- 1 root root 275 Apr 27 10:53 abrt-ccpp.service -rw-r--r-- 1 root root 380 Apr 27 10:53 abrtd.service -rw-r--r-- 1 root root 361 Apr 27 10:53 abrt-oops.service -rw-r--r-- 1 root root 169 Apr 12 15:28 clean-mount-point@.service -rw-r--r-- 1 root root 670 Apr 11 03:36 dev-hugepages.mount -rw-r--r-- 1 root root 590 Apr 11 03:36 dev-mqueue.mount 

Загрузка

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

Рекомендации

  • systemd – ArchLinux вики
  • Страница man systemd.target