Linux Stiefel

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

1. Ein Bootloader findet das Kernel-Image auf der disk, lädt es in den Speicher und startet es.
2. Der Kernel initialisiert die Geräte und STI-Treiber.
3. Der Kernel mountet die Root-Dateisystem.
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 die Linux Kernel, Übergabe der Kontrolle über die 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 Root-Dateisystem:

VFS: Mounted root (ext2-Dateiensystem) 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 Linux, der Init-Hinweis ist besonders auffällig, weil er Sie bei Red Hat „willkommen“ heißt Linux.“ 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

Es gibt nichts Besonderes an init. Es ist ein Programm wie jedes andere auf der 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 ein paar verschiedene Variationen, 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 einem beliebigen Zeitpunkt auf a 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 Dienste ordnungsgemäß auszuführen und den Kernel anzuweisen, anzuhalten. Ein weiterer Runlevel ist für Einzelbenutzer gedacht mode, Später besprochen.

Der einfachste Weg, Runlevel in den Griff zu bekommen, besteht darin, die Init-Konfigurationsdatei /etc/inittab zu untersuchen. 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 in der inittab-Datei haben diese Form, wobei vier durch Doppelpunkte getrennte Felder in der folgenden Reihenfolge auftreten:
# 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 veranlasst init, den folgenden Befehl auszuführen und ihn erneut auszuführen, wenn die Ausführung des Befehls abgeschlossen ist. Wahrscheinlich sehen Sie in Ihrer inittab-Datei etwas Ähnliches wie diese Zeile:

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.

ctrlanderswo

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 das Startargument in jedem Befehl. Das S in einem Befehlsnamen bedeutet, dass der Befehl beim Start ausgeführt werden soll mode, und die Zahl (00 bis 99) bestimmt, wo in der Sequenz rc den Befehl beginnt.

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). mode). In diesem Fall führt rc den Befehl mit dem Argument stop statt mit start aus. Es ist am wahrscheinlichsten, dass Sie in Runleveln auf K-Befehle stoßen, die das System schließen system nach unten.

AddDienste aktivieren und entfernen

Wenn du möchtest addWenn Sie Dienste in den rc*.d-Verzeichnissen löschen, löschen oder ändern möchten, müssen Sie sich die darin enthaltenen Dateien genauer ansehen. 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 Dateien in einem init.d-Verzeichnis, normalerweise in /etc oder /etc/rc.d. Linux -Distributionen enthalten diese Links, damit sie dieselben Startskripts für alle Runlevel verwenden können. Diese Konvention ist keinesfalls Pflicht, erleichtert aber oft 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 administrators bevorzugen Nummern in den 90er Jahren, nach den meisten Diensten, die mit den kamen system.

Linux Distributionen enthalten normalerweise einen Befehl zum Aktivieren und Deaktivieren von Diensten in den Verzeichnissen rc * .d. In Debian lautet der Befehl beispielsweise update-rc.d und in Red Hat Linux, lautet der Befehl chkconfig. Grafische Benutzeroberflächen sind ebenfalls verfügbar. Die Verwendung dieser Programme trägt dazu bei, die Startverzeichnisse konsistent zu halten, und hilft bei Upgrades.

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

Controlling init

Gelegentlich müssen Sie init einen kleinen Kick geben, um es anzuweisen, die Runlevel zu wechseln, die Inittab-Datei erneut zu lesen oder einfach nur shut down 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 des Runlevels versucht init, alle Prozesse abzubrechen, die nicht in der Inittab-Datei für den neuen Runlevel enthalten sind. Daher sollten Sie beim Ändern von Runlevels vorsichtig sein.

Wenn Sie brauchen, um add oder Respawning-Jobs entfernen oder andere Änderungen an der inittab-Datei vornehmen möchten, müssen Sie init über die Änderung informieren und veranlassen, dass die Datei erneut gelesen wird. Manche Leute verwenden kill -HUP 1, um init anzuweisen, dies zu tun. Diese traditionelle Methode funktioniert auf den meisten Unix-Versionen, solange Sie sie richtig eingeben. Sie können jedoch auch diesen Telinit-Befehl ausführen:

telinit q

Sie können telinits auch verwenden, um zum Einzelbenutzermodus zu wechseln mode.

Herunterfahren

init steuert auch, wie die system fährt herunter und startet neu. Der richtige Weg zu shut down a 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

Auf den meisten modern machines mit einigermaßen neueren Versionen von Linux, ein Halt unterbricht die Stromversorgung 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 macUm irgendwann in der Zukunft herunterzufahren, besteht eine Möglichkeit darin, + n zu verwenden, wobei n die Anzahl der Minuten ist, die der Shutdown warten soll, bevor er seine Arbeit erledigt. Für andere options, sehen Sie sich die Handbuchseite zum Herunterfahren (8) an.

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

shutdown-r + 10

On Linux, shutdown benachrichtigt alle angemeldeten Personen, dass die macEs geht zwar bergab, aber es bringt wenig wirkliche Arbeit. Wenn Sie eine andere Zeit als jetzt angeben, wird beim Herunterfahren eine Datei mit dem Namen /etc/nologin erstellt. Wenn diese Datei vorhanden ist, wird 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 Dateien an ihren Platz bringen und andere Vorbereitungen für das Herunterfahren treffen.
# Die nächsten rc0.d/rc6.d-Befehle heben die Bereitstellung aller Dateien aufsystems anders als die Wurzel.
# Weitere rc0.d/rc6.d-Befehle mounten die Root-Datei erneutsystem schreibgeschützt
# Noch mehr rc0.d/rc6.d-Befehle schreiben alle gepufferten Daten in die Dateisystem 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 default, diese Programme rufen shutdown mit -r oder -h auf options, 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, schreibe ich seit 2006 gerne auf StealthSettings.com. Ich habe reichhaltige Erfahrung in Betriebssystemen: macOS, Windows und Linux, sowie in Programmiersprachen und Blogging-Plattformen (WordPress) und für Online-Shops (WooCommerce, Magento, PrestaShop).

Hinterlasse einen Kommentar