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.
Odpowiedzi:
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?
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
.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).
źródło
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ą.systemd-nspawn
kończy się niepowodzeniem z „Nie działa na systemie systemowym”. chyba że host używa także systemd.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ć.systemd
odmówi wpadnięciachroot
systemd
ignoruje tylko „usługi”, więc uruchamiam polecenia demona ręcznie.Więc zamiast
używam
źródło
startx
będzie działać dlaXorg
.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ż.źródło
RootDirectory=
jak również dlatego, że masz tak niebezpiecznie mało głosów. (-:RootDirectory
ichroot
dowództwo?pid 1
jest w tym?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:
lub:
źródło
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:
systemd-udevd
co wymagasystemd-init
co wymagasystemd-boot
pakiet, którego nie można zainstalować w tym samym czasiegrub2
ani nie można odczytać obrazów jądra z partycji reiser4.networkd
.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:
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.
źródło
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.
źródło
Możesz użyć
nohup
polecenie uruchomienia usług w chroot. Zacząćhttpd
na przykład usługa, robię to w ten sposób.zatrzymać to
pkill httpd
źródło
Running in chroot, ignoring request.
. Nie sądzę, żebyś robił to cały czas, chroot. Rzeczywiście, skrypt startowy wymaga systemd.