Linux Boots

Wie sich herausstellt, hat der Startvorgang nicht viel zu bieten:

1. Ein Bootloader Findet das Kernel-Image auf der Festplatte, lädt sie in den Speicher und startet es.
2. Der Kernel initialisiert die Geräte und STI-Treiber.
3. Der Kernel stellt die Wurzel bereit filesystem.
4. Der Kernel beginnt init aufgerufen, um zu planen.
5. init setzt den Rest der Prozesse in Bewegung.
6. Die letzten Prozesse, die init startet als Teil des Boot-Sequenz, die Sie für die Anmeldung zu ermöglichen.

Das Identifizieren jeder Phase des Startvorgangs ist von unschätzbarem Wert, um Startprobleme zu beheben und die Probleme zu verstehen system als Ganzes. Stellen Sie zunächst den Bootloader ein. Dies ist der Startbildschirm oder die Eingabeaufforderung, die Sie erhalten, nachdem der Computer seinen Selbsttest beim Einschalten durchgeführt hat, und fragen Sie, welche Funktion ausgeführt werden soll system laufen. Nachdem Sie eine Auswahl getroffen haben, führt der Bootloader den Linux-Kernel aus und übergibt die Kontrolle über das system zum Kernel.

Es gibt eine ausführliche Diskussion des Kernels anderer Stelle in diesem Buch, aus dem dieser Artikel ist ein Auszug. Dieser Artikel behandelt die Kernel-Initialisierung der BühneDies ist die Phase, in der der Kernel eine Reihe von Nachrichten über die auf dem Computer vorhandene Hardware druckt system. Der Kernel startet init unmittelbar nachdem eine Meldung angezeigt wird, dass der Kernel den gemountet hat Wurzel filesystem:

VFS: Mounted root (ext2 filesystem) schreibgeschützt.

Bald darauf sehen Sie eine Meldung über das Starten von init, gefolgt von system Dienststartmeldungen, und schließlich erhalten Sie eine Anmeldeaufforderung.

HINWEIS Auf Red Hat LinuxDer Init-Hinweis ist besonders offensichtlich, da er Sie bei "Red Hat Linux" "willkommen heißt". Alle Meldungen danach zeigen Erfolg oder Misserfolg in Klammern auf der rechten Seite des Bildschirms.

Die meisten in diesem Kapitel beschäftigt sich mit init, Weil es der Teil der Boot-Sequenz, wo man die meiste Kontrolle ist.
init

Init hat nichts Besonderes. Es ist ein Programm wie jedes andere unter Linux system, und Sie finden es in / sbin zusammen mit anderen system Binärdateien. Der Hauptzweck von init besteht darin, andere Programme in einer bestimmten Reihenfolge zu starten und zu stoppen. Sie müssen nur wissen, wie diese Sequenz funktioniert.

Es gibt einige verschiedene Varianten, aber die meisten Linux-Distributionen verwenden die System V-Stil hier diskutiert. Einige Distributionen verwenden eine einfachere Version, die dem BSD-Init ähnelt, aber es ist unwahrscheinlich, dass Sie darauf stoßen.

Runlevels

Zu jeder Zeit unter Linux systemwird ein bestimmter Basissatz von Prozessen ausgeführt. Dieser Zustand der machine heißt sein Runlevel und wird mit einer Zahl von 0 bis 6 bezeichnet system verbringt die meiste Zeit in einem einzigen Runlevel. Wenn Sie jedoch die macNach unten wechselt init zu einem anderen Runlevel, um das zu beenden system ordentliche Dienste und den Kernel anzuweisen, anzuhalten. Ein weiteres Runlevel ist für den Einzelbenutzermodus, der später erläutert wird.

Der einfachste Weg, Runlevel in den Griff zu bekommen, besteht darin, die Init-Konfiguration zu untersuchen file, / etc / inittab. Suchen Sie nach einer Zeile wie der folgenden:

ID: 5: initdefault:

Diese Zeile bedeutet, dass die default Runlevel auf der system ist 5. Alle Zeilen im inittab file Nehmen Sie diese Form an, wobei vier durch Doppelpunkte getrennte Felder in der folgenden Reihenfolge vorkommen:
# Eine eindeutige Kennung (eine kurze Zeichenfolge, wie ID in dem vorangehenden Beispiel)
# Die geltenden Runlevel (n)
# Die Aktion, die init ausführen soll (im vorherigen Beispiel besteht die Aktion darin, die festzulegen default Runlevel bis 5)
# A auszuführende Befehl (optional)

