status=231/APPARMOR в systemd
Код 231/APPARMOR значит, что systemd не сумел подготовить переход службы в профиль AppArmor. Чаще всего указанного профиля нет среди загруженных, либо AppArmor вообще не включён в системе.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Профиль не загружен
Имя профиля из
AppArmorProfile=должно присутствовать среди загруженных. Файл в /etc/apparmor.d сам по себе профиль не загружает. -
AppArmor не включён в системе
На системах без AppArmor (например там, где вместо него SELinux) переход в профиль невозможен.
-
Опечатка в имени профиля
Имя профиля обычно совпадает с путём к программе в особой записи (
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Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Имя профиля из
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
- Почему происходит
- На системах без AppArmor (например там, где вместо него SELinux) переход в профиль невозможен.
- Как проверить
-
Проверьте наличие и состояние AppArmor.
sudo aa-status || echo "AppArmor недоступен"
- Как исправить
-
Уберите
AppArmorProfile=из unit-файла для такой системы. Чтобы unit оставался переносимым, можно поставить перед именем дефис — тогда отсутствие профиля не будет ошибкой.AppArmorProfile=-myapp-profile
- Почему происходит
- Имя профиля обычно совпадает с путём к программе в особой записи (
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 (Ubuntu 24.04)
Воспроизведено на Ubuntu 24.04 с незагруженным профилем.