Uruchom systemową usługę w chroot

31

W skryptach init (lub z openrc) zawsze mogłem uruchamiać usługi z innego katalogu głównego instalacji.
ale kiedy biegnę chroot /somepath/to_root /usr/bin/systemctl start someservice Mam:

Running in chroot, ignoring request.

Czy istnieje sposób na wymuszenie systemowego uruchomienia usługi?

Aktualizacja:
Zapomniałem powiedzieć, że mój system hosta uruchamia skrypty inicjujące lub openrc, ale nigdy systemowy, i że używam chroot do kłopotliwych systemów uniksowych, które nie mogą nawet uruchomić minimalnej powłoki.

user2284570
źródło
1
Muszę także uruchamiać usługi w chroocie, zawsze działało przed openrc2, wydaje się teraz niemożliwe; (
neofutur
Próbujesz rozwiązać niewłaściwy problem. Jeśli masz OpenRC, musisz przekonwertować usługę systemd na usługę OpenRC. Naprawdę nie da się tego obejść.
Daniel B
@DanielB: NIE! Czy kiedykolwiek słyszałeś o systemrescud?
user2284570
Nie. Nie widzę też, jak to odnosi się do twojego pytania.
Daniel B

Odpowiedzi:

25

Dobrze znany problem w dystrybucjach systemowych (Arch Linux, OpenSUSE, Fedora).

Systemd zastępuje sysvinit i zapewnia jedną wielką przewagę nad tym. W sysvinit, gdy poprosisz usługę o uruchomienie, dziedziczy kontekst wykonania osoby wywołującej skrypt, która zawiera zmienne środowiskowe, ulimity i tak dalej. Systemd poprawia to przeciwnie, powiadamiając demona, który uruchomi usługę w dobrze zdefiniowanym, zdrowym, stałym środowisku, gdzie oczywiście wydajność usług jest znacznie łatwiejsza do przewidzenia, ponieważ środowisko jest zawsze takie samo.

Oznacza to, że gdy wywołam systemctl z chroota, nie ma znaczenia, że ​​jestem wewnątrz chroot, środowisko, które będzie dziedziczone, nadal jest środowiskiem PID 1, a nie moim obecnym. Ale robi się gorzej: ponieważ gniazda komunikacyjne są umieszczone w / run / systemd, proces w chroocie nie będzie nawet mógł rozmawiać z systemem init!

Jak więc radzić sobie z chroot'owaniem w dystrybucjach systemowych?

  1. Jeśli wszystko, co chcesz zrobić, to mieć kontener Linuksa, ta strona Arch Wiki powie Ci, jak skonfigurować kontener Linux w mniej niż 30 sekund, dzięki systemd-nspawn.

  2. Jeśli zamiast tego naprawdę chcesz środowiska chroot, ta piękna i krystalicznie czysta strona internetowa dostarczy Ci dwa rozwiązania robocze (drugie to zmodyfikowana wersja tego z punktu # 1).

MariusMatutiae
źródło
Szukałem systemd-nspawn ale nie mogę go uruchomić. Nie, nie dotyczy to kontenera, ponieważ usługa musi być używana zarówno przez architekturę hosta, jak i docelową.
user2284570
2
Że nigdy nie używam systemd w moim systemie głównym hosta. W moim przypadku nie mogę mieszać systemd z openrc.
user2284570
1
@TwoD To nie zadziała. Bieganie systemd-nspawn kończy się niepowodzeniem z „Nie działa na systemie systemowym”. chyba że host używa także systemd.
hvd
1
@TwoD I odpowiedziałem, bo to wcale do mnie nie brzmi. :) „Nie mogę go uruchomić” to dziwna rzecz, jeśli masz problem ze znalezieniem pliku wykonywalnego, dlatego podejrzewam, że problem jest tym, co umieściłem w moim komentarzu: uruchomienie go daje ten komunikat o błędzie i nie robi nic pożytecznego. Ale nawet jeśli okaże się, że problem naprawdę się znalazł systemd-nspawn, a następnie wskazanie nowego roota nie pomoże. Albo host już go ma (ponieważ działa systemd), w którym to przypadku można użyć wersji hosta, albo host go nie ma, ale wersja nowego roota nie będzie działać.
hvd
1
systemd odmówi wpadnięcia chroot
Erkin Alp Güney
3

systemd ignoruje tylko „usługi”, więc uruchamiam polecenia demona ręcznie.

Więc zamiast

service sshd start

używam

/usr/sbin/sshd -D &
johnP
źródło
To nie działa dla wszystkich usług. Niektóre wymagają uruchomienia jako część startera usługi systemowej, takiego jak Xorg.
user2284570
startx będzie działać dla Xorg.
Erkin Alp Güney
@ ErkinAlpGüney: nie w chroot… Z powodu Dbus.
user2284570
2

Nie. Usługi są wykonywane przez systemd (pid 1), nie przez systemctl bezpośrednio (który wysyła tylko żądanie uruchomienia), a ponieważ systemd działa poza chroot, tak samo będzie z usługą.

Chociaż technicznie możliwe byłoby zaimplementowanie tego (przez sprawienie, aby systemctl w jakiś sposób przekazał swój root do systemd), jest to raczej mało prawdopodobne, ponieważ istnieje już narzędzie do tworzenia pełnych kontenerów ( systemd-nspawn /somepath/to_root ). Zawsze możesz skontaktować się z Lista mailingowa chociaż.

grawity
źródło
1
Miło, ale muszę użyć systemctl, ponieważ Mój system hosta używa oepnrc. Chcę pełnego niezależnego rozwiązania
user2284570
2
Jeszcze dalej zabłocę wody, mówiąc: Psst! Wzmianka RootDirectory= jak również dlatego, że masz tak niebezpiecznie mało głosów. (-:
JdeBP
@JdeBP: Jaka jest różnica (pod względem wyników) między zmienną RootDirectory i chroot dowództwo?
user2284570
@grawity: Więc co się stanie, jeśli pid 1 jest w tym?
user2284570
1

W obliczu tego problemu próbowano raz uruchomić sieć w trybie ratunkowym przy użyciu konfiguracji sieci z chroot. Wreszcie to działa dla mnie:

service --skip-redirect <service> restart

lub:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart
reddot
źródło
Ładny. Ale działa tylko ze starszymi usługami kompatybilnymi z Init (nie będzie działać w sieci w surowej skórce Fedory) . Jak powiedziałem w mojej odpowiedzi, prawdziwym rozwiązaniem jest zepsucie wszystkiego, co używa systemd.
user2284570
1

Kilka lat później muszę przyznać, że jest tylko jedno rozwiązanie większości praktycznych problemów systemowych. Ponieważ błąd to sam Systemd

Naprawdę mam dość Systemd, ponieważ miałem problemy, z którymi nigdy nie miałem do czynienia w takich sprawach jak Upstart czy Openrc:

  • Wymuszanie jądra wymagającego obsługi grup (zamiast być opcjonalnym, ale domyślnie włączonym w pliku konfiguracyjnym) nawet dla systemów wbudowanych z 24 MB pamięci RAM i nie ma możliwości zapisu.
  • Pomimo twierdzenia, że ​​jest modułowy, w czasie wykonywania piekło zależności czyni go silnym obiektem boga: chce się uruchomić za pomocą jednego rootfera reiser4? Nie jest to możliwe, ponieważ wymaga tego wiele programów systemd-udevd co wymaga systemd-init co wymaga systemd-boot pakiet, którego nie można zainstalować w tym samym czasie grub2 ani nie można odczytać obrazów jądra z partycji reiser4.
  • Chcesz połączyć się z Internetem za pomocą połączenia Bluetooth? Jeśli nie działa z telefonem Samsung java me, nie możesz uruchomić skryptów i oprogramowania wiersza poleceń, które wcześniej działały ręcznie z powodu networkd.
  • Chociaż uważam, że największym problemem jest budowanie i utrzymywanie własnej dystrybucji Linuksa: sam moduł init systemd ma tak wiele zależności, że nie można zaproponować wyboru innego systemu init za pomocą różnych pakietów instalacyjnych.
  • Powodzenia w przeglądaniu logów, jeśli nie możesz chrootować w systemie lub jeśli zaktualizowałeś z libdb4.8 (podczas gdy w najgorszym przypadku Microsoft ma pliki dziennika w formacie xml) .

Jedyne rozwiązanie :

Systemd jest niepotrzebnym kompleksem do rozwiązywania problemów: jak alsa zamiast ossv4. Więc jeśli masz coś, co używa systemd, po prostu wyczyść wszystkie dane:

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

i zainstaluj coś, czego w ogóle nie używa, podczas rozwiązywania problemów SysV Init, takich jak Gentoo z Openrc.
Jeśli chodzi o moje pytanie, system sprawia, że ​​coś takiego jak rejestr systemu Windows®: jeśli część z niego zostanie zepsuta, to się skończy.

user2284570
źródło
Proszę zauważyć, że projekt czegoś może naprawdę uniemożliwić uzyskanie odpowiedzi, więc odpowiedzią jest przejście na coś, co działa . I to jest prawdziwa odpowiedź.
user2284570
0

Jeśli uruchamiasz usługę w stylu inetd z aktywacją gniazda, rozważ zamiast tego uruchomienie stunnel z plikiem konfiguracyjnym, który określa zarówno chroot, jak i binarny obiekt docelowy w stylu inetd.

Pamiętaj, że możesz mieć problemy z SELINUX. W systemie Oracle Linux 7.1 musiałem „chcon -v --type = stunnel_etc_t” na wszystkich plikach, które stunnel musiał odczytać.

Będziesz musiał użyć szyfrowania TLS po stronie klienta gniazda (tj. Inny stunnel z „client = yes” w konfiguracji). Daj mi znać, jeśli chcesz uzyskać więcej informacji na ten temat.

chas
źródło
nie chodzi o rzeczy takie jak d-bus. Robię to, aby zdiagnozować problemy w chroocie docelowym.
user2284570
-1

Możesz użyć nohup polecenie uruchomienia usług w chroot. Zacząć httpd na przykład usługa, robię to w ten sposób.

nohup httpd /dev/null &

zatrzymać to pkill httpd

ellooku
źródło
Co z usługami takimi jak Dbus, które mogą być uruchomione tylko przez zainstalowany binarny skrypt systemowy?
user2284570
Możesz uruchomić takie usługi z katalogu za pomocą polecenia start.
ellooku
Które jest dowiązaniem symbolicznym przeciwko systemctl. Więc to nie działa.
user2284570
Robię to cały czas w Fedorze działającej na moim Androidzie. Może nie wiem, jaki jest twój problem.
ellooku
Konsekwencją jest ten komunikat: Running in chroot, ignoring request.. Nie sądzę, żebyś robił to cały czas, chroot. Rzeczywiście, skrypt startowy wymaga systemd.
user2284570