サービス定義を作成します。

サービス定義を作成します。

Centosが起動後にログインせずにtui(ncursesプログラム)を表示するようにしたいと思います。ログインプロンプトを表示したくありません。

プログラム機能:ネットワーク構成、再起動、シャットダウン

これを達成する方法はありますか?

答え1

M. Dickeyの体系的な答えは少しあいまいです。以下は、システムオペレーティングシステムの詳細です。

ログインプロンプトを表示するサービスは、ログインサービス[email protected]などのテンプレートのインスタンスです。これらのエンドデバイスから独自のサービスと交換するには、2つのことを行う必要があります。[email protected]tty6

サービス定義を作成します。

これは非常に簡単です。

# /etc/systemd/system/[Eメール保護]

[単位]
説明=%Iのカスタムユーザーインターフェース
ドキュメント=https://unix.stackexchange.com/a/318336/5132
競合=getty@%I.service
前=getty.target

[提供する]
ExecStart=/usr/local/sbin/my-custom-user-interface
標準入力=tty
標準出力=tty
再起動=常に
再開秒= 1
Utmp識別子=%I
TTYパス=/dev/%I
TTYリセット=はい
TTYVを壊す=はい
TTYVT割り当て解除=はい
SIGHUP=YES 送信

[インストールする]
WantedBy =マルチユーザー。ターゲット

これは金型カーネル仮想端末デバイスの名前をテンプレートパラメータとして使用してインスタンス化されるサービス単位。

起動時にサービスが自動的に開始されることを確認してください。

これがより複雑な部分です。

まず、決定する必要があります。どの実行するカーネル仮想端末装置。これにはいくつかの情報が適用されます。

  • Fedoraの世界では、2008年以来、GUIは最初のカーネル仮想端末デバイスを使用していますtty1。その仮想端末デバイスを使用せずにGUIを無効にする(または手動で調整)、選択する必要があります。
  • NAutoVTssystemdのlogindは、設定ファイルに設定されている最大値まで、カーネル仮想端末からログインサービスの起動を要求しようとしますlogind.conf。これがtty1デフォルトですtty6
  • これはtty7Fedoraの世界を自由にします。しかし、Debianの世界では、Debianは現在システムオペレーティングシステムですが、グラフィカルユーザーインターフェイスが使用されていますtty7。 Debian への移植を検討することもできます。
  • システムの世界では、カーネル仮想ターミナル#6を「常に存在する」ログインプロンプトにしようとしていますControlAltF6

あなたが選択すると仮定しますtty5

ユーザーがカーネル仮想ターミナル#5に切り替えるたびに、オンデマンド起動(別名[email protected])でログインを停止する必要があります。設定を6から4に下げるだけ[email protected]です。NAutoVTslogind.conf

システムの起動時にサービスが自動的に開始されることを確認する必要があります(例:「アクティブ化」)。

システム制御の有効化[Eメール保護]

代替

これを行う他の方法があります。

テンプレート以外のサービス

(たとえば)に置き換えて、最終的なデバイス名をデバイスに[email protected]直接配線する代わりに。my-terminal-ui.service%Itty5

tty5.

次のいずれかを使用してください。autovt@tty窒素自分の名前の代わりに

サービス定義として使用する名前を決定します。これはテンプレートのインスタンス化をオーバーライドします。/etc/systemd/system/[email protected][email protected]

このアプローチの利点は、サービスをアクティブにすることにまったく気にする必要がなく、NAutoVTsユーザーがカーネル仮想ターミナル#5に切り替える限り、ログイン状態を維持して要求に応じてサービスを開始できることです。

欠点は、オンデマンド起動メカニズムが設計されていることです。ログインプロセスを実行しない未使用のカーネル仮想端末で。したがって、システムの起動時にサービスが実行されず、カーネル仮想ターミナル#5を初めて有効にしたときにのみ実行されます。この種のオンデマンドスタートアップはあなたが望むものではないかもしれません。カスタムシステムの他の部分では、サービスが期待できます。すでに実行中たとえば、ブートローダから始めます。

編集するgetty@tty窒素

人々は仕事がどのように行われているかにかかわらず、/etc/ttys仕事がどのように実行されるかに応じて/etc/inittab変化を見るでしょう。[email protected]彼らは次のコマンドを実行します

システム制御エディタ[Eメール保護]

上書きステートメントを追加します。

[提供する]
#この空白ジョブは印刷エラーではありません。
実行開始=
ExecStart=/usr/local/sbin/my-custom-user-interface

これにはいくつかの問題があります。

