#Что происходит и когда это важно
Приложение возвращает Read-only file system или Permission denied при записи в системный каталог после усиления unit. Права владельца на диске могут быть корректными.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| ProtectSystem перекрывает записиРежим full/strict запрещает запись в системные каталоги в пространстве имён сервиса. | Ошибка есть лишь при запуске через systemd, но не при запуске от пользователя вне sandbox. | Сверить ProtectSystem и исключения. |
| Недостаточны обычные праваКаталог принадлежит другому пользователю или read-only по иной причине. | Ошибка воспроизводится и вне systemd либо есть ошибки диска. | Проверить права и mount, не открывать chmod 777. |
| Рабочие данные размещены не тамПриложение пытается писать в /usr или рядом с исполняемым файлом. | Путь записи — каталог пакета или /usr. | Перенести изменяемые данные в /var/lib или другой предусмотренный путь. |
#Пошаговая диагностика и исправление
- Найдите конкретный путь отказаОткройте терминал и посмотрите
journalctl -u ИМЯ.service -b -n 100 --no-pager. Запишите точный путь, для которого ошибка записи, и её формулировку. Не делайте вывод, что виноват ProtectSystem, по одному слову permission. - Просмотрите итоговые ограниченияВыполните
systemctl show ИМЯ.service -p ProtectSystem -p ReadWritePaths -p ReadOnlyPaths -p DynamicUserиsystemctl cat ИМЯ.service. Параметры описывают защиту файловой системы именно процесса этой службы. Учитывайте, что другие опции тоже могут ограничивать доступ. - Проверьте носитель и права без измененийВыполните
findmnt -T /ПУТЬ_ЗАПИСИиls -ld /ПУТЬ_ЗАПИСИс реальным путём.findmntпоказывает монтирование и опции,ls— права. Если весь раздел стал read-only из-за I/O ошибок, прекращайте правки unit и копируйте данные. - Подберите правильный каталог храненияДля служебных данных используйте предусмотренное приложением расположение (часто
/var/lib/имя), а для журналов штатный journald или/var/log/имя. Если программа пишет в/usr, предпочтительно изменить её конфигурацию, а не предоставлять право записи в весь/usr. - Разрешайте только подтверждённый путьАдминистратор после резервной копии и согласования создаёт переопределение через
sudo systemctl edit ИМЯ.serviceи, если действительно нужно, добавляет в секции[Service]ReadWritePaths=/КОНКРЕТНЫЙ/КАТАЛОГс настоящим путём. Эта настройка не исправляет POSIX-права и не отменяет read-only состояние нижележащей файловой системы. Не устанавливайте ProtectSystem=false без обоснования. - Примените и проверьтеПосле сохранения администратор выполняет
sudo systemctl daemon-reloadи согласованныйsudo systemctl restart ИМЯ.service. Запустите штатную операцию приложения, которая ранее падала, и проверьте журнал. Если появилась другая ошибка, верните переопределение и ищите отдельную причину.
#Команды из инструкции с пояснениями
systemctl show ИМЯ.service -p ProtectSystem -p ReadWritePaths -p ReadOnlyPaths -p DynamicUserfindmnt -T /ПУТЬ_ЗАПИСИls -ld /ПУТЬ_ЗАПИСИ#Как проверить результат
Служба работает с необходимым каталогом, записи выполняются, защита остальных системных путей остаётся включённой.
#Если проблема не устранена
Если запись не работает даже вне службы, проверьте владельца, ACL и состояние диска. Передайте администратору только пути и ошибку, не изменяйте разрешения рекурсивно.