Verstehen Sie die Datei / etc / inittab
On Februar 12, 2021 by admin Ich verwende die folgende /etc/inittab
-Datei (systemv):
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
Um zu verstehen, wie die Dinge wirklich funktionieren, werde ich es begrüßen, wenn Sie bei Ihren Antworten auf 1-3 zwischen zwei Situationen unterscheiden:
- Ich bin über eine serielle Schnittstelle mit meinem System verbunden.
- Ich habe einen „normalen“ Desktop-PC.
Fragen:
-
Wenn ich eine weitere getty-Zeile hinzufüge, werden nach dem Start von Linux zwei separate Terminals angezeigt?
-
Wenn ich mehrere getty-Zeilen öffne, wie habe ich welche zugewiesen? getty führt meinen Befehl
si::sysinit:/etc/init.d/rcS
aus und welcher getty führt die Befehle des anderen Skripts aus? (diejenigen, die Skripte gemäß der Systemausführungsebene ausführen)in Mit anderen Worten: Kann ich in der Datei
/etc/inittab
verschiedenen gettys unterschiedliche Befehle zuweisen? (Ich meine die Terminals, die von diesen gettys geöffnet werden) -
Das letzte Skript im Ordner /etc/init.d/rc5 wird ausgeführt Der folgende Befehl:
su nobody -c /bin/sh
und die Ausgabe lautet:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Also habe ich überprüft dass ich niemand bin, aber warum schreibt es die ersten beiden Zeilen? auch, warum die Eingabeaufforderung sh-4.3 $ ist und nicht niemand @ …
-
Ich verwende eine serielle Verbindung. Kann ich die Datei / etc / inittab und das letzte Skript ändern? Dies wird von init ausgeführt, um:
- ein Programm auszuführen, bevor Sie sich als Benutzer mit niedrigen Berechtigungen anmelden (der Init-Prozess wartet auf die Beendigung)
- , sobald das Programm beendet wird, erhalten Sie das reguläre Programm Anmeldeaufforderung für mein System
- Was ist der beste Weg, um einen Benutzer mit geringen Berechtigungen zu erstellen und ihn dieses Programm während des Initialisierungsprozesses ausführen zu lassen (wenn ich den Benutzer none nicht verwenden möchte)
Antwort
Frage 1:
Ja, indem Sie weitere getty
Leitungen können Sie mehr Terminals parallel erhalten. Es kann jeweils nur ein getty
einem Endgerät zugeordnet werden, sodass nur ein getty
pro serieller Schnittstelle möglich ist. Auf einem normalen Desktop-PC definiert der Linux-Kernel eine Reihe von virtuellen Konsolen, auf die über die Tastenkombinationen Control + Alt + FX zugegriffen werden kann /dev/ttyX
Geräte (X = eine Zahl). Das genaue Setup kann zwischen den Distributionen variieren, aber normalerweise sind bei Mainstream-Distributionen für die ersten 6 /dev/ttyX
Geräte getty
konfiguriert, wenn Das System läuft normal. Sie können die Befehle openvt
und deallocvt
verwenden, um virtuelle Konsolen hinzuzufügen oder zu entfernen und Prozesse zu starten (dies können beliebige Prozesse sein, nicht unbedingt getty
s) auf ihnen.
/dev/tty0
ist etwas Besonderes: Es bezieht sich auf die jeweils ausgewählte virtuelle Konsole. /dev/console
ist ein ähnliches Spezialgerät, das auf das TTY-Gerät verweist, das als primäre Systemkonsole auf Kernelebene definiert ist. Auf Desktop-Systemen ist es standardmäßig ein Alias für /dev/tty0
. Mit der Startoption console=
können Sie es jedoch auf eine serielle Option umschalten Hafen. Auf z.B. Bei einigen eingebetteten Architekturen kann es sich standardmäßig um eine serielle Schnittstelle handeln. Dienstprogramme wie xconsole
können auch als zusätzliche Ausgabe für /dev/console
dienen.
Damals, als Computer in dedizierten Computerräumen große Dinge mit mehreren Schränken waren, wäre das Senden einer Nachricht an /dev/console
eine Möglichkeit gewesen, den diensthabenden Systembetreiber zu erreichen physisch in der Nähe des Computers, was für Anfragen an z Bänder oder Disk Packs wechseln. Auf modernen Systemen sind Nachrichten, die speziell an /dev/console
gesendet werden, normalerweise Boot- / Shutdown-Nachrichten oder möglicherweise ein Kanal der letzten Instanz für dringende Alarme über Fehlerzustände, die sich auf den Netzwerk- oder Speicherzugriff auswirken können, oder sogar einen Kernelabsturz beinhalten: „Eine Person, die für die physische Hardware verantwortlich ist, muss dies sehen und die üblichen Protokolldateien sind aus irgendeinem Grund unbrauchbar.“
Frage 2:
Ich fürchte, Sie haben hier ein Missverständnis. Die Zeile sysinit
und andere Zeilen /etc/inittab
sind nicht mit verarbeitet überhaupt. Jeder Befehl, der von inittab
ausgeführt wird, hat, sofern nicht anders angegeben, seine Standardeingabe-, Ausgabe- und Fehlerströme, die mit /dev/console
.
Die Zeilen getty
geben tatsächlich das TTY-Gerät an, das sie verwenden werden, und den Prozess getty
hat Code eingebaut, der das TTY-Gerät für sich selbst und zuweist alle untergeordneten Prozesse, es sei denn / bis der Benutzer eine Shell ausführt und diese Streams auf eine andere Weise umleitet.Dies und das Initialisieren der Einstellungen des TTY-Geräts sind der größte Teil des Zwecks von getty
: Anzeigen von /etc/issue
und Anmelden der Eingabeaufforderung, Akzeptieren der Benutzername, Festlegen der Umgebungsvariablen TERM und Starten des nächsten Schritts des TTY-Anmeldevorgangs (normalerweise /bin/login
, aber anpassbar) sind praktisch nur geringfügige Teile.
Beachten Sie, dass dort ist eine Konvention, dass für die TTY-Geräte das zweistellige ID-Feld in der ersten Spalte der Zeile inittab
mit dem Namen des betreffenden TTY-Geräts nach /dev/tty
Präfix, also /dev/ttyS0
erhält eine inittab-Zeilen-ID von S0
und so weiter ist nicht unbedingt mit einem TTY verknüpft (oder gibt bei Bedarf nur Notfalldaten an / dev / console aus). Die ID kann alles sein, was nicht mit den TTY-Gerätezeilen-IDs in Konflikt steht.
(Zurück in der Tag, an dem seriell angeschlossene Terminals die Nr. waren rm, die Einstellungen des TTY-Geräts für das Terminal am anderen Ende der Leitung richtig einzustellen und dieses Terminal für die Anmeldung auf einen bekannten Status zurückzusetzen, waren keine trivialen Aufgaben, da es viele konkurrierende Terminaltypstandards gab.)
Wenn Sie eine inittab
-Zeile konfigurieren, um ein Skript auszuführen, können Sie beispielsweise feststellen, ob eine bestimmte /dev/ttyX
virtuelle Konsole vorhanden ist Gerät existiert. Ist dies nicht der Fall, können Sie mit openvt -c X <command>
die virtuelle Konsole erstellen und einen Befehl darauf starten. Wenn das virtuelle Konsolengerät bereits vorhanden ist, können Sie einfach einen beliebigen Befehl mit Standardeingabe, -ausgabe und -fehler starten, die darauf umgeleitet werden. Beispielsweise könnten Sie eine inittab-Zeile wie folgt angeben:
6:345:respawn:/usr/local/sbin/myscript
und dann /usr/local/sbin/myscript
mit so etwas ( Haftungsausschluss: nicht getestet, ich habe derzeit kein System mit SysVinit zur Hand. Sie können es jederzeit bearbeiten, wenn Sie dies verbessern können.
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
respawn
in der Zeile inittab
stellt sicher, dass der Prozess automatisch neu gestartet wird, wenn er aus irgendeinem Grund stirbt. 345
ist die Liste der SysVinit-Runlevel, auf denen dieser Prozess ausgeführt werden soll. Wenn Sie ihn für alle regulären Runlevel benötigen, geben Sie 12345
ein.
Beachten Sie dies funktioniert nur wie vorgesehen, wenn die inittab-Zeile nach der sysinit
-Zeile steht, sodass davon ausgegangen werden kann, dass die Initialisierung von udev
abgeschlossen ist Wenn Sie dies früh im Initialisierungsprozess tun möchten, müssen Sie möglicherweise darauf achten, die tatsächlichen Geräteknoten für Geräte zu erstellen, auf denen bereits Treiber geladen wurden. Sobald udev
ausgeführt wird, sollten Geräteknoten automatisch erstellt werden, wenn Gerätetreiber initialisiert werden.
Wenn Sie eine serielle Schnittstelle verwenden, wird die openvt
wird nicht angewendet.
Ja, Sie können definitiv verschiedene Befehle an verschiedene TTY-Geräte anhängen. Es ist hilfreich, wenn die Befehle über integrierte Funktionen verfügen, wie z. B. getty
, aber Sie können dies auch mit Skripten tun.
(Wenn Sie etwas Komplizierteres als eine einfache tail -f
einrichten, um ein Protokoll in einer ansonsten nicht verwendeten virtuellen Konsole dauerhaft anzuzeigen, sollten Sie man setsid
und prüfen Sie, ob es auf Ihre Planung zutrifft.)
Frage 3:
Das Initialisieren einer TTY-Sitzung bietet noch mehr für einen bestimmten Nicht-Root-Benutzer als nur das Starten einer Shell mit su
.
Die Fehlermeldungen
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
wird wahrscheinlich dadurch verursacht, dass die Shell vom /dev/console
-Gerät und nicht von einem bestimmten TTY-Gerät zugeordnet wird. Da /dev/console
nur ist Als Alias für die aktuelle Systemkonsole stehen nicht alle Funktionen der TTY-Steuerung ioctl zur Verfügung.
Wenn es kein Anmeldeskript gibt, mit dem der Umgebungsvariablen PS1
ein nützlicherer Wert zugewiesen werden kann, wird die Standardaufforderung für /bin/sh
kann einfach sh-<version>$
sein.
Frage 4:
Ja, das können Sie. Sie sollten das „letzte Skript“ als wait
-Typzeile in inittab
angeben und vor platzieren Die Zeile getty
, die Ihrer seriellen Leitung entspricht.
Ohne viel mehr Details über Ihre Umgebung zu wissen, ist es sehr schwierig zu sagen, welche die beste Möglichkeit, einen Benutzer mit geringen Berechtigungen für solche Zwecke zu erstellen.
Kommentare
- Danke! small q plz: Wenn der Init-Prozess andere Prozesse gemäß den geeigneten Runlevel-Skripten aufruft, kann ich das sehen! Wenn ich ‚ ein Programm von einem dieser Skripte aus ausführen werde, wird
die Ausführung sehen. Nach meinem Verständnis – wenn ich es sehen kann (innerhalb des Terminals), muss es einen Getty geben, der dieses erste Terminal für mich geöffnet hat.Ich denke, der ttys0 getty ist derjenige, der diesen ersten stty für mich geöffnet hat. Was ‚ ist die Verbindung von / dev / console dazu? und wenn ich 4 Skripte schreibe, das gleiche Runlevel, aber ich möchte, dass jedes in einem anderen getty ausgeführt wird (aber der Init-Prozess ist derjenige, der diese Skripte ausführt), wie kann ich das tun?
getty
ist ein Prozess; Sie sprechen von einem TTY-Gerät . Der Kernel hat den ersten für Sie und für die Init-Skripte geöffnet. /dev/console
ist ein Alias für “ das erste TTY-Gerät, das vom Kernel geöffnet und verwendet wurde „. Wenn Ihr Benutzerkonto über die Berechtigungen für Lese- und Schreibzugriff auf ein TTY-Gerät verfügt, können Sie es einfach verwenden (kein getty
erforderlich). Es ist jedoch möglicherweise eine gute Idee, das festzulegen TERM-Variable korrekt: TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
oder TERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
startet den Befehl top
auf der 8. virtuellen Konsole oder die 2. serielle Schnittstelle. getty
-Prozess ausgeführt wird, wird dies zu einem Durcheinander führen Die Eingabe & gibt aus, da die beiden Prozesse um die Eingabe kämpfen und ihre Ausgaben miteinander verwechselt werden. Die Prozesse getty
werden erst gestartet, nachdem /etc/init.d/rc 5
und alle von ihm gestarteten Skripte beendet sind. Antwort
-
Ja, unter der Annahme der Zeile erhält eine eindeutige Kennung und die konfigurierte Terminalleitung ist verfügbar:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
öffnet ein Terminal an der seriellen Schnittstelle, die an
ttyS1
. -
Zeilen in
inittab
sind nicht sequentiell oder beziehen sich auf eine Anmeldung. Jede Zeile beschreibt eine Aktion, die in einem bestimmten Satz von Runlevels ausgeführt werden soll. Daher gibtsi::sysinit:/etc/init.d/rcS
an, dassinit
/etc/init.d/rcS
ausgeführt werden soll, wenn die Systeminitialisierung ausgeführt wird. Dies geschieht, bevor Anmeldungen möglich sind. (Weitere Informationen finden Sie in derinittab(5)
Manpage unter .So weisen Sie verschiedenen
getty
s auf bestimmten Terminals würden Sie den Aufrufgetty
selbst konfigurieren, indem Sie beispielsweise dielogin
Programm, das gestartet wird (die Option-l
in den meistengetty
-Implementierungen):S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
wird ausgeführt, bevor Anmeldungen möglich sind, und die von ihm ausgeführten Programme sind nicht mit einem Terminal verbunden („richtig“) Dies ist, wasgetty
tut – es öffnet das Terminal für Sie und verbindet die Programme, die es damit startet). Wenn alsosu nobody -c /bin/sh
aufgerufen wird, wird das Die Shell findet das erwartete Terminal-Setup nicht und deaktiviert daher die Jobsteuerung. Die Eingabeaufforderungsh-4.3$
ist die Standardaufforderung von Bash 4.3, wenn sie als/bin/sh
ausgeführt wird. -
Wenn Ihr Programm erst ausgeführt werden soll, wenn sich ein Benutzer anmeldet, können Sie es in die von
getty
verwendete Anmeldesequenz einbinden. aber ein solches Programm würde als root laufen. Je nachdem, wonach Sie genau suchen, ist es wahrscheinlich besser, ein Initscript zu verwenden, als eine/etc/inittab
-Anpassung odersudo
und das Startskripte der Shell.
Kommentare
- Vielen Dank für Ihre Wiederholung. Kann ich um eine Klarstellung zu Abschnitt 2 bitten? Wie kann ich den Anmeldebefehl für jedes Getty bearbeiten?
- Fertig, siehe Update.
- Danke! Nur um zu überprüfen, ob ich es richtig verstanden habe: Standardmäßig führt der getty-Prozess den Befehl / bin / login aus, der den für die Systemanmeldung verantwortlichen Prozess ausführt. Jetzt führt die getty einen anderen Befehl aus, jeden Befehl, den ich ‚ wähle, und ruft nicht wie zuvor den Systemanmeldevorgang auf … habe ich recht?
- Ja, das stimmt. Der Schlüssel ist, dass
getty
das TTY für Sie öffnet. Das normale Verhalten besteht darin, auf einen Anmeldenamen zu warten und dannlogin
auszuführen, das mit dem TTY verbunden ist.login
wartet auf das Kennwort, überprüft es und startet die Shell, die ebenfalls mit dem TTY verbunden ist. Wenn Sie den Teillogin
ersetzen, müssen Sie sicherstellen, dass sich Ihr Ersatzprogramm wielogin
verhält. - Zum Beispiel, wenn ich die Anmeldephase überspringen möchte, um mein System mit dem Root-Benutzer öffnen zu können, ohne einen Benutzernamen oder ein Passwort einzugeben. Ich kann verwenden: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 oder verwenden: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 und innerhalb Das Skript i ‚ führt den Befehl – / bin / sh und andere aus?
Antwort
Gerade jetzt eine Sekunde (lang!) Antwort wurde gepostet. Ich muss sagen, der erste erklärt ganz gut. Im Moment möchte ich auf Punkt drei eingehen: Es geht weniger um das Timing als um Prozesse, die eine „echte virtuelle“ Tty steuern, und nicht nur um einen „Konsolen-Dummy“.
Bevor Sie eine Shell „mit Jobsteuerung“ starten können, müssen Sie ein ttyN einrichten, d. h. öffnen. Der Befehl „generic“ lautet getty
. Von diesem tty-Etwas, das Sie erhalten, können Sie eine Shell starten, nicht nur danach .
Es ist, als würde man versuchen, zuerst einen Fenstermanager und dann xorg zu starten, anstatt sie zusammen mit xinit zu „booten“. Ich denke. „Sitzungsleiter“.
Wegen
xx:12:...:program
und im Gegenteil:
aa:1:...:pr_1 bb:1:...:pr_2
… Sie erhalten eine N: M-Beziehung (Sie erhalten auch ein Durcheinander, wenn Sie missbrauchen – viele RLs mit jeweils vielen verschiedenen Progs). Sie können damit weit gehen, aber seitdem haben verschiedene Arten von RC- „Standards“ übernommen. „Runcoms“. Mit ihnen sieht inittab einfach aus, aber die ganze Komplexität steckt in diesen Skripten.
Aber Ihr inittab sieht einfach und korrekt aus – nur der letzte Kommentar und der Eintrag „z6“ …
Vielleicht braucht dein „su Nobody“ nur ein „getty … ttyN“ vor / um. su
anstelle von login
und kein Respawn. Sollte zumindest eine andere Fehlermeldung als „unangemessen“ geben.
Fazit (nach dem Lesen der zweiten Antwort): Sie benötigen kein kompliziertes init.d
-System, das rohe Inittab ist flexibel genug Das Konzept und die Details stimmen.
Sie können drei Runlevel einrichten: einen mit ttyNs, einen mit ttySN und einen RL, der beide startet. Dies ist ein Boot-Parameter, den Sie mit dem Bootloader hinzufügen können. Runlevel „5“ ist in Ihrem Fall nur die Standardeinstellung. Sie wählen einen Kernel, ein Root = und ein Runlevel zum Initiieren.
Für die Aktion „Respawn“ wurde / wird sysvinit tatsächlich benötigt Viel mehr geht nicht, und weniger wäre in einem Skript implementiert werden können. Wenn Sie jedoch die „letzte“ Shell-Ebene verlassen (oder abstürzen), benötigen Sie ein Sicherheitsnetz.
sysvinit kann Erkennen Sie sogar eine Fehlkonfiguration, indem Sie den Fehler „Zu schnelles Laichen – 5 Minuten ignorieren …“.
Schreibe einen Kommentar