Starten Sie einen systemd-Dienst in chroot

38

Mit Init-Skripten (oder mit openrc) konnte ich immer Dienste von einem anderen Installationsstamm ausführen.
aber wenn ich renne, habe chroot /somepath/to_root /usr/bin/systemctl start someserviceich:

Running in chroot, ignoring request.

Gibt es eine Möglichkeit, das Ausführen des Dienstes durch systemd zu erzwingen?

Update:
Ich habe vergessen zu sagen, dass mein Host-System Init-Skripte oder openrc ausführt, aber niemals systemd, und dass ich chroot verwende, um Unix-Systeme zu stören, die nicht einmal eine minimale Shell starten können.

user2284570
quelle
1
Ich muss auch Dienste in eine Chroot ausführen, es hat immer vor openrc2 funktioniert, scheint jetzt unmöglich zu sein (
neofutur
Sie versuchen das falsche Problem zu lösen. Wenn Sie OpenRC haben, müssen Sie den systemd-Dienst in einen OpenRC-Dienst konvertieren. Daran führt kein Weg vorbei.
Daniel B
@ DanielB: NEIN! Haben Sie jemals von systemrescuecd gehört?
user2284570
Nein, ich verstehe auch nicht, wie es mit Ihrer Frage zusammenhängt.
Daniel B

Antworten:

29

Ein bekanntes Problem in Systemdistributionen (Arch Linux, OpenSUSE, Fedora).

Systemd ersetzt sysvinit und bietet einen großen Vorteil gegenüber diesem. Wenn Sie in sysvinit einen Dienst zum Starten auffordern, erbt er den Ausführungskontext der Person, die das Skript aufruft, einschließlich Umgebungsvariablen, ulimits usw. Systemd verbessert dies im Gegenteil, indem es einen Daemon benachrichtigt, der den Dienst in einer genau definierten, fehlerfreien und konstanten Umgebung startet, in der die Leistungen der Dienste natürlich viel einfacher vorherzusagen sind, da die Umgebung immer dieselbe ist.

Dies impliziert, dass, wenn ich systemctl aus der Chroot heraus aufrufe, es irrelevant ist, dass ich mich in der Chroot befinde, die Umgebung, die vererbt wird, immer noch die von PID 1 ist, nicht meine aktuelle. Aber es wird noch schlimmer: Da Kommunikationssockets in / run / systemd platziert sind, kann ein Prozess in einer Chroot nicht einmal mit dem Init-System sprechen!

Wie gehst du also vor, wenn du in Systemdistros chrootest?

  1. Wenn Sie nur einen Linux-Container haben möchten, erfahren Sie auf dieser Arch-Wiki-Seite , wie Sie dank in weniger als 30 Sekunden einen Linux-Container einrichten systemd-nspawn.

  2. Wenn Sie stattdessen wirklich eine Chroot-Umgebung wünschen, bietet Ihnen diese schöne und kristallklare Webseite zwei funktionierende Lösungen (die zweite ist eine modifizierte Version der unter Punkt 1 angebotenen).

MariusMatutiae
quelle
Ich habe gesucht, systemd-nspawnaber ich kann es nicht ausführen. Und nein, dies gilt nicht für einen Container, da der Dienst sowohl vom Host als auch von der Zielarchitektur verwendet werden muss.
user2284570
2
Dass ich nie systemd in meinem Hostsystem root benutze. In meinem Fall kann ich systemd nicht mit openrc mischen.
user2284570
1
@TwoD Das geht nicht. Das Ausführen systemd-nspawnschlägt mit "Nicht auf einem System ausgeführt" fehl. es sei denn, der Host verwendet ebenfalls systemd.
HDV
1
@TwoD Und ich antwortete, weil es für mich überhaupt nicht so klingt. :) "Ich kann es nicht ausführen" ist eine seltsame Aussage, wenn Sie Probleme haben, die ausführbare Datei zu finden. Aus diesem Grund vermute ich, dass das Problem das ist, was ich in meinen Kommentar geschrieben habe: Beim Ausführen wird diese Fehlermeldung ausgegeben und nicht nichts Nützliches tun. Aber selbst wenn sich herausstellt, dass das Problem tatsächlich darin bestand, wo es zu finden war, hilft es nicht systemd-nspawn, auf die neue Wurzel zu zeigen. Entweder hat der Host es bereits (weil er systemd ausführt). In diesem Fall kann die Host-Version verwendet werden, oder der Host hat es nicht, aber die Version des neuen Roots funktioniert nicht.
HDV
1
systemdwird sich weigern, eingelaufen zu werdenchroot
Erkin Alp Güney
4

