web-dev-qa-db-ja.com

仮想コンソールでgettyを起動するために最小限のsystemdブートに必要なものは何ですか?

SysV initの場合、_/etc/inittab_リスポーンgettyエントリ、_/sbin/init_バイナリ、シェルのバイナリと共有ライブラリ、logingetty、PAM /セキュリティ/シャドウスタッフ、およびいくつかのデバイスファイルが必要です。

upstartの場合、ほぼ同じ要件が必要ですが、_/etc/inittab_の下にいくつかの_*.conf_ファイルがあります。ランレベルを設定する_/etc/init_という* .confが1つあります。 telinit、および適切なランレベルのttyでgettyを開始/再起動するttyごとに1つの* .conf.

systemdinitにはどのような構成とバイナリが必要ですか?

私が見つけたすべてのドキュメントは、すでにインストールされているシステムを使用してサービスを開始および停止する方法に焦点を当てているようです。

実行中のArchまたはFedoraインストールからコピーするファイルの最小のリスト(kernel/initrdを除く)は問題なく動作しますが、そのような情報を見つけることができないようですsystemd


私が知りたいのは、systemdの場合、initramfsがsystemd _start on startup_を_switch_root_呼び出しした後にログインシェルを開始するには、どのファイルが必要で、何を含める必要があるかです。


upstart、バイナリ、および2つの_/sbin/init_ファイルの例:

ファイル_*.conf_:

起動時に開始
ランレベルを発行
タスク
スクリプト
 telinit 2 
スクリプト終了

ファイル_/etc/init/whatever.conf_:

 start on runlevel [12345] 
 respawn 
 exec/sbin/agetty -8 --noclear 38400 tty1 linux 

sysvinit、バイナリ、および_/etc/init/tty1.conf_という名前の1つのconfファイルの例:

 id:2:initdefault:
 c1:12345:respawn:/ sbin/agetty 38400 tty1 linux 

今、私はsystemdに相当します。

_/etc/inittab_エントリが_*.service_と_[Service]_を含む_ExecStart=-/sbin/agetty --noclear %I linux_エントリで少なくとも1つの_Restart=always_ファイルがどこかに必要であると思いますが、他に何が必要ですか?

21
MattBianco

まず、systemdは従来のUNIX initではありません。 Systemdの方がはるかに多いので、2つを比較するのは少し不公平です。

質問に答えるために、必要と思われるのは、いくつかのバイナリと次の構成ファイルです。

/usr/lib/systemd/system/default.target 
/usr/lib/systemd/system/basic.target 
/usr/lib/systemd/system/sysinit。ターゲット
/usr/lib/systemd/system/getty.target 
/usr/lib/systemd/system/getty @ .service 
/usr/lib/systemd/system/console-getty.service 

systemctl enable console-getty.service [email protected]を発行すると、次のシンボリックリンクが作成されます。

/etc/systemd/system/default.target.wants/[email protected]> /lib/systemd/system/getty@service
/etc/systemd/system/getty.target .wants/console-getty.service-> /lib/systemd/system/console-getty.service