サービスを提供するそれはゲッティです{ aminf}gettyプログラムを実行しないことは、保守が容易なアイデアではありません。数年後、ここで行ったことを忘れたり、他の人がそのようなシステムの管理を担当したりすると、getty「getty」サービスが常にユーティリティを実行しているわけではないという事実は明らかではないでしょう。

[email protected]スペースだとは思わないでください。この端末で実行されているすべて、必要に応じて修正します。これは実際にはシステム的な考え方ではありません。 [email protected]「getty」プログラムを実行します。まったく異なるプログラムを実行し、「getty」サービスなどを実行しないサービスは、別のサービス定義自体でなければなりません。

さらに:別のサービス定義では、サービスを「getty」サービスと同じものとして定義しないことがあります。上記のサービス定義は、以下を含む「getty」サービスのほとんどの動作を複製します。画面をきれいにする(世界があなたが望むように)。しかし、実際には「ログイン」サービスではなく、サービスを使い続けたくTTYReset=yesないかもしれませんし、画面を積極的に消去したくないかもしれません。utmpx

さらに、個々のサービス定義は後で変更するのがより簡単です。上記のテンプレートを使用するとtty5(満足していない場合)、変更するのはtty8簡単です。tty8onの代わりにインスタンス化するだけですtty5。ローカルのカスタムセットを元に戻して[email protected]から再作成するのは少し難しいかもしれません[email protected]

autovt@tty5エイリアスmy-terminal-ui@tty5

[email protected]これは明らかに編集の論理的な進行です。autovt@tty窒素エイリアスは次のとおりです。ここからどこから始めても構いません。他に置き換えることができるメカニズムgetty@tty窒素

しかし、名前を直接使用するのと同じように、前述のものと同じ欠点もあります[email protected]。ログインを試みる必要があるからです。ログインサービスを開始しないこれはあなたが望むものではないかもしれません。実際にはどういう意味でも必要です。ここから始めます以下でログインしてください。

追加読書

答え2

getty使用するログインプログラムを自分のプログラムに置き換えるだけです。たとえば、私のDebianシステムでは、getty通話は次の場所にあります/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

そしてDebianは実際には次のものを使います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]

そして、以下を使用してさまざまなプログラムを呼び出すことができます。-lオプション:

   -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).

専用プログラムは各「tty」で実行できます。これを行う場合は、メンテナンスのためにシステムに直接ログインできることを確認する必要があります。これはシングルユーザーモードでもSSH経由でも可能です。これらgettyの定義はsshには適用されません。

CentOS7では、systemdを使用すると状況が異なるように設定されますが、最終結果は同じです。ご利用時systemctl list-unit-filesの関連サービスはです[email protected]。他のサービスと同様に、このサービスもカスタマイズできます。locate手がかりを得るには、以下を使用します。

/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

のファイルには/usr/lib/systemd/system/呼び出しが含まれていますagetty(CentOSのマニュアルページもあります)。以下を修正できます。

ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM

シンボリックリンク/usr/lib/systemd/system/multi-user.target.wants/getty.targetとその宛先にはgetty.target呼び出しが含まれていませんagetty

CentOS6はその間のどこかにあります。マイコンピュータにはCentOS6がありmingettyませんsystemd。マニュアルページから:

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.

たとえば、次のようにagettyカスタマイズできます。

   --loginprog /bin/login
          Change the login app.

構成ファイルで始まります。

# 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'

tty.overrideこれにより、に関する情報が見つかります。

はあなたが提供したスクリプトです/etc/init/tty.override(tty1の自動ログインの例を示し、スクリプトが実行できるアクションのおおよそのアイデアを提供します)。$TTYただし、変数が設定されます(/etc/init/start-ttys.confこの変数が属するinitscriptsパッケージには詳細なドキュメントはありません)。

答え3

だから私はインターネット検索の最後に2つの解決策を見つけました。

https://serverfault.com/questions/323289/replacing-tty-with-a-script-in-centos-6

そして

https://www.centos.org/forums/viewtopic.php?t=2414

最後に、私は次の点を指摘しています。

1) 以下の内容で「/etc/init/launch.conf」を作成します。

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [S016]
respawn
console owner
exec /usr/bin/openvt -c 1 -w -f -- /usr/sbin/setup

この例では、テキストモード設定ツールを実行します。

2) '/etc/init/start-ttys.conf'を編集し、ttyをlaunchに置き換えます。

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

これが最善の解決策であるかどうかはわかりませんが、動作しており、起動後にインストーラが表示されます。

関連情報