Running in chroot, ignoring command 'start': что означает и как исправить

Сообщение Running in chroot, ignoring command 'start' появляется при попытке запустить службу через systemctl start или service ... start внутри окружения chroot — например, при восстановлении системы с LiveUSB, при сборке пакетов или при установке дистрибутива вручную. Это не ошибка в строгом смысле: система инициализации обнаружила, что работает в изолированном корневом каталоге, и сознательно проигнорировала команду запуска демона.

Такое поведение заложено намеренно. В chroot нет полноценного процесса systemd с PID 1, который мог бы принять команду и управлять юнитами, поэтому попытка «запустить» сервис не имеет смысла — ему просто некому подчиняться. Ниже разберём, почему возникает это сообщение, когда его можно игнорировать, а когда нужно действовать, и как правильно управлять службами внутри chroot-окружения.

Почему systemd отказывается выполнять команду в chroot

Утилита systemctl взаимодействует с системным менеджером через шину D-Bus и сокет /run/systemd/private. Внутри chroot этот сокет либо отсутствует, либо указывает на «чужой» экземпляр systemd хост-системы, управлять которым из изолированного окружения было бы небезопасно. Поэтому инструменты инициализации определяют факт работы в chroot и блокируют команды start, stop и restart.

Обнаружение chroot происходит простым способом: сравнивается корневой каталог текущего процесса с корнем процесса с PID 1. Если они различаются — значит, процесс находится в сменённом корне. Аналогичную проверку выполняет скрипт /usr/sbin/policy-rc.d в Debian-подобных системах и обёртка invoke-rc.d, которые могут полностью запрещать запуск служб при установке пакетов в chroot.

Важно понимать: команды enable и disable при этом обычно работают, потому что они лишь создают или удаляют символические ссылки в каталогах /etc/systemd/system/ и не требуют запущенного менеджера. Игнорируются именно команды управления состоянием процесса.

Когда сообщение можно спокойно игнорировать

В ряде сценариев сообщение — нормальная часть рабочего процесса, и предпринимать ничего не нужно. Типичные случаи:

  • 🔧 Вы chroot-нулись в установленную систему с LiveUSB для восстановления загрузчика и попутно пытаетесь перезапустить сервис — после перезагрузки в основную систему службы стартуют штатно.
  • 📦 Сборка пакетов в pbuilder, sbuild или mock: postinst-скрипты пытаются запустить демоны, но это и не требуется в сборочном окружении.
  • 🐳 Подготовка rootfs для контейнера или встраиваемой системы, где службы будут запущены уже на целевом устройстве.
  • 💾 Установка дистрибутива вручную (например, Arch Linux через arch-chroot): достаточно включить нужные юниты через systemctl enable, а запуск произойдёт при первой загрузке.

Проверьте, какая именно команда была проигнорирована. Если это start или restart внутри скрипта установки пакета — пакет, скорее всего, установился корректно, и служба поднимется после выхода из chroot и перезагрузки.

⚠️ Внимание: не путайте игнорирование команды start с реальной ошибкой установки пакета. Если установщик завершился с ненулевым кодом возврата из-за невозможности запустить службу, проверьте настройки policy-rc.d — возможно, скрипту нужно явно разрешить «молчаливый» пропуск запуска.

Как проверить, что вы действительно в chroot

Прежде чем что-то исправлять, убедитесь, что окружение — действительно chroot, а не полноценная система с другой проблемой. Есть несколько способов диагностики.

Самый прямой — сравнить корневые каталоги процессов:

ls -di /

ls -di /proc/1/root/

Если иноды различаются, процесс с PID 1 видит другой корень — вы в chroot. Дополнительно можно проверить, запущен ли systemd как PID 1:

ps -p 1 -o comm=

systemctl is-system-running

Команда systemctl is-system-running в chroot обычно возвращает offline или ошибку подключения к шине, что подтверждает отсутствие работающего менеджера. Также полезно посмотреть переменную окружения SYSTEMD_IGNORE_CHROOT и файл /run/systemd/container, если речь идёт о контейнере.

Способы запустить службу внутри chroot

Иногда процесс внутри chroot всё же нужен — например, вы тестируете конфигурацию nginx или базы данных перед переносом системы. Поскольку systemd недоступен, используются обходные пути.

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

/usr/sbin/nginx -c /etc/nginx/nginx.conf

/usr/sbin/sshd -D &

Второй вариант — использовать классические init-скрипты /etc/init.d/, если они сохранились в пакете. Многие из них способны запустить демон без участия systemd:

/etc/init.d/ssh start

Третий подход — вместо chroot применить systemd-nspawn, который создаёт лёгкий контейнер с полноценным (или частичным) менеджером внутри:

systemd-nspawn -D /mnt/system --boot

В таком окружении systemctl start работает почти как в обычной системе. Это удобно для тестирования, но требует совместимого дерева каталогов с установленным systemd.

📊 В каком сценарии вы столкнулись с сообщением «Running in chroot, ignoring command start»?
Восстановление системы с LiveUSB
Установка дистрибутива вручную
Сборка пакетов (pbuilder/mock)
Работа с контейнерами или rootfs

Управление автозапуском без запуска: enable и маскировка