systemd Ignoriert nur "Dienste", daher führe ich die Daemon-Befehle nur manuell aus.

Also statt

service sshd start

ich benutze

/usr/sbin/sshd -D &
johnP
quelle
Dies funktioniert nicht bei allen Diensten. Einige müssen als Teil des Systemdienststarters wie Xorg gestartet werden.
user2284570
startxwird arbeiten für Xorg.
Erkin Alp Güney
@ ErkinAlpGüney: nicht in chroot ... Wegen Dbus.
user2284570
4

Einige Jahre später muss ich zugeben, dass es für die meisten praktischen Probleme von Systemd nur eine Lösung gibt. Weil der Fehler Systemd selbst ist

Ich habe wirklich genug von Systemd, da ich Probleme hatte, die ich nie mit Dingen wie Upstart oder Openrc hatte:

  • Die Durchsetzung eines Kernels, der die Unterstützung von cgroups erfordert (anstatt optional, aber standardmäßig in einer Konfigurationsdatei aktiviert), auch für eingebettete Systeme mit nur 24 MB RAM und ohne beschreibbaren Speicher.
  • Trotz des Anspruchs modular zu sein, macht die Abhängigkeitshölle es zur Laufzeit zu einem starken Gott-Objekt: Möchten Sie über ein einzelnes reiser4-Rootfs booten? Es ist nicht möglich, da viele Programme erfordern systemd-udevd, systemd-initwas das systemd-bootPaket erfordert , das nicht gleichzeitig installiert werden kann und auch keine grub2Kernel-Images von einer reiser4-Partition lesen kann.
  • Möchten Sie über Bluetooth eine Verbindung zum Internet herstellen? Wenn es mit Ihrem Samsung Java Me-Telefon nicht funktioniert, können Sie die Skripts und die Befehlszeilensoftware, die zuvor aufgrund von manuell ausgeführt wurden, nicht ausführen networkd.
  • Das größte Problem besteht jedoch darin, dass Sie eine eigene Linux-Distribution erstellen und warten: Das systemd init-Modul selbst weist so viele Abhängigkeiten auf, dass Sie nicht vorschlagen können, ein anderes init-System über verschiedene Installationspakete auszuwählen.
  • Viel Glück beim Anzeigen von Protokollen, wenn Sie in Ihrem System kein Chroot ausführen können oder wenn Sie ein Upgrade von libdb4.8 durchgeführt haben (im schlimmsten Fall hat Microsoft die Protokolldateien im XML-Format) .

Die einzige Lösung :

Systemd ist für das Lösen von Problemen unnötig komplex: Wie Alsa anstelle von OSSV4. Wenn Sie also etwas haben, das systemd verwendet, wischen Sie einfach alle Daten ab:

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

und installieren Sie etwas, das es überhaupt nicht verwendet, während Sie Probleme mit SysV Init wie Gentoo mit Openrc lösen.
Bezüglich meiner Frage macht systemd Dinge wie die Windows®-Registrierung: Wenn ein Teil davon vermasselt wird, dann ist es vorbei.

