
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
その仮想端末デバイスを使用しないか、グラフィカル ユーザー インターフェイスを使用しない (または手動で調整する) かを選択する必要があります。 NAutoVTs
systemd の logind は、設定ファイルで設定された最大値まで、カーネル仮想端末上でログイン サービスを要求開始しようとしますlogind.conf
。これはデフォルトでtty1
有効です。tty6
tty7
Fedora の世界では、free が残ります。しかし、Debian の世界では、Debian は現在 systemd オペレーティングシステムですが、グラフィカルユーザーインターフェイスは を使用しますtty7
。Debian への移植を検討する必要があるかもしれません。- systemd の世界では、カーネル仮想端末 #6 を「常に存在する」ログイン プロンプト、つまり筋肉の記憶によってControl+ Alt+を押すログイン プロンプトF6にしようとします。
を選んだとしますtty5
。
ユーザーがカーネル仮想端末 #5 に切り替えるたびに、 logind が[email protected]
( の別名)をデマンド スタートするのを停止する必要があります。の設定を6 から (たとえば) 4 に下げることでこれを実現できます。[email protected]
NAutoVTs
logind.conf
システムのブートストラップ時にサービスが自動的に開始されること、つまり「有効」になっていることを確認する必要があります。
システムctlを有効にする[メールアドレス]
代替案
これを行う方法は他にもあります。
テンプレート化されていないサービス
の代わりに、を (たとえば) に置き換えて、ユニット内の端末デバイス名をハードワイヤードし[email protected]
ます。my-terminal-ui.service
%I
tty5
これをテンプレート定義として提供したのは、 とは異なる選択を簡単に行えるようにするためです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@tty5
my-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 経由である可能性があります。定義は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 はその中間です。私のマシンには があり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
これが最善の解決策かどうかはわかりませんが、動作しており、起動後にセットアップ プログラムが表示されます。