Co by się stało, gdyby init został usunięty?

22

Tylko teoretyczne pytanie ...

Ale co by się stało, gdyby init(w /sbin/init) zostałby usunięty?

Kaz Wolfe
źródło
Nie próbuj ln -L- to nie zadziała. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initdziała jednak. Użycie APT do ponownej instalacji upstartu nie jest tak oczywiste dpkg, ponieważ nie będzie wiedział, że domyślnie zniknęło. „Pakiet upstart jest już w bieżącej wersji”. Mógłbyś dpkg --force-depends --force-remove-essential -r upstartpierwszy.
Joshua
1
apt-get install --reinstall upstart. Poza tym nie mam /proc/fdkatalogu. I właśnie sprawdziłem, ln -L /proc/1/exe /tmp/initdziała z /sbin/initprzemianowaną na /sbin/init.bak, tj. Mogę /tmp/initpotem czytać bez problemu .
Ruslan
@muru OK. Dodam wtedy synonim tagu.
Kaz Wolfe

Odpowiedzi:

31

Program ładujący załaduje jądro, jądro spróbuje uruchomić init, nie znajdzie go i wpadnie w panikę.

Wyjściem z niego jest restart, edycja parametrów rozruchu, dodawanie init=/bin/bashi uruchamianie w ten sposób. Jądro użyje bash jako init. To da ci szansę na uruchomienie poleceń i naprawienie systemu.

Korekta
Najwyraźniej jądro (plik init / main.c ):

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
        return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

Więc znalazłby / bin / sh (który jest linkiem do myślnika), a to da ci powłokę i szansę na naprawienie jej bez użycia init=/bin/bashparametru boot.

surfowanie
źródło
Świetna odpowiedź. Nie wiedziałem, że jądro szuka czegoś więcej niż /sbin/init.
Ruslan
A jeśli nie ma /bin/shpliku? Lub /bin/bashlub /bin/dashitp? Nie wiesz, jak możesz usunąć je wszystkie jednocześnie, ale co by się stało teoretycznie?
trysis
Cóż, wtedy zobaczyłbyś panikę jądra, część odpowiedzi powyżej linii korekcji . Ale nie rób tego w systemie, którego potrzebujesz. Poważnie, nie rób tego. Jeśli chcesz eksperymentować (i jest to dobre ćwiczenie), utwórz maszynę wirtualną Virtualbox, zepsuć ją i spróbować naprawić. BTW, odpowiedź 200_success też nie jest zła.
sмurf
12

Nic się nie dzieje, dopóki nie spróbujesz zrestartować komputera. Dopóki system działa, a ty nie próbujesz przełączać poziomów pracy , uruchamiając /sbin/init n , nawet nie zdajesz sobie sprawy, że zniknął.

W rzeczywistości usunięcie nie /sbin/initjest możliwe, jeśli wcześnie zdasz sobie sprawę z błędu i zachowasz spokój. Administratorzy systemu wyzdrowiali z dużo bardziej paskudnych „lobotomii” , utrzymując system operacyjny w działaniu.

Jednym ze sposobów odzyskania po usunięciu /sbin/initjest ponowna instalacja upstartpakietu za pomocą APT.

Macho sposobem na odzyskanie jest użycie tylko zasobów na samej maszynie. Jednym z czynników na twoją korzyść jest to, że /sbin/initzawsze działa. Dlatego po uruchomieniu rm /sbin/initplik jest jedynie odłączany od systemu plików. Zawartość i-węzła i zawartości pliku pozostaje na dysku i w pamięci do momentu wyjścia PID 1. Musisz tylko ponownie utworzyć /sbin/initz odpowiedniego i-węzła.

Najprostszym sposobem, aby to osiągnąć jest:

# cp /proc/1/exe /sbin/init
# chmod 755 /sbin/init
200_sukces
źródło