user2284570
quelle
3
Bitte beachte, dass das Design von etwas wirklich verhindern kann, dass eine Antwort kommt, so dass die Antwort darin besteht, zu etwas zu wechseln, das funktioniert . Und das ist eine echte Antwort.
user2284570
1
Ich war der gleichen Meinung, jetzt bin ich ein bisschen ausgeglichener. Systemd hat den super großen Vorteil, dass es wirklich töten kann, was getötet werden sollte . Dies liegt daran, dass alle gegabelten Unterprozesse mit der Kernel-cgroup-Funktion nachverfolgt werden. Keines der älteren Tools kann das. Erinnern Sie sich auch an den Mist der Skripte in /etc/init/*.sh?I, aber es ist heute nur eine schlechte Erinnerung für mich. Die systemd Service - Dateien sind klar und rund 10 Zeilen lang configs . Nicht 200 Zeilen lange Skripte . Diese enormen Vorteile hat das Systemd, ich bin damit einverstanden, dass alle anderen Funktionen nachteilig sind.
Peter sagt, Monica
Übrigens, ich habe Ihre Antwort positiv bewertet, weil genau diese Art von Kritikern neben ihren Vorteilen genau in diesem Ton das sind, was die Systementwicklung zur Verbesserung benötigt. Ich habe zum Beispiel gerade versucht, ein Postgresql in einer Chroot zu starten, und ich musste mein Root-System bescheißen, um das zu tun. Viele, viele beschissene Sachen sind immer noch da, richtig.
Peter sagt, dass Monica
@peterh: leider teilen nicht alle es ich meine bis zum löschen des posts. Hier geht es nicht um SysV init gegen Systemd, sondern eher um Openrc oder sogar Upstart (was kurze Startskripten sowie den parallelen Start von Diensten ermöglicht). Zumindest habe ich eines gelernt: Darwin ist meistens das ᴏꜱ von Apple ™ Windows ist das ᴏꜱ von Microsoft und Linux-Design wird meistens von Red Hat betrieben. Obwohl SysV init langsamer ist, werden Sie nicht darauf beschränkt, was Sie zur Laufzeit tun können.
user2284570
@peterh Services-Skripte sind auch bei Verwendung von Openrc sehr klar. Das Problem mit cgroup unter Systemd ist, dass dies keine Option ist, die verhindert, dass Systemd Dinge wie Darwin oder NetBSD ausführt.
user2284570
3

Nein. Dienste werden von systemd (pid 1) ausgeführt, nicht direkt von systemctl (das nur eine Startanforderung sendet), und da systemd außerhalb der chroot ausgeführt wird, wird der Dienst auch ausgeführt.

Obwohl es technisch möglich sein könnte, dies zu implementieren (indem systemctl irgendwie seine Wurzel an systemd weitergibt), ist dies eher unwahrscheinlich, da es bereits ein Tool zum Erstellen vollständiger Container gibt ( systemd-nspawn /somepath/to_root). Sie können sich jedoch jederzeit an die Mailingliste wenden .

Grawity
quelle
1
Schön, aber ich muss systemctl verwenden, da mein Hostsystem oepnrc verwendet. Ich möchte eine vollständige unabhängige Lösung
user2284570
3
Ich werde das Wasser noch weiter trüben, indem ich sage: Psst! Erwähnen Sie RootDirectory=auch, da Sie so gefährlich wenig Gegenstimmen haben. (-:
JdeBP
@JdeBP: Was ist der Unterschied (in Bezug auf die Ergebnisse) zwischen der Variablen RootDirectoryund dem chrootBefehl?
user2284570
@grawity: Also was hängt an wenn das pid 1init ist?
user2284570
1

Konfrontiert dieses Problem einmal versucht, Netzwerk im Rettungsmodus mit Netzwerkkonfiguration von Chroot zu bringen. Endlich funktioniert das bei mir:

service --skip-redirect <service> restart

oder:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart
roter Punkt
quelle
Nett. Es funktioniert jedoch nur mit älteren Init-kompatiblen Diensten (funktioniert nicht für Netzwerke in Fedora Rawhide) . Wie ich in meiner Antwort sagte, besteht die wirkliche Lösung darin, alles zu vermasseln, was systemd verwendet.
user2284570
0

Wenn Sie einen Dienst im inetd-Stil mit Socket-Aktivierung starten, sollten Sie erwägen, stunnel stattdessen mit einer Konfigurationsdatei zu starten, die sowohl eine Chroot als auch Ihre Binärdatei als Startziel im inetd-Stil angibt.

Beachten Sie, dass Sie möglicherweise SELINUX-Probleme haben. Auf einem Oracle Linux 7.1-System musste ich "chcon -v --type = stunnel_etc_t" für alle Dateien ausführen, die stunnel zum Lesen benötigte.

Sie müssen die TLS-Verschlüsselung auf der Clientseite des Sockets verwenden (dh einen anderen Stunnel mit "client = yes" in der Konfiguration). Lassen Sie mich wissen, wenn Sie weitere Details dazu wünschen.

chas
quelle
Nein, es geht um Dinge wie D-Bus. Ich mache es, um Probleme auf der Ziel-Chroot zu diagnostizieren.
user2284570
-1

Sie können den nohupBefehl verwenden, um Dienste in chroot zu starten. Zum httpdBeispiel, um den Service zu starten , mache ich das so.

nohup httpd /dev/null &

um es zu stoppen pkill httpd

Ellooku
quelle
Was ist mit Diensten wie Dbus, die nur mit dem installierten binären systemd-Skript gestartet werden können?
user2284570
Sie können solche Dienste aus ihrem Verzeichnis mit dem Befehl start starten.
Ellooku
Welches ist ein Symlink gegen systemctl. Also klappt es nicht.
user2284570
Ich mache das die ganze Zeit auf Fedora, das auf meinem Android läuft. Vielleicht weiß ich nicht, was dein Problem ist.
Ellooku
Die Folge davon ist diese Meldung: Running in chroot, ignoring request.. Ich glaube nicht, dass du es die ganze Zeit machst, obwohl du in der Chroot bist. In der Tat erfordert das Startskript systemd.
user2284570