Запустіть системну службу всередині chroot


38

За допомогою сценаріїв init (або з openrc) я завжди міг запускати служби з іншого кореня установки.
але коли я бігаю, chroot /somepath/to_root /usr/bin/systemctl start someserviceя отримав:

Running in chroot, ignoring request.

Чи є спосіб змусити systemd запустити службу?

Оновлення:
я забув сказати, що моя хост-система запускає скрипти init або openrc, але ніколи не систематизується, і що я використовую chroot для усунення неполадок у Unix-системах, які не можуть запустити навіть мінімальну оболонку.


1
Мені також потрібно запустити служби в chroot, він завжди працював до openrc2, зараз здається неможливим; (
neofutur

Ви намагаєтеся вирішити неправильну проблему. Якщо у вас є OpenRC, вам потрібно перетворити системну службу в службу OpenRC. Насправді цього не обійти.
Даніель Б

@DanielB: НІ! Ви коли-небудь чули про systemrescuecd?
користувач2284570

Ні. Я також не бачу, як це стосується вашого питання.
Даніель Б

Відповіді:


29

Відома проблема в системних дистрибутивах (Arch Linux, OpenSUSE, Fedora).

Systemd замінює sysvinit і забезпечує одну велику перевагу перед цим. У системі sysvinit, коли ви попросите послугу запустити, вона успадковує контекст виконання особи, яка викликає сценарій, який включає змінні середовища, обмежує умови тощо. Система покращує це навпаки, повідомляючи демона, який запустить послугу у чітко визначеній, здоровій та постійній обстановці, де, звичайно, ефективність послуг набагато простіше передбачити, оскільки середовище завжди однакове.

Це означає, що, коли я називаю systemctl зсередини chroot, не має значення, що я перебуваю всередині chroot, оточення, яке буде успадковано, все ще є PID 1, а не моє поточне. Але це стає гірше, ніж це: оскільки комунікаційні розетки розміщені всередині / run / systemd, процес у chroot навіть не зможе поговорити з системою init!

Отже, як ви ходите про chroot'ing у системних дистрибутивах?

  1. Якщо все, що ви хочете зробити, - це контейнер Linux, ця сторінка Arch Wiki розкаже вам, як налаштувати контейнер для Linux менше ніж за 30 секунд завдяки systemd-nspawn.

  2. Якщо замість цього вам дуже потрібне середовище chroot, ця красива і кришталево чиста веб-сторінка надасть вам два робочих рішення (друга - це модифікована версія тієї, що пропонується у пункті №1).


Я шукав, systemd-nspawnале не можу це запустити. І Ні, це не для контейнера, оскільки послугою потрібно користуватися і хост, і цільова архітектура.
користувач2284570

2
Що я ніколи не використовую systemd в корені моєї системи. У моєму випадку я не можу змішувати systemd з openrc.
користувач2284570

1
@TwoD Це не спрацює. systemd-nspawnПомилка запуску "Не працює на системній системі". якщо хост також не використовує systemd.
hvd

1
@TwoD І я відповів, бо мені це зовсім не так. :) "Я не можу його запустити" - це дивна річ, якщо у вас виникають проблеми з пошуком виконуваного файлу, саме тому я підозрюю, що проблема полягає в тому, що я виклав у своєму коментарі: запустивши це, воно дає повідомлення про помилку і не не роблю нічого корисного. Але навіть якщо виявиться, що проблема справді була в тому, де її знайти systemd-nspawn, то вказівка ​​на новий корінь не допоможе. Або хост уже має його (тому що він працює systemd), і в цьому випадку хост-версію можна використовувати, або хост її не має, але нова версія root не буде працювати.
hvd

1
systemdвідмовляться в забігуchroot
Еркін Альп Гюней

4

systemd лише ігнорує "служби", тому я просто запускаю команди демон вручну.

Так замість

service sshd start

я використовую