In der vorhergehenden Init ist kein Befehl auszuführendefault Beispiel, weil ein Befehl im Kontext des Festlegens des Befehls keinen Sinn ergibt default Runlevel. Schauen Sie in inittab etwas weiter unten, bis Sie eine Linie wie diese sehen:

l5: 5: wait :/ etc / rc.d / rc 5

Diese Zeile löst die meisten aus system Konfiguration und Dienste über die Verzeichnisse rc * .d und init.d. Sie können sehen, dass init so eingestellt ist, dass es in Runlevel 5 einen Befehl namens /etc/rc.d/rc 5 ausführt. Die Aktion wait gibt an, wann und wie init den Befehl ausführt: Führen Sie rc 5 einmal aus, wenn enterWarten Sie, bis dieser Befehl beendet ist, bevor Sie etwas anderes tun.

Es gibt verschiedene Aktionen in addzu initiierendefault und warten Sie, insbesondere in Bezug auf die Energieverwaltung, und auf der Handbuchseite inittab (5) erfahren Sie alles darüber. Diejenigen, denen Sie am wahrscheinlichsten begegnen, werden in den folgenden Abschnitten erläutert.

respawn

Die Respawn-Aktion bewirkt, dass init den folgenden Befehl ausführt und ihn erneut ausführt, wenn die Ausführung des Befehls abgeschlossen ist. Sie werden wahrscheinlich etwas Ähnliches wie diese Zeile in Ihrem Inittab sehen file:

1: 2345: respawn :/ sbin / mingetty tty1

Die getty-Programme bieten Anmeldung aufgefordert. Die vorangehende Zeile ist für die erste virtuelle Konsole (/ dev / tty1), die, die Sie sehen, wenn Sie ALT oder STRG-ALT-F1 F1 drücken. Die Respawn-Aktion wird die Login-Prompt zurück, nachdem Sie sich abmelden.

ctrlaltdel

Das ctrlaltdel action steuert was die system Dies geschieht, wenn Sie auf einer virtuellen Konsole CONTROL-ALT-DELETE drücken. Auf den meisten systems, dies ist eine Art Neustartbefehl mit dem Befehl shutdown.

sysinit

Die sysinit-Aktion ist das allererste, was init beim Start ausführen sollte enterin allen Runlevels.

Wie Prozesse in Runlevel starten

Sie können jetzt lernen, wie Sie das initiieren system Dienste, kurz bevor Sie sich anmelden können. Erinnern Sie sich an diese inittab Zeile von früher:

l5: 5: wait :/ etc / rc.d / rc 5

Dieses kleine Linie löst viele andere Programme. RC steht für Stellbefehle, und Sie werden hören, wie Leute beziehen sich auf die Befehle wie Skripte, Programme oder Dienstleistungen. Also, wo sind diese Befehle überhaupt?

In diesem Beispiel befinden sich die Befehle für Runlevel 5 wahrscheinlich entweder in /etc/rc.d/rc5.d oder /etc/rc5.d. Runlevel 1 verwendet rc1.d, Runlevel 2 verwendet rc2.d und so weiter. Möglicherweise finden Sie Folgendes items im Verzeichnis rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

Die rc 5 Befehl startet Programme in diesem Runlevel-Verzeichnis, indem Sie die folgenden Befehle:

S10sysklogd Hause
S12kerneld Hause
S15netstd_init Hause
S18netbase Hause
...
S99sshd Hause

Beachten Sie die Start-Argument in jedem Befehl. Das S in einem Befehl Name bedeutet, dass der Befehl im Start-Modus ausgeführt werden soll, und die Anzahl (00 durch 99) bestimmt, wo in der Folge rc startet das Kommando.

Die rc *. D Befehle beginnen in der Regel Programme, die Shell-Skripte in / sbin oder / usr / sbin. Normalerweise können Sie herausfinden, was einen der Befehle eigentlich gar Dazu suchen Sie in das Skript mit weniger oder Pager ein anderes Programm.

Sie können einen dieser Dienste von Hand starten. Wenn Sie beispielsweise das httpd-Webserverprogramm manuell starten möchten, führen Sie S99httpd start aus. Ebenso, wenn Sie jemals einen der Dienste beenden müssen, wenn die macWenn eingeschaltet ist, können Sie den Befehl im Verzeichnis rc * .d mit dem Argument stop ausführen (z. B. stop S99httpd).

Einige rc * .d-Verzeichnisse enthalten Befehle, die mit K beginnen (für "kill" oder "stop" -Modus). In diesem Fall führt rc den Befehl mit dem Argument stop anstelle von start aus. Es ist am wahrscheinlichsten, dass Sie K-Befehlen in Runlevels begegnen, die das schließen system nach unten.

