LinuxFAQ.ru

Ошибка system has not been booted with systemd в Linux — как исправить

Ошибка “System has not been booted with systemd” часто встречается у пользователей Linux, работающих под WSL (Windows Subsystem for Linux) или в Docker-контейнерах. В этой статье мы разберём причины появления этой ошибки и приведём пошаговые инструкции по её устранению.

Почему появляется ошибка “system has not been booted with systemd”

  • Ваша среда (WSL, Docker-контейнер) по умолчанию не запускает systemd как init-процесс.
  • Некоторые инструменты и системные сервисы Linux зависят от systemd, а он не запущен.
  • В старых версиях WSL (WSL 1 и ранних версиях WSL 2) отсутствует поддержка systemd.
  • В Docker-контейнерах systemd не запускается без дополнительной настройки Dockerfile или параметров запуска.

Пошаговое решение

  1. Определите вашу среду выполнения
    Убедитесь, что вы действительно работаете под WSL или в Docker-контейнере. Выполните команду:

    uname -a

    Если в выводе есть слово Microsoft — вы в WSL. Если упоминается docker — это контейнер Docker.

  2. Проверьте, запущен ли systemd
    Выполните команду:

    ps -p 1 -o comm=

    Если вывод показывает init, bash или sh, значит systemd не запущен как основной процесс (PID 1). Для полноценной работы сервисов systemd должен быть именно init-процессом.

  3. Включите поддержку systemd в WSL 2 (Windows 11, версия 22000 и выше)

    Данная функция доступна только в WSL 2 на Windows 11. Для включения поддержки systemd создайте или откройте файл .wslconfig в вашем домашнем каталоге Windows:

    notepad %UserProfile%.wslconfig

    Добавьте в файл следующие строки:

    [wsl2]
    systemd=true
    

    Перезапустите WSL, чтобы применить изменения:

    wsl --shutdown

    После перезапуска systemd будет стартовать автоматически в вашем дистрибутиве WSL 2. Повторите команду из шага 2 — в выводе должен появиться systemd.

  4. Запуск systemd в Docker-контейнере

    Для запуска контейнера с systemd используйте команду с дополнительными параметрами:

    docker run --privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:ro -d ubuntu:22.04 /lib/systemd/systemd

    Эта команда создаёт контейнер на базе Ubuntu 22.04, где systemd будет запущен как процесс PID 1. Внимание: флаг --privileged расширяет права контейнера, что может быть небезопасно. Используйте его только в надежных средах и не применяйте в продакшне без предварительного анализа.

  5. Использование альтернатив без systemd

    Если вы не можете включить native systemd (например, в WSL 1 или на shared-хостингах), можно использовать старые команды управления сервисами:

    service  start

    Это классический способ управления сервисами, который работает без systemd.

Альтернативные методы

  • Используйте дистрибутивы WSL с поддержкой systemd “из коробки”, например Ubuntu 22.04 и новее, в сочетании с настройкой .wslconfig.
  • Переустановите дистрибутив, если система сильно повреждена — иногда проще начать с чистого листа.
  • Применяйте инструменты, такие как systemd-genie — это workaround для запуска systemd в WSL, однако его настройка требует отдельного изучения и прав суперпользователя.

Проверка результата

  • Убедитесь, что systemd запущен как init-процесс:
    ps -p 1 -o comm=

    Ожидаемый результат: systemd

  • Проверьте работу systemd-сервисов:
    systemctl status

    Отобразится список активных служб без ошибки “System has not been booted with systemd”.

  • В WSL проверьте наличие переменной окружения:
    echo $WSL_INTEROP

    Если переменная задана — вы действительно в WSL 2.

Как избежать ошибки в будущем

  • Выбирайте дистрибутивы и версии, обеспечивающие поддержку systemd (например, WSL 2 на Windows 11 и современные Linux-образы).
  • Для Docker-контейнеров сразу настраивайте запуск systemd через Dockerfile или параметры запуска.
  • Следите за обновлениями WSL и Docker — новые версии улучшают поддержку systemd.

FAQ

Поддерживает ли WSL 1 systemd?
Нет, systemd официально поддерживается только в WSL 2 на Windows 11 (начиная с версии 22000+).

Безопасно ли использовать --privileged в Docker?
Нет, этот флаг расширяет права контейнера до максимальных. Используйте его с осторожностью и только в доверенных средах. В продакшене лучше применять более изолированные методы запуска сервисов.

Можно ли запускать systemctl в обычном терминале WSL без поддержки systemd?
Нет. Без включённого systemd команды systemctl вызовут ошибку. В таких случаях используйте service или другие альтернативы.

Теперь вы знаете, почему появляется ошибка “system has not been booted with systemd” и как её устранить в различных средах.

Смотрите также

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Свежие материалы