ProtectSystem= в systemd: системные каталоги только для чтения
Делает системные каталоги недоступными для записи внутри пространства имён службы. Права на диске не меняются — меняется представление файловой системы, которое видит служба.
Что делает
Это одна из самых заметных по эффекту защит: служба физически не может испортить систему, даже будучи скомпрометированной. Обратная сторона — запись в /etc и /var, которую служба считала нормальной, перестаёт работать, и появляется ошибка о файловой системе только для чтения.
Правильный способ разрешить нужное — не ослаблять защиту целиком, а открыть конкретный путь через ReadWritePaths= или использовать каталоги службы: StateDirectory=, LogsDirectory=, CacheDirectory= всегда доступны для записи.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
no | по умолчанию: ограничений нет. |
yes | /usr и /boot доступны только для чтения. |
full | то же плюс /etc. |
strict | вся файловая система только для чтения, кроме /dev, /proc, /sys и явно разрешённых путей. |
По умолчанию: no
Пример
Жёсткая изоляция с точечным разрешением записи.
[Service]
ProtectSystem=strict
ProtectHome=yes
StateDirectory=myapp
ReadWritePaths=/var/lib/shared-data
ExecStart=/usr/local/bin/myapp
Каталог из StateDirectory= разрешать не нужно: systemd делает его доступным для записи сам.
Типичные ошибки
Служба, пишущая в /etc или /var без разрешения пути, получает ошибку «read-only file system».
Путь в ReadWritePaths=, которого не существует, приводит к коду 226/NAMESPACE при запуске.
В контейнере без нужных прав построить пространство имён нельзя, и жёсткая изоляция ломает запуск целиком.
Запись вывода в файл через StandardOutput=append: тоже попадает под запрет: путь нужно разрешить.
Связанные ошибки
- Read-only file system в журнале службыСлужба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
- status=226/NAMESPACE в systemdКод 226/NAMESPACE: не удалось настроить пространства имён монтирования, UTS или IPC. Частая причина — путь в ReadOnlyPaths= или ProtectHome=.
- status=209/STDOUT в systemdКод 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)