Если цель — подготовить систему в chroot к загрузке, запускать службы не нужно вообще. Достаточно настроить автозапуск, и всё поднимется при старте целевой системы.

systemctl enable sshd

systemctl enable NetworkManager

systemctl disable bluetooth

Эти команды создают или удаляют симлинки в /etc/systemd/system/*.target.wants/ и полностью работоспособны в chroot. Проверить результат можно командой systemctl is-enabled имя_службы — она тоже не требует запущенного менеджера.

☑️ Подготовка служб в chroot перед первой загрузкой

Выполнено: 0 / 5

Для блокировки службы используйте systemctl mask — она создаёт симлинк на /dev/null и гарантированно запрещает запуск даже как зависимость. Это тоже файловая операция, доступная в chroot.

Типичные ошибки при работе в chroot

Многие проблемы в chroot связаны не с самим сообщением, а с неправильно подготовленным окружением. Перед входом через chroot /mnt необходимо примонтировать виртуальные файловые системы, иначе даже разрешённые команды будут вести себя непредсказуемо.

ОшибкаПризнакРешение
Не примонтирован /procКоманды ps, top не работаютmount -t proc proc /mnt/proc
Не примонтирован /devОшибки доступа к устройствамmount --bind /dev /mnt/dev
Не примонтирован /sysНет информации об оборудованииmount --bind /sys /mnt/sys
Неверный DNS в chrootНе резолвятся доменыСкопировать /etc/resolv.conf
Попытка systemctl start«Running in chroot, ignoring command»Использовать enable или запуск вручную
⚠️ Внимание: не запускайте внутри chroot команды, меняющие состояние оборудования хоста, — например, systemctl reboot или операции с разделами диска. Даже если часть команд игнорируется, прямой вызов бинарных утилит может затронуть основную систему, поскольку ядро у chroot и хоста общее.

Отличия в контейнерах и при systemd-firstboot

Похожее сообщение встречается и в контейнерах Docker или LXC, где systemd либо отсутствует, либо работает в урезанном режиме. Там логика та же: без PID 1 в роли менеджера команды start бессмысленны. В контейнерах принято запускать главный процесс приложения напрямую через ENTRYPOINT, а не через систему инициализации.

При первой загрузке свежеразвёрнутой системы настройку служб можно делегировать механизму systemd-firstboot и preset-файлам, которые применяют политику автозапуска автоматически. Это избавляет от необходимости вручную включать юниты в chroot на этапе подготовки образа.

Почему enable работает, а start — нет

Команды enable/disable/mask лишь манипулируют символическими ссылками в /etc/systemd/system/ — это обычные файловые операции, не требующие связи с менеджером. Команды start/stop/restart отправляют запрос через D-Bus запущенному systemd (PID 1), которого в chroot нет, поэтому запрос отклоняется с сообщением об игнорировании.

Порядок действий при восстановлении системы через chroot

Типовой сценарий, где пользователи чаще всего видят это сообщение, — восстановление незагружающейся системы с LiveUSB. Правильная последовательность выглядит так.

  1. Примонтируйте корневой раздел: mount /dev/sdXN /mnt (подставьте свой раздел).
  2. Подключите служебные ФС: for d in /dev /dev/pts /proc /sys /run; do mount --bind $d /mnt$d; done.
  3. Войдите в окружение: chroot /mnt /bin/bash.
  4. Выполните нужные действия: переустановите загрузчик, обновите initramfs, включите службы через systemctl enable.
  5. Выйдите (exit), отмонтируйте разделы в обратном порядке и перезагрузитесь.

На шаге 4 не пытайтесь «проверить» службу командой start — она будет проигнорирована, и это ожидаемо. Реальную проверку выполняйте уже после загрузки в восстановленную систему.

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

Это сообщение — ошибка, которую нужно исправлять?

Нет. Это информационное предупреждение о том, что команда запуска службы проигнорирована из-за работы в chroot. Само по себе оно не свидетельствует о поломке. Исправлять нужно только если вы ожидали, что служба реально запустится, — тогда используйте ручной запуск демона или systemd-nspawn.

Служба запустится после перезагрузки, если в chroot она не стартовала?

Да, если она включена в автозагрузку. Проверьте это командой systemctl is-enabled имя_службы. При ответе enabled служба стартует штатно при загрузке целевой системы, где systemd работает как PID 1.

Можно ли заставить systemctl start работать в chroot?

Напрямую — нет, это сознательное ограничение. Обходные варианты: запустить бинарник демона вручную, использовать init-скрипты из /etc/init.d/ или заменить chroot на systemd-nspawn --boot, где менеджер служб функционирует.

Почему установка пакета в chroot завершается с ошибкой из-за этого сообщения?

Некоторые postinst-скрипты считают неудачный запуск службы фатальным. В Debian-подобных системах проблему решает файл /usr/sbin/policy-rc.d с кодом выхода 101 — он штатно запрещает запуск демонов, и скрипты завершаются успешно.

Опасно ли игнорировать это сообщение при восстановлении системы?

Нет, если вы осознанно работаете в chroot и ваша задача — настройка, а не запуск служб. Опасность представляют другие действия: операции с разделами, сетевыми интерфейсами и ядром, которые из chroot влияют на хост-систему, поскольку ядро общее.