Skip to content

16 Назначение и работа systemd и sysvinit Различны

16 Назначение и работа systemd и sysvinit. Различные Systemd units. Редактирование units

Systemd и SysVinit — это системы инициализации в Linux, которые управляют процессом загрузки компьютера и службами, запускаемыми на различных этапах работы системы.

SysVinit

  • Назначение: SysVinit был стандартной системой инициализации во многих ранних версиях Linux. Он основан на концепции уровней выполнения (runlevels), которые определяют, какие программы и службы должны быть запущены или остановлены в определенный момент времени.
  • Работа: SysVinit использует скрипты инициализации, расположенные в /etc/init.d, для управления службами. Эти скрипты вызываются с аргументами startstoprestart и т. д. для управления состоянием служб. Уровни выполнения определены в /etc/inittab, и система может переключаться между ними, изменяя набор работающих служб.

Systemd

  • Назначение: Systemd — это более современная система инициализации и системный менеджер, который заменил SysVinit в большинстве дистрибутивов Linux. Он предоставляет более быструю загрузку, зависимости между службами, возможность параллельного запуска задач и лучшее управление ресурсами.
  • Работа: Вместо скриптов инициализации Systemd использует "юниты" (units) для представления служб, точек монтирования, устройств и других ресурсов. Systemd управляет этими юнитами в соответствии с их зависимостями, определенными в конфигурационных файлах юнитов, что позволяет более гибко настраивать загрузку системы и управление службами.

Различные Systemd units

Systemd использует различные типы юнитов для управления соответствующими ресурсами системы:

  • Service units (.service): Определяют службы, которые могут быть запущены, остановлены, перезапущены и т. д.
  • Socket units (.socket): Управляют сетевыми сокетами и слушающими портами, что позволяет динамически запускать службы при поступлении сетевых запросов.
  • Device units (.device): Представляют аппаратные устройства, опознанные в системе.
  • Mount units (.mount) и Automount units (.automount): Отвечают за монтирование и автоматическое монтирование файловых систем.
  • Target units (.target): Используются для группировки юнитов в логические группы, аналогично уровням выполнения в SysVinit, но более гибкие.

Редактирование и создание Systemd units

Для редактирования или создания юнитов systemd используются текстовые файлы конфигурации, обычно расположенные в /etc/systemd/system для пользовательских юнитов или в /lib/systemd/system для юнитов, установленных по умолчанию. Процесс может включать следующие шаги:

  1. Создание или редактирование файла юнита: Используйте текстовый редактор для создания нового файла юнита или редактирования существующего в соответствующем каталоге. Например, sudo nano /etc/systemd/system/my_service.service.
  2. Конфигурация юнита: Определите параметры юнита, такие как тип, команды для запуска и остановки службы, зависимости и т. д.
  3. Перезагрузка конфигурации systemd: После создания или изменения файла юнита необходимо перезагрузить конфигурацию systemd, используя команду sudo systemctl daemon-reload.
  4. Управление юнитом: Используйте команды systemctl для управления состоянием юнита, например, sudo systemctl start my_service.service для запуска службы.

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

Безопасность

Для безопас­ности systemd пред­лага­ет механиз­мы огра­ниче­ния при­виле­гий, которые про­ще, чем нас­трой­ка seccomp или POSIX-капаби­лити.

  • NoNewPrivileges=yes бло­киру­ет повыше­ние при­виле­гий, даже при экс­плу­ата­ции уяз­вимос­тей.
  • PrivateTmp=yes изо­лиру­ет /tmp, что­бы служ­ба не читала чужие фай­лы.
  • ProtectSystem=full дела­ет катало­ги /usr/boot и /etc дос­тупны­ми толь­ко для чте­ния.
  • ReadWritePaths раз­реша­ет запись толь­ко в ука­зан­ные дирек­тории, нап­ример /var/log/nginx.
  • CapabilityBoundingSet огра­ничи­вает capabilities — воз­можнос­ти про­цес­сов выпол­нять те или иные дей­ствия.
  • RestrictAddressFamilies раз­реша­ет толь­ко нуж­ные про­токо­лы, такие как AF_INET и AF_INET6.
  • MemoryDenyWriteExecute=yes защища­ет от инъ­екции кода в про­цес­сы.
  • PrivateDevices=yes огра­ничи­вает дос­туп к /dev.

Вот при­мер безопас­ной кон­фигура­ции для Nginx в /etc/systemd/system/secure-nginx.service:

[Unit] Description=Secure NGINX Web Server After=network.target [Service] ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf User=nginx Group=nginx CapabilityBoundingSet=CAP_NET_BIND_SERVICE NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=full ReadWritePaths=/var/lib/nginx /var/log/nginx RestrictAddressFamilies=AF_INET AF_INET6 MemoryDenyWriteExecute=yes PrivateDevices=yes ProtectHome=yes SystemCallFilter=@system-service SystemCallArchitectures=native [Install] WantedBy=multi-user.target

Коман­да systemd-analyze security secure-nginx.service покажет оцен­ку уяз­вимос­тей и пред­ложит улуч­шения.

Про­ана­лизи­ровать вре­мя заг­рузки:

systemd-analyze blame systemd-analyze plot > boot.svg