SystemdDoctor
служба не работает apparmor изоляция права

status=231/APPARMOR в systemd

Код 231/APPARMOR значит, что systemd не сумел подготовить переход службы в профиль AppArmor. Чаще всего указанного профиля нет среди загруженных, либо AppArmor вообще не включён в системе.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Профиль не загружен

    Имя профиля из AppArmorProfile= должно присутствовать среди загруженных. Файл в /etc/apparmor.d сам по себе профиль не загружает.

  2. AppArmor не включён в системе

    На системах без AppArmor (например там, где вместо него SELinux) переход в профиль невозможен.

  3. Опечатка в имени профиля

    Имя профиля обычно совпадает с путём к программе в особой записи (usr.local.bin.myapp), и его легко перепутать с именем файла.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Показывает шаг APPARMOR и причину.

journalctl -xeu myapp.service --no-pager -n 20

Состояние AppArmor и список загруженных профилей.

sudo aa-status

Сообщения ядра про AppArmor, включая отказы в работе уже запущенной службы.

journalctl -k -b --no-pager | grep -i apparmor

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Профиль не загружен
Почему происходит
Имя профиля из AppArmorProfile= должно присутствовать среди загруженных. Файл в /etc/apparmor.d сам по себе профиль не загружает.
Как проверить
Посмотрите загруженные профили.
systemctl show myapp.service -p AppArmorProfile
sudo aa-status | head -20
Как исправить
Загрузите профиль и проверьте, что он появился в списке.
sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.myapp
sudo aa-status | grep myapp
2. AppArmor не включён в системе
Почему происходит
На системах без AppArmor (например там, где вместо него SELinux) переход в профиль невозможен.
Как проверить
Проверьте наличие и состояние AppArmor.
sudo aa-status || echo "AppArmor недоступен"
Как исправить
Уберите AppArmorProfile= из unit-файла для такой системы. Чтобы unit оставался переносимым, можно поставить перед именем дефис — тогда отсутствие профиля не будет ошибкой.
AppArmorProfile=-myapp-profile
3. Опечатка в имени профиля
Почему происходит
Имя профиля обычно совпадает с путём к программе в особой записи (usr.local.bin.myapp), и его легко перепутать с именем файла.
Как проверить
Сверьте имя с выводом списка профилей.
sudo aa-status | grep -i myapp
Как исправить
Укажите имя ровно так, как оно значится в списке загруженных профилей.

Пример вывода

В unit указан профиль, который не загружен. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

× myapp.service - My application
     Active: failed (Result: exit-code) since Mon 2026-09-14 23:02:41 MSK; 1s ago
    Process: 23900 ExecStart=/usr/local/bin/myapp (code=exited, status=231/APPARMOR)

systemd[23900]: myapp.service: Failed to prepare AppArmor profile change to myapp-profile: No such file or directory

Связанные ошибки

  • status=229/SELINUX_CONTEXT в systemd Код 229/SELINUX_CONTEXT: не удалось определить или сменить контекст SELinux для процесса службы.
  • Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
  • AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
  • Operation not permitted в журнале службы Операция запрещена: не хватает возможностей процесса, мешает seccomp или модуль безопасности. Отличие от Permission denied.
  • Read-only file system в журнале службы Служба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
  • status=209/STDOUT в systemd Код 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
  • status=210/CHROOT в systemd Код 210/CHROOT: не удалось сменить корневой каталог из RootDirectory= или подключить образ RootImage=.
  • status=218/CAPABILITIES в systemd Код 218/CAPABILITIES: не удалось применить набор возможностей процесса из CapabilityBoundingSet= или AmbientCapabilities=.

Источники

  • systemd.exec(5)
    231 EXIT_APPARMOR_PROFILE: не удалось подготовить смену профиля AppArmor. Имя кода в выводе systemd — APPARMOR.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на Ubuntu 24.04 с незагруженным профилем.
    собственная проверка, systemd 255
    сверено 15 сентября 2026