<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Systemd on Lead DevOps</title><link>https://lead-devops.blackdevhub.online/tags/systemd/</link><description>Recent content in Systemd on Lead DevOps</description><generator>Hugo</generator><language>ru-RU</language><lastBuildDate>Sat, 19 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://lead-devops.blackdevhub.online/tags/systemd/index.xml" rel="self" type="application/rss+xml"/><item><title>ulimit и systemd LimitNOFILE — почему ulimit -n в unit не живёт</title><link>https://lead-devops.blackdevhub.online/posts/ulimit-i-systemd-limitnofile/</link><pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ulimit-i-systemd-limitnofile/</guid><description>&lt;h2 id="что-такое-nofile-и-где-он-живёт"&gt;Что такое nofile и где он живёт&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;nofile&lt;/code&gt; — максимальное количество открытых файловых дескрипторов на один процесс. Это не только обычные файлы, а сокеты, pipe, stdin/stdout/stderr, логи через journald — всё считается. Когда nginx или Go-приложение падает с &lt;code&gt;too many open files&lt;/code&gt;, дело в этом лимите.&lt;/p&gt;&#10;&lt;p&gt;Лимиты живут на трёх уровнях:&lt;/p&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Уровень&lt;/th&gt;&#10; &lt;th scope="col"&gt;Где смотреть&lt;/th&gt;&#10; &lt;th scope="col"&gt;Что контролирует&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Ядро (системный)&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;/proc/sys/fs/file-max&lt;/code&gt;, &lt;code&gt;/proc/sys/fs/nr_open&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Абсолютный потолок по всей системе&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;PAM / login&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;/etc/security/limits.conf&lt;/code&gt;, &lt;code&gt;/etc/security/limits.d/&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Для сессий через &lt;code&gt;pam_limits.so&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;systemd&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;LimitNOFILE=&lt;/code&gt; в unit, &lt;code&gt;DefaultLimitNOFILE=&lt;/code&gt; в &lt;code&gt;system.conf&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Для сервисов, управляемых systemd&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;&lt;code&gt;/proc/sys/fs/nr_open&lt;/code&gt; — верхняя граница, до которой можно поднять &lt;code&gt;nofile&lt;/code&gt; для одного процесса. По умолчанию обычно &lt;code&gt;1073741816&lt;/code&gt; (≈1B), но на практике редко нужно больше &lt;code&gt;1048576&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>coredumpctl: найти падение бинаря</title><link>https://lead-devops.blackdevhub.online/posts/coredumpctl-naiti-padenie-binarya/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/coredumpctl-naiti-padenie-binarya/</guid><description>&lt;h2 id="что-такое-coredumpctl-и-как-он-работает"&gt;Что такое coredumpctl и как он работает&#10;&lt;/h2&gt;&#10;&lt;p&gt;Когда бинарь падает с SEGV, ядро может сохранить core dump — снимок памяти процесса в момент креша. В systemd-based дистрибутивах за сбор, хранение и поиск этих дампов отвечёт &lt;code&gt;coredumpctl&lt;/code&gt;, обёртка над &lt;code&gt;systemd-coredump&lt;/code&gt;. Он хранит дампы в &lt;code&gt;/var/lib/systemd/coredump/&lt;/code&gt; и индексирует метаданные через journald.&lt;/p&gt;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;Для работы нужен &lt;code&gt;systemd-coredump&lt;/code&gt; и включённый journald. В минимальных контейнерах без systemd этот инструмент недоступен.&lt;/p&gt;</description></item><item><title>Docker logs и journald: выбор драйвера логирования</title><link>https://lead-devops.blackdevhub.online/posts/docker-logs-i-journald/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/docker-logs-i-journald/</guid><description>&lt;p&gt;Когда контейнер падает, логи — первое, что нужно увидеть. &lt;code&gt;docker logs&lt;/code&gt; выглядит просто, но под капотом работает разные драйверы логирования, и выбор влияет на то, как хранятся, вращаются и доступны логи. Вот что стоит знать перед тем, как доверять дефолту.&lt;/p&gt;&#10;&lt;h2 id="как-работает-docker-logs"&gt;Как работает docker logs&#10;&lt;/h2&gt;&#10;&lt;p&gt;Команда &lt;code&gt;docker logs &amp;lt;container&amp;gt;&lt;/code&gt; читает поток stdout/stderr контейнера и выдаёт его в терминал. За этим стоит &lt;strong&gt;драйвер логирования&lt;/strong&gt; — компонент, который определяет, куда именно пишутся данные. По умолчанию это &lt;code&gt;json-file&lt;/code&gt;: каждый контейнер получает JSON-файл на хосте, в который записываются все строки вывода.&lt;/p&gt;</description></item><item><title>Chrony вместо ntpd</title><link>https://lead-devops.blackdevhub.online/posts/chrony-vmesto-ntpd/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/chrony-vmesto-ntpd/</guid><description>&lt;p&gt;В Debian/Ubuntu и RHEL/CentOS &lt;code&gt;ntpd&lt;/code&gt; давно пора менять на &lt;code&gt;chrony&lt;/code&gt;. Он быстрее сходится к точному времени, лучше работает при нестабильных сетях и меньше нагружает систему. В современных дистрибутивах &lt;code&gt;chrony&lt;/code&gt; уже стоит по умолчанию — но если он ещё не развёрнут, переход занимает минуту.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;p&gt;На RHEL-подобных:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-918d4a83-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-918d4a83-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install chrony -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now chronyd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;На Debian/Ubuntu:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-918d4a83-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-918d4a83-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install chrony -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now chronyd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Если на машине раньше работал &lt;code&gt;ntpd&lt;/code&gt;, остановите и отключите его, чтобы не было конфликта портов:&lt;/p&gt;</description></item><item><title>journalctl: фильтры и follow</title><link>https://lead-devops.blackdevhub.online/posts/journalctl-filtry-i-follow/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/journalctl-filtry-i-follow/</guid><description>&lt;p&gt;Системный журнал systemd — это первое место, куда нужно смотреть, когда сервис упал или узел начал жрать CPU. &lt;code&gt;journalctl&lt;/code&gt; умеет гораздо больше, чем вывести весь лог подряд: фильтровать по юнитам, приоритетам, временным окнам и читать в реальном времени. Ниже — рабочий набор, который я использую ежедневно.&lt;/p&gt;&#10;&lt;h2 id="follow-in-real-time"&gt;Follow in real time&#10;&lt;/h2&gt;&#10;&lt;p&gt;Поведение, аналогичное &lt;code&gt;tail -f&lt;/code&gt;, но с учётом структурированного формата journald:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-3fa377c3-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-3fa377c3-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Флаг &lt;code&gt;-f&lt;/code&gt; (short for &lt;code&gt;--follow&lt;/code&gt;) выводит новые записи по мере их появления. По умолчанию показывает все юниты — удобно, когда не знаешь, где именно горит.&lt;/p&gt;</description></item><item><title>logrotate для своих демонов</title><link>https://lead-devops.blackdevhub.online/posts/logrotate-custom-daemons/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/logrotate-custom-daemons/</guid><description>&lt;p&gt;Логи демона разрастаются, а ротации нет — файл достигает десятков гигабайт, диск забивается, мониторинг ругается. systemd-journald и syslog-ng умеют вращать сами, но если у тебя свой демон пишет напрямую в файл, ротацию несёт logrotate. Вот как его настроить под конкретный сервис.&lt;/p&gt;&#10;&lt;h2 id="зачем-писать-свой-конфиг-logrotate"&gt;Зачем писать свой конфиг logrotate&#10;&lt;/h2&gt;&#10;&lt;p&gt;Пакеты из репозитория обычно ставят конфиг в &lt;code&gt;/etc/logrotate.d/&lt;/code&gt;, но для自建 демонов или собранных из исходников его нет. Без конфига файл растёт бесконтрольно. logrotate запускается через systemd-таймер (&lt;code&gt;logrotate.timer&lt;/code&gt;) или cron и читает все файлы из &lt;code&gt;/etc/logrotate.d/&lt;/code&gt;. Достаточно создать один файл — и цикл ротации заработает.&lt;/p&gt;</description></item><item><title>journalctl: фильтрация и форматирование логов systemd</title><link>https://lead-devops.blackdevhub.online/posts/journalctl-filtering-formatting/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/journalctl-filtering-formatting/</guid><description>&lt;p&gt;Логи пропали. Сервер перезагрузили — и привычный &lt;code&gt;less /var/log/syslog&lt;/code&gt; молчит. В современных дистрибутивах с systemd логи собирает journald, а читает их &lt;code&gt;journalctl&lt;/code&gt;. Если не знать его фильтры, работа с системой превращается в гадание.&lt;/p&gt;&#10;&lt;h2 id="почему-логи-исчезают-после-перезагрузки"&gt;Почему логи исчезают после перезагрузки&#10;&lt;/h2&gt;&#10;&lt;p&gt;По умолчанию journal хранит данные в &lt;code&gt;/run/log/journal/&lt;/code&gt; — это tmpfs, сбрасывается при ребуте. Чтобы логи переживали перезагрузку, создайте директорию:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-25fc14eb-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-25fc14eb-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /var/log/journal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemd-tmpfiles --create --prefix /var/log/journal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;После этого перезапустите systemd-journald:&lt;/p&gt;</description></item><item><title>systemd-run: запуск сервиса без unit-файла</title><link>https://lead-devops.blackdevhub.online/posts/systemd-run-transient-services/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/systemd-run-transient-services/</guid><description>&lt;p&gt;Иногда нужно быстро поднять процесс под systemd, но писать unit-файл и класть его в /etc/systemd/system лень или нельзя — контейнер без systemd, чужая машина, временный запуск. На этот случай есть &lt;code&gt;systemd-run&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="зачем-systemd-run"&gt;Зачем systemd-run&#10;&lt;/h2&gt;&#10;&lt;p&gt;Инструмент создает &lt;strong&gt;transient unit&lt;/strong&gt; — юнит, который существует только в памяти systemd, без файла на диске. Это удобно, когда:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;нужен контроль ресурсов (cgroup) над разовым процессом;&lt;/li&gt;&#10;&lt;li&gt;важно, чтобы процесс пережил закрытие терминала;&lt;/li&gt;&#10;&lt;li&gt;хочется изолировать команду в отдельном слайсе.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;По сути, это обертка над &lt;code&gt;systemctl start&lt;/code&gt; для юнитов, которые никто не сохраняет.&lt;/p&gt;</description></item><item><title>Создание собственной службы Systemd</title><link>https://lead-devops.blackdevhub.online/posts/custom-systemd-service/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/custom-systemd-service/</guid><description>&lt;p&gt;Приложение нужно запускать при старте сервера, перезапускать при падении и вести логи. Shell-скрипты в /etc/rc.local не дают ни перезапуска, ни зависимостей. Systemd решает всё это одной декларацией.&lt;/p&gt;&#10;&lt;h2 id="зачем-писать-свой-unit-файл"&gt;Зачем писать свой unit-файл&#10;&lt;/h2&gt;&#10;&lt;p&gt;Вместо скриптов и супервизоров вроде supervisord systemd даёт единый интерфейс управления службами. Он знает о сокетах, зависимостях, ресурсных лимитах и имеет встроенный journald для логов.&lt;/p&gt;&#10;&lt;h2 id="структура-unit-файла"&gt;Структура unit-файла&#10;&lt;/h2&gt;&#10;&lt;p&gt;Unit-файл — ini-подобный файл в &lt;code&gt;/etc/systemd/system/&lt;/code&gt; или &lt;code&gt;/run/systemd/system/&lt;/code&gt; для runtime. Имя формата &lt;code&gt;имя.service&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>systemd-timer: планирование вместо cron</title><link>https://lead-devops.blackdevhub.online/posts/systemd-timer-scheduling/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/systemd-timer-scheduling/</guid><description>&lt;p&gt;cron работает, но его логи — текстовый файл без структуры, а зависимости от сервисов приходится городить через костыли вроде &lt;code&gt;Requires=&lt;/code&gt; в shell-скрипте. systemd-timer решает это: единый интерфейс управления, логи в journald, зависимости через familiar &lt;code&gt;After=&lt;/code&gt;, &lt;code&gt;WantedBy=&lt;/code&gt; — и всё в одном стеке.&lt;/p&gt;&#10;&lt;h2 id="структура-service-и-timer"&gt;Структура .service и .timer&#10;&lt;/h2&gt;&#10;&lt;p&gt;Таймер — это отдельный юнит, который запускает &lt;code&gt;.service&lt;/code&gt;. Разделение故意的: сервис можно вызывать и вручную, и по расписанию.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7c9ce898-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7c9ce898-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/systemd/system/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── backup.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── backup.timer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;backup.service — обычный юнит, можно запустить через &lt;code&gt;systemctl start backup.service&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>