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 someservice
ich:
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.
Antworten:
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?
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
.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).
quelle
systemd-nspawn
aber 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.systemd-nspawn
schlägt mit "Nicht auf einem System ausgeführt" fehl. es sei denn, der Host verwendet ebenfalls systemd.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.systemd
wird sich weigern, eingelaufen zu werdenchroot
systemd
Ignoriert nur "Dienste", daher führe ich die Daemon-Befehle nur manuell aus.Also statt
ich benutze
quelle
startx
wird arbeiten fürXorg
.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:
systemd-udevd
,systemd-init
was dassystemd-boot
Paket erfordert , das nicht gleichzeitig installiert werden kann und auch keinegrub2
Kernel-Images von einer reiser4-Partition lesen kann.networkd
.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:
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.
quelle
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 .quelle
RootDirectory=
auch, da Sie so gefährlich wenig Gegenstimmen haben. (-:RootDirectory
und demchroot
Befehl?pid 1
init ist?Konfrontiert dieses Problem einmal versucht, Netzwerk im Rettungsmodus mit Netzwerkkonfiguration von Chroot zu bringen. Endlich funktioniert das bei mir:
oder:
quelle
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.
quelle
Sie können den
nohup
Befehl verwenden, um Dienste in chroot zu starten. Zumhttpd
Beispiel, um den Service zu starten , mache ich das so.um es zu stoppen
pkill httpd
quelle
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.