
Ich möchte, dass CentOS nach dem Booten und ohne Anmeldung ein TUI (Ncurses-Programm) anzeigt. Ich möchte nicht, dass die Anmeldeaufforderung angezeigt wird.
Programmfunktionen: Netzwerkkonfiguration, Neustart, Herunterfahren
Gibt es eine Möglichkeit, das zu erreichen?
Antwort1
Die systemd-Antwort von M. Dickey ist etwas vage. Hier sind die Details für ein systemd-Betriebssystem.
Der Dienst, der die Anmeldeaufforderung präsentiert, ist eine Instanz der [email protected]
Vorlage, beispielsweise [email protected]
für den Anmeldedienst auf tty6
. Um diese auf einem solchen Endgerät durch einen eigenen Dienst zu ersetzen, sind zwei Dinge nötig.
Erstellen Sie die Dienstdefinition.
Das ist ziemlich einfach:
# /etc/systemd/system/[email geschützt] [Einheit] Beschreibung=Benutzerdefinierte Benutzeroberfläche auf %I Dokumentation=https://unix.stackexchange.com/a/318336/5132 Konflikte=getty@%I.service Vorher=getty.target [Service] ExecStart=/usr/local/sbin/meine-benutzerdefinierte-Benutzeroberfläche StandardInput=tty StandardOutput=tty Neustart=immer NeustartSec=1 UtmpIdentifier=%I TTYPath=/dev/%I TTYReset=ja TTYVHangup=ja TTYVTDisallocate=ja SendSIGHUP=ja [Installieren] WantedBy=Mehrbenutzer.Ziel
Das ist einVorlageServiceeinheit, die mit dem Namen eines virtuellen Kernel-Terminalgeräts als Vorlagenparameter instantiiert wird.
Stellen Sie sicher, dass Ihr Dienst beim Bootstrap automatisch gestartet wird.
Dies ist der komplexere Teil.
Zunächst müssen Sie entscheidenwelcheKernel-virtuelles Terminalgerät, auf dem dies ausgeführt wird. Hier spielen mehrere Informationen eine Rolle:
- In der Fedora-Welt verwendet die grafische Benutzeroberfläche seit 2008 das erste virtuelle Kernel-Terminalgerät.
tty1
Sie müssen sich entscheiden, ob Sie dieses virtuelle Terminalgerät nicht verwenden oder die grafische Benutzeroberfläche nicht verwenden (oder manuell anpassen). - Der Logind von systemd versucht, Anmeldedienste auf virtuellen Kernelterminals bei Bedarf zu starten, bis zu dem
NAutoVTs
in derlogind.conf
Konfigurationsdatei festgelegten Maximum. Dies ist standardmäßigtty1
der Fall.tty6
- Damit bleibt
tty7
in der Fedora-Welt free übrig. In der Debian-Welt verwendet die grafische Benutzeroberfläche jedoch, obwohl Debian jetzt ein systemd-Betriebssystem isttty7
. Sie sollten eine Portierung auf Debian in Betracht ziehen. - Die systemd-Welt versucht, das virtuelle Kernel-Terminal Nr. 6 zur Anmeldeaufforderung zu machen, die „immer da“ ist, zu der Sie aus dem Muskelgedächtnis heraus Control+ Alt+ drücken müssen F6.
Nehmen wir an, Sie wählen tty5
.
Sie müssen logind daran hindern, den bei Bedarf zu starten [email protected]
(ein anderer Name für [email protected]
), wenn der Benutzer zum virtuellen Kernelterminal Nr. 5 wechselt. Sie können dies tun, indem Sie die NAutoVTs
Einstellung in logind.conf
von 6 auf (sagen wir) 4 verringern.
Sie müssen sicherstellen, dass Ihr Dienst beim System-Bootstrap automatisch gestartet wird, d. h. dass er „aktiviert“ ist:
systemctl aktivieren[email geschützt]
Alternativen
Es gibt andere Möglichkeiten, dies zu tun.
ein nicht auf Vorlagen basierender Dienst
Anstatt „ [email protected]
have“ my-terminal-ui.service
und „fixieren“ Sie den Namen des Endgeräts in der Einheit, indem Sie %I
ihn beispielsweise durch ersetzen tty5
.
Ich habe dies als Vorlage für eine Definition angegeben, da es dadurch einfacher ist, eine andere Auswahl zu treffen tty5
.
mit einem vonautovt@tty
Nanstelle Ihres eigenen Namens
Sie können als Namen für Ihre Servicedefinition verwenden . Dies würde die Instanziierung der Vorlage überschreiben./etc/systemd/system/[email protected]
[email protected]
Der Vorteil dieses Ansatzes besteht darin, dass Sie sich dann NAutoVTs
überhaupt nicht um die Aktivierung des Dienstes kümmern müssen und logind einfach so belassen können, dass Ihr Dienst bei Bedarf gestartet wird, wenn der Benutzer zum virtuellen Kernel-Terminal Nr. 5 wechselt.
Der Nachteil ist, dass der Demand-Start-Mechanismus so konzipiert wurde,keine Login-Prozesse durchzuführenauf unbenutzten virtuellen Kernel-Terminals. Daher wird Ihr Dienst nicht beim System-Bootstrap ausgeführt, sondern nur beim ersten Aktivieren des virtuellen Kernel-Terminals Nr. 5. Dieser On-Demand-Start ist möglicherweise nicht das, was Sie möchten. Andere Teile Ihres benutzerdefinierten Systems erwarten möglicherweise, dass Ihr Dienstläuft bereitsbeispielsweise ab Bootstrap.
Bearbeiten einesgetty@tty
N
Menschen, die sich mit den Methoden von auskennen /etc/ttys
und /etc/inittab
das Modifizieren als die Art und Weise betrachten [email protected]
, Dinge zu tun. Sie führen Befehle wie
systemctl bearbeiten[email geschützt]
und fügen Sie eine Außerkraftsetzung hinzu, die besagt
[Service] # Bei dieser leeren Zuweisung handelt es sich nicht um einen Druckfehler. ExecStart= ExecStart=/usr/local/sbin/meine-benutzerdefinierte-Benutzeroberfläche
Dies bringt mehrere Probleme mit sich.
Einen Dienst erstellendas heißt Gettykein { a
, min
, f
} getty
-Programm auszuführen, ist keine besonders wartungsfreundliche Idee. Wenn Sie in einigen Jahren vergessen haben, was Sie hier getan haben, oder wenn jemand anderes die Verwaltung eines solchen Systems übernimmt, wird es nicht offensichtlich sein, dass „Getty“-Dienste nicht immer ein getty
Dienstprogramm ausführen.
Betrachten Sie es nicht [email protected]
als einen Raum fürwas auch immer auf diesem Terminal ausgeführt wird, um nach Bedarf geändert zu werden. Das ist nicht wirklich die Art und Weise, wie systemd darüber denkt. [email protected]
führt ein „Getty“-Programm aus. Ein Dienst, der ein völlig anderes Programm ausführt, das nichts wie ein „Getty“-Dienst ausführt, sollte eine eigene, separate Dienstdefinition sein.
Außerdem: Eine separate Servicedefinition ermöglicht es, den Service nicht als etwas wie einen "getty"-Service zu definieren. Die obige Servicedefinition kopiert das meiste Verhalten des "getty"-Service, einschließlichversuchen, Ihren Bildschirm gründlich zu reinigen(wie die Welt es von Ihnen erwartet). Aber Sie möchten vielleicht beispielsweise nicht mit einem Dienst wie Ihrem TTYReset=yes
herumspielen utmpx
, der eigentlich kein „Anmeldedienst“ ist und dessen Bildschirm vielleicht nicht so schnell gelöscht werden soll.
Außerdem: Eine separate Servicedefinition lässt sich in Zukunft einfacher ändern. Die Änderung von tty5
(falls das nicht zufriedenstellend ist) zu tty8
ist mit der oben genannten Vorlage einfach. Instanziieren Sie es einfach auf tty8
statt auf tty5
. Es ist etwas schwieriger, eine Reihe lokaler Anpassungen von aufzuheben [email protected]
und sie dann gegen neu zu erstellen [email protected]
.
Aliasing autovt@tty5
zumy-terminal-ui@tty5
Dies ist die logische Weiterentwicklung der Bearbeitung [email protected]
, da offensichtlich dieautovt@tty
NAliase sind einwas auch immer hier begonnen werden sollMechanismus, der es erlaubt, andere Dinge zu ersetzengetty@tty
N.
Es hat jedoch die gleichen Nachteile wie die [email protected]
direkte Verwendung des Namens, da es in die Versuche von logind verwickelt wird,Anmeldedienste werden nicht gestartetDas ist vielleicht nicht das, was Sie wollen. Es ist eigentlichwas auch immer gemeint istNachfrage-begann hiervon logind.
Weiterführende Literatur
- https://unix.stackexchange.com/a/194218/5132
- https://unix.stackexchange.com/a/233855/5132
- https://unix.stackexchange.com/a/236959/5132
- https://unix.stackexchange.com/a/316279/5132
- Jonathan de Boyne Pollard (2015).
/etc/inittab
gehört der Vergangenheit an.. Häufig gestellte Fragen.
Antwort2
Sie können dies tun, indem Sie das für verwendete Anmeldeprogramm getty
durch Ihr eigenes Programm ersetzen. Auf meiner Debian-Maschine sind die Aufrufe beispielsweise getty
in /etc/inittab
:
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
# <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
während Debian tatsächlich verwendet agetty
:
NAME
agetty - alternative Linux getty
SYNOPSIS
agetty [-8chiLmnsUw] [-a user] [-f issue_file] [-H login_host] [-I
init] [-l login_program] [-t timeout] port baud_rate,... [term]
und das kann ein anderes Programm aufrufen mit dem-l
Möglichkeit:
-l, --login-program login_program
Invoke the specified login_program instead of /bin/login. This
allows the use of a non-standard login program (for example, one
that asks for a dial-up password or that uses a different pass‐
word file).
Ihr Spezialprogramm könnte so eingerichtet werden, dass es auf jedem "tty" läuft. Wenn Sie das tun, sollten Sie darauf achten, dass Sie sich zur Wartung direkt in die Maschine einloggen können. Das könnte im Einzelbenutzermodus oder über SSH sein. Die getty
Definitionen gelten nicht für SSH.
Bei CentOS7 mit systemd sind die Dinge anders organisiert, aber das Endergebnis ist dasselbe. Wenn Sie verwenden systemctl list-unit-files
, ist der relevante Dienst [email protected]
. Wie jeder andere Dienst kann dieser angepasst werden. Verwenden Sie, locate
um Hinweise zu erhalten:
/etc/selinux/targeted/modules/active/modules/getty.pp
/etc/systemd/system/getty.target.wants
/etc/systemd/system/getty.target.wants/[email protected]
/usr/lib/systemd/system/console-getty.service
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/multi-user.target.wants/getty.target
/usr/lib/systemd/system-generators/systemd-getty-generator
Die Dateien in /usr/lib/systemd/system/
enthalten die Aufrufe für agetty
(für das es auch eine Manualpage zu CentOS gibt). Sie können diese ändern:
ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM
Der symbolische Link /usr/lib/systemd/system/multi-user.target.wants/getty.target
und sein Ziel getty.target
enthalten keine Aufrufe von agetty
.
CentOS6 liegt dazwischen: meine Maschine hat mingetty
und kein systemd
. Aus der Handbuchseite:
MINGETTY(8) Linux Programmer's Manual MINGETTY(8)
NAME
mingetty - minimal getty for consoles
SYNOPSIS
mingetty [--noclear] [--nonewline] [--noissue] [--nohangup] [--nohost-
name] [--long-hostname] [--loginprog=/bin/login] [--nice=10]
[--delay=5] [--chdir=/home] [--chroot=/chroot] [--autologin username]
[--loginpause] tty
DESCRIPTION
mingetty is a minimal getty for use on virtual consoles. Unlike
agetty(8), mingetty is not suitable for serial lines. I recommend
using mgetty(8) for this purpose.
Wie agetty
, es kann angepasst werden:
--loginprog /bin/login
Change the login app.
Beginnen Sie mit der Konfigurationsdatei:
# tty - getty
#
# This service maintains a getty on the specified device.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file tty.override and put your changes there.
stop on runlevel [S016]
respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX - where X is console id'
Das führt uns dazu, nach Informationen über zu suchen tty.override
, die gemäß dieser
ist ein Skript, das Sie in bereitstellen /etc/init/tty.override
(es zeigt ein Beispiel für Autologon auf tty1, aus dem Sie einen allgemeinen Eindruck davon bekommen, was das Skript tun könnte). Die $TTY
Variable wird übrigens in festgelegt /etc/init/start-ttys.conf
(das initscripts
Paket, zu dem diese gehören, verfügt nicht über eine detaillierte Dokumentation).
Antwort3
Nach einigem Googeln habe ich zwei Lösungen gefunden:
https://serverfault.com/questions/323289/ersetzen-von-tty-durch-ein-skript-in-centos-6
Und
https://www.centos.org/forums/viewtopic.php?t=2414
Abschließend komme ich zu folgendem Ergebnis:
1) Erstellen Sie „/etc/init/launch.conf“ mit diesem Inhalt:
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [S016]
respawn
console owner
exec /usr/bin/openvt -c 1 -w -f -- /usr/sbin/setup
In diesem Beispiel wird das Textmodus-Setup-Tool ausgeführt
2) Bearbeiten Sie „/etc/init/start-ttys.conf“, um das TTY durch „Launch“ zu ersetzen:
start on stopped rc RUNLEVEL=[2345]
env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
. /etc/sysconfig/init
for tty in $(echo $ACTIVE_CONSOLES) ; do
[ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
#initctl start tty TTY=$tty
initctl start launch TTY=$tty
done
end script
Ich weiß nicht, ob das die beste Lösung ist, aber es funktioniert und das Setup-Programm wird nach dem Booten angezeigt.