AddDienste aktivieren und entfernen

Wenn du möchtest add, löschen oder ändern Sie Dienste in den rc * .d-Verzeichnissen, müssen Sie sich die files drinnen. Eine lange Auflistung zeigt eine Struktur wie diese:

lrwxrwxrwx. . . S10sysklogd -> .. / init.d / sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d / kerneld
lrwxrwxrwx. . . S15netstd_init -> .. / init.d / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d / netbase
...

Die Befehle in einem rc * .d-Verzeichnis sind eigentlich symbolische Links zu files in einem init.d-Verzeichnis, normalerweise in / etc oder /etc/rc.d. Linux-Distributionen enthalten diese Links, sodass sie für alle Runlevel dieselben Startskripte verwenden können. Diese Konvention ist keineswegs erforderlich, erleichtert jedoch häufig die Organisation.

Um zu verhindern, dass einer der Befehle im Verzeichnis init.d in einem bestimmten Runlevel ausgeführt wird, können Sie den symbolischen Link im entsprechenden Verzeichnis rc * .d entfernen. Dies funktioniert zwar, aber wenn Sie einen Fehler machen und den Link jemals wieder einfügen müssen, können Sie sich möglicherweise nicht mehr an den genauen Namen des Links erinnern. Daher sollten Sie Links in den rc * .d-Verzeichnissen nicht entfernen, sondern add ein Unterstrich (_) am Anfang des Linknamens wie folgt:

mv S99httpd _S99httpd

Beim Booten ignoriert rc _S99httpd, da es nicht mit S oder K beginnt. Außerdem ist der ursprüngliche Name immer noch offensichtlich, und Sie haben schnellen Zugriff auf den Befehl, wenn Sie in einer Notlage sind und ihn von Hand starten müssen.

Zu add B. einen Dienst, müssen Sie ein Skript wie die anderen im Verzeichnis init.d erstellen und dann einen symbolischen Link im richtigen Verzeichnis rc * .d erstellen. Der einfachste Weg, ein Skript zu schreiben, besteht darin, die bereits in init.d vorhandenen Skripte zu untersuchen, eine Kopie eines verständlichen Skripts zu erstellen und die Kopie zu ändern.

Wann addStellen Sie beim Starten eines Dienstes sicher, dass Sie eine geeignete Stelle in der Boot-Sequenz auswählen, um den Dienst zu starten. Wenn der Dienst zu früh startet, funktioniert er aufgrund einer Abhängigkeit von einem anderen Dienst möglicherweise nicht. Für nicht wesentliche Dienste, die meisten systems Administratoren bevorzugen Nummern in den 90er Jahren, nach den meisten Diensten, die mit dem geliefert wurden system.

Normalerweise Linux-Distributionen mit einem Befehl zu aktivieren und deaktivieren Dienstleistungen im rc * kommen. D Verzeichnisse. Zum Beispiel in Debian, ist der Befehl update-rc.d, und Red Hat Linux ist der Befehl chkconfig. Grafische Benutzeroberflächen ist ebenfalls verfügbar. Mit HILFT Diese Programme halten die Start-Verzeichnisse konsistenten und hilft bei Upgrades.

TIPP: Eines der gängigsten Linux installationsprobleme ist ein falsch konfigurierter XFree86-Server, der ein- und ausschaltet, wodurch die system auf der Konsole unbrauchbar. Um dieses Verhalten zu stoppen, starten Sie den Einzelbenutzermodus und ändern Sie Ihre Runlevel- oder Runlevel-Dienste. Suchen Sie in Ihren Verzeichnissen rc * .d oder in Ihrem Verzeichnis / etc / inittab nach etwas, das xdm, gdm oder kdm enthält.

Controlling init

Gelegentlich müssen Sie init einen kleinen Tritt geben, um ihm zu sagen, dass er die Runlevel wechseln soll, um das Inittab erneut zu lesen fileoder einfach nur zu shut down the system. Weil init immer der erste Prozess auf einem ist systemist seine Prozess-ID immer 1.

Sie können steuern, init mit Sellerie. Zum Beispiel, wenn Sie in den Runlevel 3 wechseln möchten, verwenden Sie folgenden Befehl:

telinit 3

Beim Wechseln der Runlevel versucht init, alle Prozesse abzubrechen, die nicht im inittab enthalten sind file für das neue Runlevel. Daher sollten Sie vorsichtig sein, wenn Sie die Runlevel ändern.

