С помощью скриптов инициализации (или openrc) я всегда мог запускать сервисы из другого установочного корня.
но когда я бегу, chroot /somepath/to_root /usr/bin/systemctl start someservice
я получаю:
Running in chroot, ignoring request.
Есть ли способ заставить systemd запустить сервис?
Обновление:
я забыл сказать, что моя хост-система запускает сценарии инициализации или openrc, но никогда не использует systemd, и что я использую chroot для устранения неполадок в системах Unix, которые не могут даже запустить минимальную оболочку.
Ответы:
Хорошо известная проблема в системных дистрибутивах (Arch Linux, OpenSUSE, Fedora).
Systemd заменяет sysvinit и предоставляет одно большое преимущество по сравнению с этим. В sysvinit, когда вы запрашиваете запуск службы, она наследует контекст выполнения человека, вызывающего сценарий, который включает переменные окружения, ulimits и так далее. Systemd, наоборот, улучшает это, уведомляя демона, который запустит службу в четко определенной, работоспособной, постоянной среде, где, конечно, производительность служб гораздо проще предсказать, поскольку среда всегда одинакова.
Это подразумевает, что, когда я вызываю systemctl из chroot, неважно, что я нахожусь внутри chroot, среда, которая будет унаследована, по-прежнему будет PID 1, а не моей текущей. Но это становится еще хуже: поскольку коммуникационные сокеты находятся внутри / run / systemd, процесс в chroot даже не сможет общаться с системой init!
Итак, как вы можете использовать chroot в системных дистрибутивах?
Если все, что вам нужно, это иметь контейнер Linux, эта страница Arch Wiki расскажет вам, как настроить контейнер Linux менее чем за 30 секунд, благодаря
systemd-nspawn
.Если вместо этого вы действительно хотите использовать среду chroot, эта красивая и кристально чистая веб-страница предоставит вам два рабочих решения (второе - модифицированная версия, предложенная в пункте № 1).
источник
systemd-nspawn
но я не могу запустить его. И нет, это не для контейнера, так как сервис должен использоваться как хостом, так и целевой архитектурой.systemd-nspawn
завершается с ошибкой «Не работает в системе systemd». если хост не использует systemd.systemd-nspawn
, то указание на новый корень не поможет. Либо на хосте уже есть (потому что он работает с systemd), и в этом случае можно использовать версию хоста, либо на хосте ее нет, но версия нового root не будет работать.systemd
откажется от участияchroot
systemd
игнорирует только «сервисы», поэтому я просто запускаю команды демона вручную.Так что вместо
я использую
источник
startx
будет работать наXorg
.Несколько лет спустя я должен признать, что у большинства системных проблем есть только одно решение. Потому что ошибка сама Systemd
Я действительно сыт по горло Systemd, так как у меня были проблемы, с которыми я никогда не сталкивался с такими вещами, как Upstart или Openrc:
systemd-udevd
чегоsystemd-init
требуетсяsystemd-boot
пакет, который не может быть установлен одновременно, как иgrub2
не может считывать образы ядра из раздела reiser4.networkd
.Единственное решение:
Systemd - непростой комплекс для решения проблем: как alsa вместо ossv4. Так что если у вас есть что-то, что использует systemd, просто сотрите все данные:
и установите что-то, что вообще не использует его при решении проблем SysV Init, например Gentoo с Openrc.
Что касается моего вопроса, systemd делает такие вещи, как реестр Windows®: если часть его испорчена, то все кончено.
источник
Нет. Службы выполняются systemd (pid 1), а не systemctl напрямую (который только отправляет запрос на запуск), и поскольку systemd работает вне chroot, служба тоже будет работать.
Хотя технически это можно реализовать (заставив systemctl каким-то образом передать свой корень systemd), это вряд ли произойдет, поскольку уже есть инструмент для создания полных контейнеров (
systemd-nspawn /somepath/to_root
). Вы всегда можете связаться со списком рассылки, хотя.источник
RootDirectory=
также, поскольку у вас так опасно мало голосов. (-:RootDirectory
иchroot
командой?pid 1
это init?Столкнулся с этой проблемой, однажды попытался вывести сеть в режим восстановления с помощью конфигурации сети из chroot. Наконец это работает для меня:
или:
источник
Если вы запускаете службу в стиле inetd с активацией сокета, рассмотрите возможность запуска вместо этого stunnel с файлом конфигурации, в котором в качестве цели запуска в стиле inetd указаны и chroot, и ваш двоичный файл.
Обратите внимание, что у вас могут быть проблемы с SELINUX. В системе Oracle Linux 7.1 мне нужно было "chcon -v --type = stunnel_etc_t" для всех файлов, которые нужно прочитать stunnel.
Вам нужно будет использовать шифрование TLS на стороне клиента сокета (т. Е. Другой stunnel с «client = yes» в конфигурации). Дайте мне знать, если вы хотите узнать больше об этом.
источник
Вы можете использовать
nohup
команду для запуска сервисов в chroot.httpd
Например, чтобы начать обслуживание, я делаю это так.остановить это
pkill httpd
источник
Running in chroot, ignoring request.
. Я не думаю, что вы делаете это все время, хотя chroot. Действительно, для запуска скрипта требуется systemd.