Linux EACCESСредняя

systemctl permission denied: причины и способы исправления ошибки доступа

Статья объясняет, почему возникает ошибка 'Permission denied' при запуске systemctl, и предоставляет проверенные способы её устранения, включая использование sudo и настройку polkit.

Обновлено 17 февраля 2026 г.
5-10 мин
Низкая
FixPedia Team
Применимо к:systemd 219 и вышеUbuntu 16.04 и вышеDebian 8 и вышеCentOS 7 и выше

Что означает ошибка "Permission denied" в systemctl

При попытке выполнить команду systemctl (например, systemctl start nginx) без достаточных прав вы видите сообщение:

Failed to connect to bus: Permission denied

или

systemctl: authorization denied

Эта ошибка указывает, что текущий пользователь не авторизован для взаимодействия с systemd через D-Bus. Systemctl предназначен для управления системными службами, поэтому по умолчанию требует прав root (или через sudo). Ошибка возникает на уровне авторизации polkit, а не на уровне файловой системы.

Причины возникновения

Ошибка "Permission denied" при использовании systemctl может быть вызвана следующими причинами:

  1. Запуск без sudo: Выполнение команды от обычного пользователя без повышения привилегий.
  2. Пользователь не в группе sudo/wheel: Аккаунт не добавлен в группу sudo (Ubuntu/Debian) или wheel (CentOS/RHEL/Fedora), поэтому sudo недоступен.
  3. Ограничения polkit: Правила polkit (PolicyKit) явно запрещают доступ для вашего пользователя или сессии к действиям systemd.
  4. Работа в контейнере или среде без systemd: В Docker-контейнере, WSL1 или других изолированных средах systemd может не быть запущен как PID 1, поэтому systemctl не может подключиться к bus.
  5. Некорректные права на файлы systemd: Редкий случай, когда файлы в /etc/systemd/ или /run/systemd/ имеют неправильные права доступа (например, не-readable для обычных пользователей).

Способы решения

Способ 1: Используйте sudo для команд systemctl

Наиболее простое и правильное решение — выполнять все команды управления службами с повышенными привилегиями, добавив sudo в начало.

Пример:

sudo systemctl start nginx
sudo systemctl status nginx
sudo systemctl enable nginx

Если sudo настроен с запросом пароля, система попросит ввести пароль вашего пользователя. Если sudo настроен без пароля для конкретных команд (через /etc/sudoers), команда выполнится автоматически.

💡 Совет: Для частых операций можно создать алиасы в ~/.bashrc, например: alias sstart='sudo systemctl start', но остерегайтесь случайного выполнения опасных команд.

Способ 2: Добавьте пользователя в группу sudo или wheel

Если при использовании sudo вы получаете ошибку "user is not in the sudoers file", нужно добавить вашего пользователя в соответствующую группу.

  1. Проверьте, в каких группах состоит текущий пользователь:
groups $USER
  1. Если в выводе нет sudo (для Debian/Ubuntu) или wheel (для RHEL/CentOS/Fedora), добавьте пользователя:

Для Ubuntu/Debian:

sudo usermod -aG sudo $USER

Для CentOS/RHEL/Fedora:

sudo usermod -aG wheel $USER
  1. Важно: Изменения вступят в силу после выхода и повторного входа в систему (или перезагрузки). Проверьте заново командой groups $USER.

Способ 3: Настройте polkit правила для доступа без sudo

В некоторых сценариях (например, на рабочих станциях) может потребоваться разрешить определённым пользователям выполнять некоторые команды systemctl без ввода пароля. Это делается через polkit (PolicyKit).

  1. Создайте файл с правилом, например, /etc/polkit-1/rules.d/50-systemctl.rules. Требуются права root.
  2. Добавьте JavaScript-код, который разрешает управление службами для конкретных пользователей или групп. Пример для пользователя alice:
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

Или для группы developers:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        subject.user in ["alice", "bob"]) {
        return polkit.Result.YES;
    }
});
  1. Перезапустите polkit или всю систему:
sudo systemctl restart polkit

⚠️ Важно: Настройка polkit правил снижает безопасность. Разрешайте только необходимые действия (например, org.freedesktop.systemd1.manage-units) и только доверенным пользователям. Не используйте polkit.Result.YES для всех действий (action.id).

Способ 4: Обход ошибки в Docker-контейнерах

В Docker-контейнерах systemctl обычно не работает, потому что systemd не запущен как init-процесс (PID 1). Поэтому попытки использовать systemctl приведут к ошибке подключения к bus.

Решение A: Запустите контейнер в privileged режиме или с systemd

docker run --privileged -d your_image

Или настройте контейнер для запуска systemd как PID 1 (требует изменений в образе, например, установки systemd и настройки entrypoint).

Решение B: Управляйте службами без systemctl

Вместо systemctl, используйте прямые команды для управления процессами или инициализационные скрипты. Например, для запуска nginx в контейнере:

docker exec -d container_name nginx

Или перестройте образ так, чтобы службы запускались через CMD или ENTRYPOINT.

Решение C: Подключитесь к systemd хоста из контейнера (продвинутое)

Смонтируйте сокеты systemd и dbus в контейнер:

docker run -v /run/dbus:/run/dbus -v /var/run/docker.sock:/var/run/docker.sock ...

Но это может быть небезопасно и требует дополнительной настройки sudo внутри контейнера.

Способ 5: Проверьте и исправьте права на файлы systemd

Если ошибка вызвана повреждением прав доступа к файлам systemd (редко), восстановите стандартные права.

Предупреждение: Не изменяйте права на системные файлы без понимания последствий. Сначала сделайте резервную копию или убедитесь, что проблема именно в правах.

Для Debian/Ubuntu можно переконфигурировать пакет systemd:

sudo dpkg-reconfigure systemd

Или принудительно восстановить права (осторожно!):

sudo chmod -R 755 /etc/systemd
sudo chmod -R 755 /run/systemd

Если проблема не исчезнет, возможно, стоит переустановить systemd:

sudo apt-get install --reinstall systemd  # для Debian/Ubuntu
sudo yum reinstall systemd               # для CentOS/RHEL

Профилактика

Чтобы избежать повторения ошибки "Permission denied" при использовании systemctl:

  • Всегда используйте sudo для команд, управляющих системными службами, если вы не работаете от root.
  • Не давайте излишних прав через sudoers или polkit. Принцип наименьших привилегий снижает риски.
  • Избегайте работы systemctl в контейнерах, если контейнер не предназначен для этого. Используйте альтернативные методы управления процессами.
  • Регулярно обновляйте систему, чтобы получать исправления для systemd и polkit, которые могут устранять баги авторизации.
  • Проверяйте membership в группах после создания новых пользователей, особенно на серверах, где требуется удалённое управление службами.

Часто задаваемые вопросы

Почему systemctl требует права администратора?
Можно ли настроить systemctl на работу без sudo?
Что делать, если sudo не помогает?
Эта ошибка возникает в Docker-контейнерах?

Полезное

Запустите команду с sudo
Добавьте пользователя в группу sudo
Настройте polkit при необходимости
Для контейнеров используйте privileged режим