Wenn Sie brauchen, um add oder Respawning-Jobs entfernen oder andere Änderungen an der inittab . vornehmen filemüssen Sie init über die Änderung informieren und sie erneut lesen lassen file. Einige Leute benutzen kill -HUP 1, um init anzuweisen, dies zu tun. Diese traditionelle Methode funktioniert auf den meisten Unix-Versionen, sofern Sie sie korrekt eingeben. Sie können diesen telinit-Befehl jedoch auch ausführen:

telinit q

Sie können auch telinit s in den Single-User-Modus zu wechseln.

Herunterfahren

init steuert auch, wie die system fährt herunter und startet neu. Der richtige Weg zu shut down und Linux machine soll den Befehl shutdown verwenden.

Es gibt zwei grundlegende Möglichkeiten, das Herunterfahren zu verwenden. Wenn Sie die anhalten system, es schließt die machineingehen und es unten halten. Um das zu machen macsofort anhalten, diesen Befehl verwenden:

shutdown-h now

Am modernsten macBei einigermaßen neueren Linux-Versionen wird die Stromversorgung durch einen Stopp unterbrochen machineingehen. Sie können das auch neu starten machineingehen. Verwenden Sie für einen Neustart -r anstelle von -h.

Das Herunterfahren dauert einige Sekunden. Sie sollten a niemals zurücksetzen oder ausschalten macin dieser Phase hineingehen.

Im vorhergehenden Beispiel ist jetzt die Zeit dafür shut down. Dieses Argument ist obligatorisch, es gibt jedoch viele Möglichkeiten, es anzugeben. Wenn du das willst macWenn Sie irgendwann in der Zukunft nach unten gehen möchten, können Sie + n verwenden, wobei n die Anzahl der Minuten ist, die das Herunterfahren warten soll, bevor die Arbeit ausgeführt wird. Weitere Optionen finden Sie auf der Handbuchseite zum Herunterfahren (8).

Um das zu machen system Neustart in 10 Minuten, führen Sie diesen Befehl aus:

shutdown-r + 10

Unter Linux benachrichtigt das Herunterfahren alle angemeldeten Personen machine geht runter, aber es macht wenig echte Arbeit. Wenn Sie eine andere Zeit als jetzt angeben, wird beim Herunterfahren eine erstellt file genannt / etc / nologin. Wenn das file vorhanden ist, die system verbietet Anmeldungen von Personen außer dem Superuser.

Wann system Die Abschaltzeit kommt endlich, das Herunterfahren weist init an, für einen Stopp auf Runlevel 0 und für einen Neustart auf Runlevel 6 umzuschalten. Wenn init enterBei Runlevel 0 oder 6 finden alle folgenden Aktionen statt, die Sie anhand der Skripte in rc0.d und rc6.d überprüfen können:

1. init tötet jeden Prozess, dass es (wie es beim Einschalten zu einem anderen Runlevel).

# Die ersten Befehle rc0.d / rc6.d werden gesperrt ausgeführt system files an Ort und Stelle und andere Vorbereitungen für das Herunterfahren treffen.
# Die nächsten rc0.d / rc6.d-Befehle heben alle auf filesystems anders als die Wurzel.
# Weitere rc0.d / rc6.d-Befehle stellen das Root erneut bereit filesystem schreibgeschützt
# Noch mehr rc0.d / rc6.d-Befehle schreiben alle gepufferten Daten in die filesystem mit dem Synchronisierungsprogramm.
# Die letzten rc0.d / rc6.d Befehlen Sie den Kernel neu zu starten oder mit dem reboot, halt oder poweroff Programm zu stoppen.

Die Programme zum Neustarten und Stoppen verhalten sich für jede Runlevel unterschiedlich, was möglicherweise zu Verwirrung führen kann. durch defaultDiese Programme rufen das Herunterfahren mit den Optionen -r oder -h auf, aber wenn die system Ist der Runlevel bereits angehalten oder neu gestartet, weisen die Programme den Kernel an, sich sofort auszuschalten. Wenn du deine wirklich schließen willst macVerwenden Sie die Option -f, wenn Sie es eilig haben (ohne Rücksicht auf mögliche Schäden durch ein ungeordnetes Herunterfahren).

Technikbegeistert teste und schreibe ich gerne Tutorials zu Betriebssystemen about macOSLinux, Windows, über WordPress, WooCommerce und LEMP Webserver-Konfiguration (Linux, NGINX, MySQL und PHP). ich schreibe weiter StealthSettings.com seit 2006, und ein paar Jahre später begann ich, auf iHowTo.Tips Tutorials und Neuigkeiten über Geräte im Ökosystem zu schreiben Apple: iPhoneiPad Apple Uhr, HomePod, iMac, MacBook, AirPods und Zubehör.

Hinterlasse einen Kommentar