/usr/sbin/sshd -D &

Це працює не для всіх служб. Деякі вимагають запуститись як частина запуску системної служби, як Xorg.
користувач2284570

startxбуде працювати на Xorg.
Еркін Альп Гюней

@ ErkinAlpGüney: не в chroot… Через Dbus.
користувач2284570

4

Кілька років пізніше я повинен визнати, що існує лише одне рішення більшості практичних проблем Systemd. Тому що помилка - це сам Systemd

Мене дуже надоїла Systemd, оскільки у мене виникли проблеми, з якими я ніколи не стикався з такими речами, як Upstart або Openrc:

  • Застосування ядра, яке вимагає підтримки груп (замість того, щоб зробити його необов'язковим, але включено за замовчуванням всередині конфігураційного файлу), навіть для вбудованих систем, що мають лише 24 Мб оперативної пам’яті та не зберігаються для запису.
  • Незважаючи на претензію на модульність, під час виконання пекло залежність робить його сильним об'єктом бога: хочете завантажитися над одним коренею reiser4? Це неможливо, тому що багато програм вимагає, systemd-udevdщо вимагає, systemd-initщо вимагає systemd-bootпакет, який не може бути встановлений одночасно, ніж grub2не може читати зображення ядра з розділу reiser4.
  • Хочете підключитися до Інтернету через набір Bluetooth? Якщо це не працює з вашим телефоном Samsung java me, ви не зможете запускати скрипти та програмне забезпечення командного рядка, яке раніше працювало вручну через networkd.
  • Хоча я визнаю найбільшу проблему, якщо ви створюєте та підтримуєте власний дистрибутив Linux: сам системний модуль init має стільки залежностей, що ви не можете запропонувати вибрати іншу систему init через різні пакети встановлення.
  • Удачі для перегляду журналів, якщо ви не можете chroot у вашій системі або якщо ви оновили з libdb4.8 (тоді як принаймні, у гіршому випадку Microsoft має файли журналів у форматі xml) .

Єдине рішення:

Systemd є необхідним комплексом для вирішення проблем: як alsa замість ossv4. Тож якщо у вас є щось, що використовує systemd, просто витріть усі дані:

dd if=/dev/urandom of=/dev/dm−0 bs=1M

і встановіть щось, що взагалі не використовує це під час вирішення проблем SysV Init, як Gentoo з Openrc.
Щодо мого запитання systemd робить такі речі, як реєстр Windows®: якщо частина його накручується, значить, це закінчено.


3
Будь ласка, визнайте, що дизайн чогось насправді може перешкодити отримати відповідь, щоб відповідь переходила на щось, що працює . І що це справжня відповідь.
користувач2284570

1
У мене була така ж думка, зараз я перебуваю на трохи збалансованому погляді. Сидд має надвелику перевагу в тому, що він справді може вбити те, що має бути вбито . Це тому, що він відслідковує всі роздвоєні підпроцеси за допомогою функції ядра cgroup. Жоден із старих інструментів цього не може зробити. Крім того, ви пам’ятаєте лайно скриптів у /etc/init/*.sh?I теж, але сьогодні це лише погана пам'ять для мене. Файли службових систем чіткі та конфігуруються близько 10 рядків . Чи не 200 рядків довгі сценарії . Цими величезними перевагами є систематизація, я погоджуюся, що всі інші його особливості є недоліком.
Peterh каже відновити Моніку

До речі, я проголосував вашу відповідь, тому що, окрім її переваг, саме цей тип критиків саме в такому тоні - це те, що потребує вдосконалення системної розробки. Наприклад, я щойно намагався запустити postgresql в chroot, і мені довелося зламати свою кореневу систему, щоб це зробити. Багато, багато дурного все ще є, правда.
Peterh каже відновити Моніку

@peterh: на жаль, не всі поділяють це, я маю на увазі вилучення повідомлення. Мова йде не про SysV init проти Systemd, а більше проти таких речей, як Openrc або навіть Upstart (що дозволяє виконувати короткі сценарії запуску, а також паралельний запуск служби). Принаймні я дізнався одне: Дарвін - це здебільшого ᴏꜱ Apple ™ Windows - це ᴏꜱ Microsoft і Linux дизайн в основному управляється червоною шапочкою. Хоча SysV init, будучи повільнішим, не обмежує вас у тому, що ви можете робити під час виконання.
користувач2284570

Сценарії @peterh Services також дуже зрозумілі, коли ви використовуєте Openrc. Проблема з cgroup в Systemd полягає в тому, що це не варіант, який запобігає виконанню Systemd таких речей, як Darwin або NetBSD.
користувач2284570

3

Ні. Служби виконуються systemd (pid 1), а не systemctl безпосередньо (який надсилає лише запит на старт), а оскільки systemd працює за межами chroot, так і служба.

Хоча технічно це можна було б реалізувати (змусивши systemctl якось передати свій корінь до systemd), це малоймовірно, оскільки це вже є інструментом для створення повних контейнерів ( systemd-nspawn /somepath/to_root). Ви завжди можете зв’язатися зі списком розсилки .


1
Добре, але мені потрібно використовувати systemctl, оскільки моя хост-система використовує oepnrc. Я хочу повністю незалежне рішення
користувач2284570

3
Я ще більше замулюю води, кажучи: Psst! Згадайте RootDirectory=також, оскільки вам так небезпечно не вистачає коштів. (-:
JdeBP

@JdeBP: Яка різниця (у терміні результатів) між змінною RootDirectoryта chrootкомандою?
користувач2284570

@grawity: Отже, що додавати, якщо pid 1init?
користувач2284570

1

Одного разу зіткнувшись з цією проблемою, спробував вивести мережу в режим порятунку, використовуючи мережеву конфігурацію. Нарешті це працює для мене:

service --skip-redirect <service> restart

або:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

Приємно. Але це працює лише зі застарілими сумісними сервісами Init (не працюватиме для створення мереж у сировині Fedora) . Як я вже говорив у своїй відповіді, справжнє рішення - накрутити все, що використовується systemd.
користувач2284570

0

Якщо ви запускаєте послугу в стилі inetd з активацією сокета, розгляньте, замість цього запустити оглушення з файлом конфігурації, який визначає як chroot, так і ваш двійковий файл як ціль запуску в стилі inetd.

Зауважте, що у вас можуть виникнути проблеми SELINUX. У системі Oracle Linux 7.1 мені довелося "chcon -v --type = stunnel_etc_t" на всі файли, які потрібні для читання.

Вам потрібно буде використовувати шифрування TLS на клієнтській стороні сокета (тобто, ще один оглушення з конфігурацією "client = так"). Повідомте мене, якщо ви хочете отримати детальнішу інформацію про це.


ні, це стосується таких речей, як d-bus. Я роблю це для того, щоб діагностувати проблеми на цільовому хроту.
користувач2284570

-1

Ви можете використовувати nohupкоманду для запуску служб у chroot. httpdНаприклад, щоб почати службу, я роблю це так.

nohup httpd /dev/null &

щоб зупинити це pkill httpd


Що з такими службами, як Dbus, які можуть бути запущені лише встановленим бінарним системним скриптом?
користувач2284570

Ви можете запустити такі служби з його каталогу за допомогою команди start.
ellooku

Що є символьним посиланням проти systemctl. Так що це не працює.
користувач2284570

Я роблю це весь час на Fedora, який працює на моєму Android. Можливо, я не знаю, у чому ваша проблема.
ellooku

Наслідком цього є наступне повідомлення: Running in chroot, ignoring request.. Я не думаю, що ти робиш це постійно, хоч chroot. Дійсно, сценарій запуску вимагає systemd.
користувач2284570
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.