Drop-in в systemd: переопределение unit без правки файла пакета
Файл с дополнительными параметрами в каталоге имя-unit.d, который systemd накладывает поверх основного unit-файла. Позволяет менять настройки, не правя файл пакета.
Что делает
Правка файла пакета — плохая практика: обновление его заменит. Drop-in решает это: он лежит в /etc/systemd/system/имя.service.d/, переживает обновления и явно показывает, что именно вы изменили. Создавать его удобнее командой systemctl edit.
Важная особенность: параметры со списком значений (ExecStart=, Environment=, After=) дополняются, а не заменяются. Чтобы заменить, нужно сначала сбросить значение пустым присваиванием.
Где ставится. Каталог /etc/systemd/system/имя-unit.d/ с файлами, имя которых заканчивается на .conf.
Значения
| Значение | Что происходит |
|---|---|
systemctl edit имя.service | создать или открыть drop-in в редакторе. |
systemctl edit --full имя.service | править копию всего файла вместо дополнения. |
systemctl revert имя.service | убрать все переопределения. |
systemd-delta | показать все переопределения в системе. |
Пример
Замена команды запуска в чужом unit-файле.
# /etc/systemd/system/myapp.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/local/bin/myapp --new-flag
LimitNOFILE=65535
Пустая строка сбрасывает прежнее значение. Без неё systemd сочтёт, что задано две команды запуска, и откажется загружать unit.
Типичные ошибки
Файл без расширения .conf не читается.
Списочные параметры дополняются: без сброса получится две команды запуска.
После правки нужен systemctl daemon-reload.
Каталог должен называться точно по имени unit, включая расширение.
Связанные ошибки
- Переопределение через drop-in не применяетсяПравка через systemctl edit или файл в каталоге .d не действует: разбор причин, включая особенность списочных параметров и ExecStart.
- Warning: The unit file … changed on diskПредупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- Unit file is bad и ошибки разбора unit-файлаsystemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
Рядом стоящие параметры
Источники
- systemd.unit(5)
- systemctl(1)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)