lfs-ru/chapter09/systemd-custom.xml

291 lines
18 KiB
XML
Raw Normal View History

2023-05-23 09:22:34 +03:00
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % general-entities SYSTEM "../general.ent">
%general-entities;
]>
<sect1 id="ch-config-systemd-custom" revision="systemd">
<?dbhtml filename="systemd-custom.html"?>
2023-06-08 21:48:47 +03:00
<title>Настройка и использование Systemd</title>
2023-05-23 09:22:34 +03:00
<indexterm zone="ch-config-systemd-custom">
<primary sortas="e-Systemd">Systemd Customization</primary>
</indexterm>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Базовая настройка</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>Файл <filename>/etc/systemd/system.conf</filename> содержит параметры для управления
основными операциями systemd. Изначально все записи в этом файле закомментированы с
указанием настроек по умолчанию. В этом файле может быть изменен уровень логирования, а также
некоторые базовые настройки ведения файлов логов. Смотрите страницу руководства
<ulink role='man' url='&man;systemd-system.conf.5'>systemd-system.conf(5)</ulink> для
получения подробной информации по каждому параметру.</para>
2023-05-23 09:22:34 +03:00
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Отключение очистки экрана во время загрузки</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>Обычным поведением systemd является очистка экрана по окончании загрузки. При желании
такое поведение можно изменить, выполнив следующую команду:</para>
2023-05-23 09:22:34 +03:00
<screen role="nodump"><userinput>mkdir -pv /etc/systemd/system/getty@tty1.service.d
cat &gt; /etc/systemd/system/getty@tty1.service.d/noclear.conf &lt;&lt; EOF
<literal>[Service]
TTYVTDisallocate=no</literal>
EOF</userinput></screen>
2023-08-02 23:14:31 +03:00
<para>Сообщения, отображаемые при загрузке всегда можно просмотреть, выполнив команду
2023-06-08 21:48:47 +03:00
<userinput>journalctl -b</userinput> от имени пользователя
2023-08-02 23:14:31 +03:00
<systemitem class="username">root</systemitem>.</para>
2023-05-23 09:22:34 +03:00
</sect2>
<sect2 id='systemd-no-tmpfs'>
2023-06-08 21:48:47 +03:00
<title>Отключение tmpfs для /tmp</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>По умолчанию каталог <filename class="directory">/tmp</filename> монтируется как
tmpfs. Если такое поведение нежелательно, его можно переопределить, выполнив
следующую команду:</para>
2023-05-23 09:22:34 +03:00
<screen role="nodump"><userinput>ln -sfv /dev/null /etc/systemd/system/tmp.mount</userinput></screen>
2023-06-08 21:48:47 +03:00
<para>В качестве альтернативы, если требуется отдельный раздел для
<filename class="directory">/tmp</filename> укажите его в <filename>/etc/fstab</filename>.</para>
2023-05-23 09:22:34 +03:00
<warning>
<para>
2023-06-08 21:48:47 +03:00
Не создавайте символическую ссылку, указанную выше, если используется отдельный раздел
для <filename class="directory">/tmp</filename>. Это помешает монтированию корневой файловой
системы (/) в режиме r/w и сделает систему непригодной для загрузки.
2023-05-23 09:22:34 +03:00
</para>
</warning>
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Настройка автоматического создания и удаления временных файлов</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>Существует несколько служб, которые создают или удаляют файлы или каталоги:</para>
2023-05-23 09:22:34 +03:00
<itemizedlist>
<listitem><para>systemd-tmpfiles-clean.service</para></listitem>
<listitem><para>systemd-tmpfiles-setup-dev.service</para></listitem>
<listitem><para>systemd-tmpfiles-setup.service</para></listitem>
</itemizedlist>
2023-06-08 21:48:47 +03:00
<para>Системные файлы конфигурации расположены в
<filename>/usr/lib/tmpfiles.d/*.conf</filename>. Локальные конфигурационные файлы находятся в
<filename class="directory">/etc/tmpfiles.d</filename>. Файлы в
<filename class="directory">/etc/tmpfiles.d</filename> переопределяют файлы с таким же именем в
<filename class="directory">/usr/lib/tmpfiles.d</filename>. Смотрите подробности по формату файла
в руководстве <ulink role='man' url='&man;tmpfiles.d.5'>tmpfiles.d(5)</ulink>.</para>
2023-05-23 09:22:34 +03:00
<para>
2023-06-08 21:48:47 +03:00
Обратите внимание, что синтаксис файлов в
<filename>/usr/lib/tmpfiles.d/*.conf</filename> может сбивать с толку.
Например, по умолчанию, удаление файлов в каталоге /tmp находится в
файле <filename>/usr/lib/tmpfiles.d/tmp.conf</filename> в строке:
2023-05-23 09:22:34 +03:00
<screen role="nodump">q /tmp 1777 root root 10d</screen>
2023-06-08 21:48:47 +03:00
q, в поле type, указывает что необходимо создать подраздел с квотами, которые применимы только
к файловым системам btrfs. Он ссылается на type v который, в свою очередь, ссылается на type d (каталог).
Затем создается указанный каталог, если он отсутствует, и настраиваются разрешения и владелец. Содержимое
каталога будет очищаться через указанный интервал времени, если указан аргумент age.
2023-05-23 09:22:34 +03:00
</para>
<para>
2023-06-08 21:48:47 +03:00
Если параметры по умолчанию не нужны, файл следует скопировать в
<filename class="directory">/etc/tmpfiles.d</filename> и отредактировать по желанию. Например:
2023-05-23 09:22:34 +03:00
<screen role="nodump"><userinput>mkdir -p /etc/tmpfiles.d
cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d</userinput></screen>
</para>
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Переопределение поведения служб по умолчанию</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>Параметры юнита можно переопределить, создав каталог и файл конфигурации в
2023-06-19 08:47:59 +03:00
<filename class="directory">/etc/systemd/system</filename>. Пример для условного юнита foobar:</para>
2023-05-23 09:22:34 +03:00
<screen role="nodump"><userinput>mkdir -pv /etc/systemd/system/foobar.service.d
cat > /etc/systemd/system/foobar.service.d/foobar.conf &lt;&lt; EOF
<literal>[Service]
Restart=always
RestartSec=30</literal>
EOF</userinput></screen>
2023-06-08 21:48:47 +03:00
<para>Дополнительную информацию смотрите на странице руководства
<ulink role='man' url='&man;systemd.unit.5'>systemd.unit(5)</ulink>. После создания файла
конфигурации запустите <userinput>systemctl daemon-reload</userinput> и <userinput>systemctl
2023-06-08 21:48:47 +03:00
restart foobar</userinput>, чтобы активировать изменения в службе.</para>
2023-05-23 09:22:34 +03:00
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Отладка порядка загрузки служб</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>Вместо простых сценариев оболочки, используемых в системах инициализации SysVinit или BSD,
systemd использует унифицированный формат для различных типов запускаемых файлов (или юнитов).
Команда <command>systemctl</command> используется для запуска, остановки, управления состоянием
и получения статуса юнит-файлов. Ниже несколько примеров часто используемых команд:</para>
2023-05-23 09:22:34 +03:00
<itemizedlist>
<listitem>
<para><command>systemctl list-units -t <replaceable>&lt;service&gt;</replaceable> [--all]</command>:
2023-06-08 21:48:47 +03:00
выводит список загруженных юнит-файлов типа service.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
<para><command>systemctl list-units -t <replaceable>&lt;target&gt;</replaceable> [--all]</command>:
2023-06-08 21:48:47 +03:00
выводит список загруженных юнит-файлов типа target.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
<para><command>systemctl show -p Wants <replaceable>&lt;multi-user.target&gt;</replaceable></command>:
2023-06-08 21:48:47 +03:00
показывает все юнит-файлы, зависящие от multi-user target (многопользовательского режима).
Target - специальные юнит-файлы, которые аналогичны уровням запуска в SysVinit.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
2023-06-08 21:48:47 +03:00
<para><command>
systemctl status <replaceable>&lt;servicename.service&gt;</replaceable></command>:
показывает статус службы servicename. Расширение .service можно опустить, если нет
других юнит-файлов с таким же именем, например, .socket (которые создают прослушивающий
сокет, обеспечивающий функции аналогичные inetd/xinetd).</para>
2023-05-23 09:22:34 +03:00
</listitem>
</itemizedlist>
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Работа с журналом Systemd</title>
2023-05-23 09:22:34 +03:00
2023-06-08 21:48:47 +03:00
<para>Вход в систему, загруженную с помощью systemd, обрабатывается с помощью systemd-journald
(по умолчанию), а не классическим демоном системного журнала unix. При желании, вы можете добавить
обычный демон системного журнала и заставить их работать бок о бок. Программа systemd-journald
сохраняет записи журнала в двоичном формате, а не в обычном текстовом. Для разбора лога предоставляется
команда <command>journalctl</command>. Ниже несколько примеров часто используемых команд:</para>
2023-05-23 09:22:34 +03:00
<itemizedlist>
<listitem>
2023-06-08 21:48:47 +03:00
<para><command>journalctl -r</command>: показывает все содержимое журнала в обратном
хронологическом порядке.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
<para><command>journalctl -u <replaceable>UNIT</replaceable></command>:
2023-06-08 21:48:47 +03:00
показывает записи журнала, связанные с указанным юнит-файлом.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
2023-06-19 08:47:59 +03:00
<para><command>journalctl -b[=ID] -r</command>: показывает записи журнала с момента последней
2023-08-02 23:14:31 +03:00
успешной загрузки (или для идентификатора загрузки) в обратном порядке хронологический порядке.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
2023-06-08 21:48:47 +03:00
<para><command>journalctl -f</command>: предоставляет функциональность, аналогичную tail -f
(режим следования).</para>
2023-05-23 09:22:34 +03:00
</listitem>
</itemizedlist>
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Работа с дампами ядра</title>
<para>Дампы ядра полезны для отладки аварийно завершившихся программ, особенно,
когда происходит сбой процесса демона. В системах с systemd дампы ядра обрабатывается
командой <command>systemd-coredump</command>. Команда запишет дамп в журнал и сохранит
сам дамп ядра в <filename class="directory">/var/lib/systemd/coredump</filename>.
Чтобы получить и обработать дамп, предоставляется инструмент <command>coredumpctl</command>.
Несколько примеров часто используемых команд:
2023-05-23 09:22:34 +03:00
</para>
<itemizedlist>
<listitem>
2023-06-08 21:48:47 +03:00
<para><command>coredumpctl -r</command>: выводит список всех дампов в обратном
хронологическом порядке.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
2023-06-08 21:48:47 +03:00
<para><command>coredumpctl -1 info</command>: отображает информацию из последнего
дампа ядра.</para>
2023-05-23 09:22:34 +03:00
</listitem>
<listitem>
2023-06-19 08:47:59 +03:00
<para><command>coredumpctl -1 debug</command>: загружает последний дамп ядра в
2023-06-08 21:48:47 +03:00
<ulink url="&blfs-book;general/gdb.html">GDB</ulink>.
2023-05-23 09:22:34 +03:00
</para>
</listitem>
</itemizedlist>
2023-06-08 21:48:47 +03:00
<para>Дампы ядра могут занимать много места на диске. Можно ограничить место на диске,
занимаемое дампами ядра, создав конфигурационный файл в
2023-05-23 09:22:34 +03:00
<filename class="directory">/etc/systemd/coredump.conf.d</filename>.
2023-06-08 21:48:47 +03:00
Например:</para>
2023-05-23 09:22:34 +03:00
<screen role="nodump"><userinput>mkdir -pv /etc/systemd/coredump.conf.d
cat &gt; /etc/systemd/coredump.conf.d/maxuse.conf &lt;&lt; EOF
<literal>[Coredump]
MaxUse=5G</literal>
EOF</userinput></screen>
2023-06-08 21:48:47 +03:00
<para>Смотрите следующие страницы руководства для получения дополнительной информации
информация <ulink role='man' url='&man;systemd-coredump.8'>systemd-coredump(8)</ulink>,
<ulink role='man' url='&man;coredumpctl.1'>coredumpctl(1)</ulink> и
<ulink role='man' url='&man;coredump.conf.d.5'>coredump.conf.d(5)</ulink>.</para>
2023-05-23 09:22:34 +03:00
</sect2>
<sect2>
2023-06-08 21:48:47 +03:00
<title>Длительно выполняющиеся процессы</title>
<para>Начиная с версии systemd-230, все пользовательские процессы завершаются, когда завершается
пользовательская сессия, даже если используется nohup или процесс использует функции
<function>daemon()</function> или <function>setsid()</function>.Это намеренный переход от
исторически разрешительной среды к более ограничительной. Нововведение может вызвать проблемы,
если вы применяете долго работающие программы (такие как, <command>screen</command> или
<command>tmux</command>), чтобы оставаться активным после завершения вашей пользовательской сессии.
Есть три способа разрешить процессам работать после того, как сеанс пользователя завершен.</para>
2023-05-23 09:22:34 +03:00
<itemizedlist>
<listitem>
<para>
2023-06-08 21:48:47 +03:00
<emphasis>Включить долгосрочные процессы для выбранных пользователей</emphasis>:
Обычные пользователи имеют разрешение на включение долгосрочных процессов с помощью
команды <command>loginctl enable-linger</command> для самих себя. Системные администраторы
могут использовать ту же команду с аргументом <parameter>user</parameter> для включения
lingering'а пользователю. После этого пользователь может использовать команду
<command>systemd-run</command>, чтобы запустить длительный процесс. Например: <command>systemd-run --scope
--user /usr/bin/screen</command>. Если вы разрешите выполнение долгосрочных процессов
пользователю, то user@.service останется даже после завершения всех сеансов входа в
систему и автоматически запустится при загрузке системы. Это является преимуществом, потому
что явно разрешает и запрещает запуск процессов после завершения сеанса пользователя, но
нарушает обратную совместимость с такими инструментами, как <command>nohup</command> и
утилитами, которые используют <function>daemon()</function>.
2023-05-23 09:22:34 +03:00
</para>
</listitem>
<listitem>
<para>
2023-08-02 23:14:31 +03:00
<emphasis>Включить долгосрочные процессы в системе(глобально)</emphasis>:
2023-06-08 21:48:47 +03:00
Вы можете установить <parameter>KillUserProcesses=no</parameter> в
2023-06-19 08:47:59 +03:00
<filename>/etc/systemd/logind.conf</filename> для включения долгосрочных процессов
2023-06-08 21:48:47 +03:00
глобально для всех пользователей. Преимуществом этого метода является то, что
вы оставляете старый метод доступным всем пользователям за счет явного контроля.
2023-05-23 09:22:34 +03:00
</para>
</listitem>
<listitem>
<para>
2023-06-08 21:48:47 +03:00
<emphasis>Отключить во время сборки</emphasis>: вы можете запретить завершение процессов
при сборке systemd, добавив ключ <parameter>-Ddefault-kill-user-processes=false</parameter>
в команде <command>meson</command> для systemd. Это полностью отключает возможность systemd
убивать пользовательские процессы в конце сеанса.
2023-05-23 09:22:34 +03:00
</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>