Erstellen Sie die Dienstdefinition.

Erstellen Sie die Dienstdefinition.

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. tty1Sie 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 NAutoVTsin der logind.confKonfigurationsdatei festgelegten Maximum. Dies ist standardmäßig tty1der Fall.tty6
  • Damit bleibt tty7in der Fedora-Welt free übrig. In der Debian-Welt verwendet die grafische Benutzeroberfläche jedoch, obwohl Debian jetzt ein systemd-Betriebssystem ist tty7. 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 NAutoVTsEinstellung in logind.confvon 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.serviceund „fixieren“ Sie den Namen des Endgeräts in der Einheit, indem Sie %Iihn 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@ttyNanstelle 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@ttyN

Menschen, die sich mit den Methoden von auskennen /etc/ttysund /etc/inittabdas 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 gettyDienstprogramm 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=yesherumspielen 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 tty8ist mit der oben genannten Vorlage einfach. Instanziieren Sie es einfach auf tty8statt 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@tty5zumy-terminal-ui@tty5

Dies ist die logische Weiterentwicklung der Bearbeitung [email protected], da offensichtlich dieautovt@ttyNAliase sind einwas auch immer hier begonnen werden sollMechanismus, der es erlaubt, andere Dinge zu ersetzengetty@ttyN.

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

Antwort2

Sie können dies tun, indem Sie das für verwendete Anmeldeprogramm gettydurch Ihr eigenes Programm ersetzen. Auf meiner Debian-Maschine sind die Aufrufe beispielsweise gettyin /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-lMö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 gettyDefinitionen 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, locateum 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.targetund sein Ziel getty.targetenthalten keine Aufrufe von agetty.

CentOS6 liegt dazwischen: meine Maschine hat mingettyund 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 $TTYVariable wird übrigens in festgelegt /etc/init/start-ttys.conf(das initscriptsPaket, 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.

verwandte Informationen