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

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

CentOS を起動後、ログインせずに tui (ncurses プログラム) を表示させたいです。ログイン プロンプトは表示したくありません。

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

それを実現する方法はありますか?

答え1

M. Dickey の systemd の回答は少し曖昧です。systemd オペレーティング システムの詳細は次のとおりです。

ログイン プロンプトを表示するサービスは、たとえばのログイン サービス用の[email protected]テンプレートのインスタンスです。このような端末デバイスでこれを独自のサービスに置き換えるには、2 つのことを行う必要があります。[email protected]tty6

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

これはかなり簡単です:

システムディレクトリ[メールアドレス]

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

[サービス]
ExecStart=/usr/local/sbin/カスタムユーザーインターフェース
標準入力=tty
標準出力=tty
再起動=常に
再起動秒数=1
Utmp識別子=%I
TTYパス=/dev/%I
TTYリセット=はい
TTYVハングアップ=はい
TTYVTDisallocate=はい
SIGHUP を送信 = はい

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

これはテンプレートサービス ユニットは、テンプレート パラメータとしてカーネル仮想端末デバイスの名前を使用してインスタンス化されます。

ブートストラップ時にサービスが自動的に開始されることを確認します。

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

まず、決めなければならないのはどれのこれが実行されるカーネル仮想端末デバイス。ここではいくつかの情報が関係してきます:

  • Fedora の世界では、2008 年以降、グラフィカル ユーザー インターフェイスは最初のカーネル仮想端末デバイスを使用します。tty1その仮想端末デバイスを使用しないか、グラフィカル ユーザー インターフェイスを使用しない (または手動で調整する) かを選択する必要があります。
  • NAutoVTssystemd の logind は、設定ファイルで設定された最大値まで、カーネル仮想端末上でログイン サービスを要求開始しようとしますlogind.conf。これはデフォルトでtty1有効です。tty6
  • tty7Fedora の世界では、free が残ります。しかし、Debian の世界では、Debian は現在 systemd オペレーティングシステムですが、グラフィカルユーザーインターフェイスは を使用しますtty7。Debian への移植を検討する必要があるかもしれません。
  • systemd の世界では、カーネル仮想端末 #6 を「常に存在する」ログイン プロンプト、つまり筋肉の記憶によってControl+ Alt+を押すログイン プロンプトF6にしようとします。

を選んだとしますtty5

ユーザーがカーネル仮想端末 #5 に切り替えるたびに、 logind が[email protected]( の別名)をデマンド スタートするのを停止する必要があります。の設定を6 から (たとえば) 4 に下げることでこれを実現できます。[email protected]NAutoVTslogind.conf

システムのブートストラップ時にサービスが自動的に開始されること、つまり「有効」になっていることを確認する必要があります。

システムctlを有効にする[メールアドレス]

代替案

これを行う方法は他にもあります。

テンプレート化されていないサービス

の代わりに、を (たとえば) に置き換えて、ユニット内の端末デバイス名をハードワイヤードし[email protected]ます。my-terminal-ui.service%Itty5

これをテンプレート定義として提供したのは、 とは異なる選択を簡単に行えるようにするためですtty5

のいずれかを使用してautovt@ttyいいえ自分の名前の代わりに

サービス定義の名前として使用することもできます。これにより、テンプレートのインスタンス化がオーバーライドされます。/etc/systemd/system/[email protected][email protected]

このアプローチの利点は、NAutoVTsサービスを有効にすることに煩わされることなく、ユーザーがカーネル仮想端末 #5 に切り替えるたびに logind がサービスを要求して開始するようにしておけばよいことです。

欠点は、デマンドスタート機構が設計されていることですログインプロセスを実行しない未使用のカーネル仮想端末でサービスが実行される。そのため、サービスはシステムブートストラップでは実行されず、カーネル仮想端末#5を初めてアクティブにしたときにのみ実行される。このオンデマンド起動は、望ましくないかもしれない。カスタムシステムの他の部分では、サービスが既に実行中たとえば、ブートストラップ以降から。

編集するgetty@ttyいいえ

人々は、変更を物事を行う方法と見なしています。彼らは次のようなコマンドを実行します/etc/ttys/etc/inittab[email protected]

systemctl 編集[メールアドレス]

そして、オーバーライドを追加します。

[サービス]
# この空白の割り当ては誤植ではありません。
実行開始=
ExecStart=/usr/local/sbin/カスタムユーザーインターフェース

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

サービスを作るゲッティという名前ですa{ , min, f}プログラムを実行しないというgettyのは、保守性が非常に低いアイデアです。数年後、ここで行ったことを忘れてしまったとき、または他の誰かがそのようなシステムの管理を引き継ぐようになったとき、「getty」サービスが常にユーティリティを実行するわけではないことは明らかではありませんgetty

[email protected]スペースとして考えないでくださいその端末で実行されるもの必要に応じて変更する必要があります。これは、systemd の考え方ではありません。 [email protected]「getty」プログラムを実行します。「getty」サービスとはまったく異なるプログラムを実行し、「getty」サービスとはまったく異なるプログラムを実行するサービスは、それ自体が別のサービス定義である必要があります。

さらに、別のサービス定義により、サービスを「getty」サービスのように定義する必要がなくなります。前述のサービス定義は、「getty」サービスの動作のほとんどをコピーします。これには以下が含まれます。画面をきれいにしようと努力する(世界があなたにそうすることを望んでいるように)。しかし、あなたのサービスのように実際には「ログイン」サービスではないサービスTTYReset=yesでは、画面をそれほど積極的にクリアしたくないなど、いじくり回すことutmpxは望まないかもしれません。

さらに、別のサービス定義の方が、将来変更するのが簡単です。 から への変更tty5(それが不十分な場合) は、tty8前述のテンプレートを使用すると簡単です。tty8ではなく でインスタンス化するだけですtty5。 からローカル カスタマイズのセットを抽出し[email protected]、 に対して再作成するのは、いくぶん困難です[email protected]

エイリアシングautovt@tty5my-terminal-ui@tty5

これは編集からの論理的な進歩であり[email protected]、明らかにautovt@ttyいいえエイリアスはここで何が始まるのか他のものを代用することを可能にするメカニズムgetty@ttyいいえ

しかし、名前を直接使用する場合と同じ欠点があり[email protected]、logindの試行に関係します。ログインサービスを開始しないそれはあなたが望んでいることではないかもしれません。何があろうとも要求-ここから始まったlogind より

参考文献

答え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 経由である可能性があります。定義はgettyssh には適用されません。

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 はその中間です。私のマシンには があり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/centos-6 で tty をスクリプトに置き換える

そして

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

これが最善の解決策かどうかはわかりませんが、動作しており、起動後にセットアップ プログラムが表示されます。

関連情報