[〜#〜]注[〜#〜]systemdの動的機能を開始するためのagettyの特別な機能を利用するには、押すとオンデマンド Alt+F3 など、少なくとも次の2つのファイルが必要であるようです。

/etc/systemd/logind.conf 
/lib/systemd/system/autovt @ .service 

ここで、[email protected][email protected]へのシンボリックリンクです。

構成ファイルの内容:

default.targetタグと(おそらく)getty.targetを除いて、sysinit.target[Unit]Description=xxxファイルは空にすることができます。

basic.targetには、依存関係情報も含まれています。

 [Unit] 
 Description = Basic System 
 Requires = sysinit.target 
 Wants = sockets.target timers.target paths.target slices.target 
 After = sysinit.target sockets.target timers.target paths.target slices.target 

ファイルとして存在しないターゲットへの参照が必要かどうかはわかりません。それらは systemd.special(7) のmanページで説明されています。


console-getty.service:(コンソール上のagettyの特別なケース)

 [Unit] 
 Description = Console Getty 
 After = systemd-user-sessions.service plymouth-quit-wait.service 
 Before = getty.target 
 
 [サービス] 
 ExecStart =-/ sbin/agetty --noclear --keep-baud console 115200,38400,9600 $ TERM 
 Type = idle 
 Restart = always 
 RestartSec = 0 
 UtmpIdentifier = cons 
 TTYPath =/dev/console 
 TTYReset = yes 
 TTYVHangup = yes 
 KillMode = process 
 IgnoreSIGPIPE = no 
 SendSIGHUP = yes 
 
 [Install] 
 WantedBy = getty.target 

[email protected]:(コンソールを除くすべてのgettyサービスの一般的な設定)

 [Unit] 
 Description = Getty on%I 
 After = systemd-user-sessions.service plymouth-quit-wait.service 
 Before = getty.target 
 IgnoreOnIsolate = yes 
 ConditionPathExists =/dev/tty0 
 
 [Service] 
 ExecStart =-/ sbin/agetty --noclear%I $ TERM 
 Type = idle 
 Restart = always 
 RestartSec = 0 
 UtmpIdentifier =%I 
 TTYPath =/dev /%I 
 TTYReset = yes 
 TTYVHangup = yes 
 TTYVTDisallocate = no 
 KillMode = process 
 IgnoreSIGPIPE = no 
 SendSIGHUP = yes 
 
 [インストール] 
 WantedBy = getty.target 
 DefaultInstance = tty1 

最後に、おそらくこれらの特別なバイナリのいくつかが必要です(どのバイナリが重要かは試していません)。

/lib/systemd/systemd(/ sbin/initは通常これを指します)
/lib/systemd/systemd-logind 
/lib/systemd/systemd-cgroups-agent 
/lib/systemd/systemd-user-sessions 
/lib/systemd/systemd-vconsole-setup 
/lib/systemd/systemd-update-utmp 
/lib/systemd/systemd-sleep 
/lib/systemd/systemd-sysctl 
/lib/systemd/systemd-initctl 
/lib/systemd/systemd-reply-password 
/lib/systemd/systemd-ac-power 
/lib/systemd/systemd-activate 
/lib/systemd/systemd-backlight 
/lib/systemd/systemd -binfmt 
/lib/systemd/systemd-bootchart 
/lib/systemd/systemd-bus-proxyd 
/lib/systemd/systemd-coredump 
/lib /systemd/systemd-cryptsetup
/lib/systemd/systemd-fsck
/lib/systemd/systemd-hostnamed
/lib/systemd/systemd-journald
 /lib/systemd/systemd-journal-gatewayd
/lib/systemd/systemd-journal-remote
/lib/systemd/systemd-localed
/lib/systemd/systemd- machined 
/lib/syst emd/systemd-modules-load 
/lib/systemd/systemd-multi-seat-x 
/lib/systemd/systemd-networkd 
/lib/systemd/systemd-networkd -wait-online 
/lib/systemd/systemd-quotacheck 
/lib/systemd/systemd-random-seed 
/lib/systemd/systemd-readahead 
/lib/systemd/systemd-remount-fs 
/lib/systemd/systemd-resolved 
/lib/systemd/systemd-rfkill 
/lib/systemd/systemd-shutdown 
/lib/systemd/systemd-shutdownd 
/lib/systemd/systemd-socket-proxyd 
/lib/systemd/systemd-timedated 
/lib/systemd/systemd-timesyncd 
/lib/systemd/systemd-udevd 
/lib/systemd/systemd-update-done 

Systemdの起動プロセスを要約すると、次のように機能すると思います。

  1. systemdはbasic.target(またはすべての*.targetファイル?)を検索します
  2. 依存関係は、WantedBy=およびWants=構成ファイルのBefore=セクションのAfter=[Install]*.service*.target...ディレクティブに基づいて解決されます。
  3. 開始する必要がある*.services(「特別な」サービスではない)には、開始する実行可能ファイルを示す[Service]ディレクティブを含むExecStart=セクションがあります。
17
MattBianco

systemdは、ターミナルに切り替えると、特定の最大数までgettyを自動的に作成します。デフォルトは6です(したがって、alt + f1からalt + f6のgettyが自動的に取得されます)。このパラメーターを変更する場合は、/etc/systemd/logind.confを編集してNAutoVTsパラメーターを他の数値(最大12)に変更できます。

手動で切り替えなくてもgettyを起動したい場合は、/usr/lib/systemd/system/[email protected]へのシンボリックリンクを/etc/systemd/system/getty.target.wants/ディレクトリに追加できます。

ln -sf /usr/lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]

これにより、getty.targetにはもう1つのgetty@サービスが必要になります。ターゲットは、生成する必要のあるサービスのコレクションであり、依存関係をサポートするランレベルの置き換えです。デフォルトのターゲットはgetty.targetによって異なります

参照してください systemd FAQ

edit:ドキュメント でもう少し詳しく調べました。

ブート時に、systemdデーモンは、defaultターゲット内のすべてのシステムとその依存関係をロードします。ターゲットはファイルによって定義されます

/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target

ターゲットには、ディレクトリ内のシンボリックリンクによって指定された接続サービスのリストがあります

/etc/systemd/system/default.target.wants
/usr/lib/systemd/system/default.target.wants

/etcバージョンは、/usr/libの配布のデフォルトをオーバーライドします。 .targetファイルは1つだけ必要ですが、ディレクトリは必要ありません

gettyは、initスクリプトで実行できるサービスの1つにすぎません。チェックしたディストリビューション(Fedora、Arch)では、gettyは2つの異なる方法で実行されます。

  1. 各端末の特定のスクリプトによって開始(/usr/lib/systemd/system/[email protected]ファイルへのリンク tty名はリンクファイル名からsystemdに置き換えられます
  2. ユーザーが仮想端末に切り替えると、logindによって必要に応じて自動的に起動されます(古いinetdが要求を受信したときにのみサービスを起動する方法と同様)。 logindは、systemdとともに配布される別のデーモンであり、/etc/systemd/logind.confファイルからその構成を読み取ります。

これで満足です。

6
pqnet