SysVの場合は、gettyエントリ、バイナリ、シェルバイナリと共有ライブラリ、PAM /security/shadowコンテンツ、および一部のデバイスファイルを再生成する必要がinit
あります。/etc/inittab
/sbin/init
login
getty
upstart
ほとんど同じ要件が必要ですが、必要ないため、/etc/inittab
以下にいくつかの*.conf
ファイルがあります。ランレベルを設定するため/etc/init
の* .confと適切なランレベルReborn ttyで、そのttyの各boot /の* .confです。start on startup
telinit
getty
どの構成とバイナリが必要ですかsystemd
init
?
私が見つけたすべての文書は、インストールされたシステムを使用してサービスを開始および停止する方法に焦点を当てたようです。
実行からコピーされた最小ファイルのリスト(kernel / initrdを除く)アーチまたはFedoraの帽子インストールはうまくいきますが、これに関する情報が見つからないようですsystemd
。
私が知りたいのは、initramfsから呼び出されるsystemd
ために必要なファイルと含める必要があるファイルです。switch_root
systemd
/sbin/init
upstart
バイナリと2つのファイルの例*.conf
:
文書/etc/init/whatever.conf
:
起動時に起動 ランレベル発行 仕事 スクリプト リモート初期化 2 最終スクリプト
文書/etc/init/tty1.conf
:
ランレベルで始まる [12345] 更生 /sbin/agetty -8 --noclear 38400 tty1 linux の実行
はいsysvinit
、バイナリと1つのconfファイル名は次のとおりです/etc/inittab
。
id:2:初期化デフォルト: c1:12345:respawn:/sbin/agetty 38400 tty1 Linux
今、私はsystemd
同等のものを探しています。
andを含む項目の1つがある場所に少なくとも*.service
1つのファイルが必要であるとします。しかし、何が必要ですか?[Service]
ExecStart=-/sbin/agetty --noclear %I linux
Restart=always
答え1
まず、systemd
伝統的なUnixではありませんinit
。 Systemdははるかに多くの機能を持っているので、2つの比較は少し不公平です。
この質問に答えるには、いくつかのバイナリと次の設定ファイルが必要なようです。
/usr/lib/systemd/system/default.target /usr/lib/systemd/system/basic.target /usr/lib/systemd/system/sysinit.target /usr/lib/systemd/system/getty.target /usr/lib/systemd/システム/[Eメール保護] /usr/lib/systemd/system/console-getty.service
次に、次のシンボリックリンクを生成するには、次のコマンドを実行します。systemctl enable console-getty.service [email protected]
/etc/systemd/system/default.target.wants/[Eメール保護]-> /lib/systemd/system/getty@service /etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service
ノートsystemd
:動的に起動して+を押したときに要求に応じて起動する特別な機能を利用するには、agetty
少なくとも2つのファイルも必要です。AltF3
/etc/systemd/logind.conf /lib/systemd/システム/[Eメール保護]
[email protected]
シンボリックリンクはどこにありますか[email protected]
?
構成ファイルの内容:
フラグと(おそらく)を除いて、default.target
ファイルgetty.target
は空である可能性があります。sysinit.target
[Unit]
Description=xxx
basic.target
依存関係情報も含まれます。
[単位] 説明=基本システム リクエスト=sysinit.target 希望=sockets.targettimers.targetpaths.targetslices.target 以降=sysinit.targetsockets.targettimers.targetpaths.targetslices.target
ファイルに存在しないターゲットへの参照が必要かどうかはわかりません。彼らはで説明されていますsystemd.special(7)
マンページ。
console-getty.service
:(コンソールでagettyの特別な場合)
[単位] Description=ConsoleGetty 以降=systemd-user-sessions.service plymouth-quit-wait.service 前=getty.target [提供する] ExecStart=-/sbin/agetty --noclear --keep-baud コンソール 115200,38400,9600 $TERM タイプ=アイドル 再起動=常に 再起動時間 = 0 UtmpIdentifier=デメリット TTYPath=/dev/console TTYリセット=はい TTYVを壊す=はい KillMode=プロセス SIGPIPE無視=いいえ SIGHUP=YES 送信 [インストールする] WantedBy=getty.target
[email protected]
:(コンソールを除くすべてのgettyサービスの共通設定)
[単位] 説明=%Iのゲッティ 以降=systemd-user-sessions.service plymouth-quit-wait.service 前=getty.target 検疫を無視=はい 条件付きパス存在=/dev/tty0 [提供する] ExecStart=-/sbin/agetty --noclear %I $TERM タイプ=アイドル 再起動=常に 再起動時間 = 0 Utmp識別子=%I TTYパス=/dev/%I TTYリセット=はい TTYVを壊す=はい TTYVT割り当て解除=いいえ KillMode=プロセス SIGPIPE無視=いいえ SIGHUP=YES 送信 [インストールする] WantedBy=getty.target デフォルトインスタンス=tty1
最後に、いくつかの特別なバイナリが必要になることがあります(どれが重要かは試していません)。
/lib/systemd/systemd (/sbin/init は通常これを指します) /lib/systemd/systemd-ログイン /lib/systemd/systemd-cgroups-agent /lib/systemd/systemd-ユーザー-セッション /lib/systemd/systemd-vconsole-setup /lib/systemd/systemd-update-utmp /lib/systemd/systemd-睡眠 /lib/systemd/systemd-sysctl /lib/systemd/systemd-initctl /lib/systemd/systemd-reply パスワード /lib/systemd/systemd-ac-power /lib/systemd/systemd-有効化 /lib/systemd/systemd-バックライト /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-ホスト名 /lib/systemd/systemd-ジャーナルド /lib/systemd/systemd-journal-gatewayd /lib/systemd/systemd-journal-remote /lib/systemd/systemd-localed /lib/systemd/systemd-machined /lib/systemd/systemd-モジュール-ロード /lib/systemd/systemd-multi-seat-x /lib/systemd/systemd-networkd /lib/systemd/systemd-networkd-wait-online /lib/systemd/systemd-quotacheck /lib/systemd/systemd-任意のシード /lib/systemd/systemd-readahead /lib/systemd/systemd-remount-fs /lib/systemd/systemd-解決済み /lib/systemd/systemd-rfkill /lib/systemd/systemd-終了 /lib/systemd/systemd-shutdownd /lib/systemd/systemd-ソケット-プロキシd /lib/systemd/systemd-timedated /lib/systemd/systemd-timesyncd /lib/systemd/systemd-udevd /lib/systemd/systemd-更新-完了
systemd起動プロセスを要約すると、次のように動作すると思います。
basic.target
systemdは(またはすべての*.target
ファイルを?)探します。- 依存関係は、および設定ファイルセクションの、、、
WantedBy=
...ディレクティブに基づいて解決されます。Wants=
Before=
After=
[Install]
*.service
*.target
*.service
開始する必要があるサービス(「特殊」サービスではない)には、起動する実行可能ファイルを示す[Service]
指示を含むセクションがあります。ExecStart=
答え2
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
デーモンはターゲットのすべてのシステム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
ファイルの1つだけが必要で、.target
ディレクトリは必要ありません。
getty
initスクリプトで実行できるサービスの1つです。私が確認したディストリビューション(fedora、arch)では、getty
2つの異なる方法で実行されました。
- 各端末の特定のスクリプト(次にリンクされたファイル)によって実行されます。
/usr/lib/systemd/system/[email protected]
tty名はsystemd
次のように置き換えられます。) logind
ユーザーが仮想ターミナルに切り替えると、必要に応じて自動的に開始されます(inetd
要求が到着したときにのみサービスを開始する従来の方法に似ています)。logind
一緒に配布され、systemd
ファイルから構成を読み取る別のデーモンです/etc/systemd/logind.conf
。
これが満足であることを願っています。
答え3
いくつかの実験の後、一対のターゲットサービスで始めるのに十分であることがわかりました。コピーした場所emergency.service
:
[Unit]
DefaultDependencies=no
Description=shell.service: Console and Login
[Service]
Environment=HOME=/root
WorkingDirectory=-/root
ExecStart=-/usr/lib/systemd/systemd-sulogin-shell
ExecStartPost=/usr/bin/openvt -f -c 16 agetty tty16
ExecStartPost=/usr/bin/openvt -f -c 17 -- agetty -p tty17
ExecStartPost=/usr/bin/openvt -f -c 18 -- agetty -p -a USER tty18
Type=idle
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
#KillMode=process
KillMode=control-group
IgnoreSIGPIPE=no
SendSIGHUP=yes
テスト用:ディストリビューションのユニットディレクトリの名前を変更することは、/lib/systemd/systemDEACT
ユニット/ユニットファイルの数を200から10に減らす簡単で徹底的な方法です。それでも偽のファイルがあります。
UNIT LOAD ACTIVE SUB DESCRIPTION
dev-sda3.device loaded activating tentative /dev/sda3
-.mount loaded active mounted Root Mount
tmp.mount loaded active mounted /tmp
init.scope loaded active running System and Service Manager
io.service loaded inactive dead io: usbhid kmod for keyboard
remount.service loaded inactive dead remount: rw for / and tmpfs for /tmp
shell.service loaded active running shell.service: Console and Login
-.slice loaded active active Root Slice
system.slice loaded active active System Slice
* systemd-journald.socket not-found inactive dead systemd-journald.socket
* local-fs-pre.target not-found inactive dead local-fs-pre.target
* local-fs.target not-found inactive dead local-fs.target
mini.target loaded active active "mini": Minimal Boot and Shell
* swap.target not-found inactive dead swap.target
* umount.target not-found inactive dead umount.target
側面shell.service
(上を参照)には、remount.service
およびio.service
。これはmodprobe usbhid
私の(どんな?)USBキーボードに不可欠です。再マウントサービスは、再マウントのためにArchのinitrdスクリプトにあるfsckおよびtmp.mountと同期する必要があります/tmp
。また、rw
KCLで正しく配置する場所も特定する必要があります。また、[OK]
両方で起動します。使い捨てそして怠惰提供する。
依存関係ツリーは次のとおりです。
mini.target
* |-io.service
* |-remount.service
* `-shell.service
remount
これは、KCLとの重複/衝突のため、ターゲット/サービスのペアに過ぎず、io
実行中ですmodprobe usbhid
(ExecStart...
inを介して実行することもできますshell.service
)。カーネルCLをdefault.target
追加しない場合は、リンクを追加してください。systemd.unit=mini.target
私は追いかけて何時間も過ごしました。暫定的な dev-sdaX.device
(ただし、ルートパーティション)今では半分は正常だと思います。
-.mount
そして本質的-.slice
でinit.scope
意味があります。
tmp.mount
で生成されたと思います/run
。
Journald not-found
、local-fs、swap、およびumountユニットはsystemdに害を及ぼさないようです--state loaded
。おそらく、最初の追加ユニットとして作成する必要があります。しかし、local-fs
initrdでルートパーティションを調べる時点を定義する方法は? initrdで始めることができますか?最小?
systemctl status
また、最も小さいです。スライスはありますが、1つだけです(user-Xスライスなし)。
* archlinux
State: running
Jobs: 0 queued
Failed: 0 units
Since: Fri 2021-10-01 15:24:16 UTC; 3min 2s ago
CGroup: /
|-init.scope
| `-1 /sbin/init arch\x5cvmlinuz-linux
`-system.slice
`-shell.service
|-215 /usr/lib/systemd/systemd-sulogin-shell
|-219 bash
|-220 agetty tty16
|-222 agetty -p tty17
|-225 agetty -p -a USER tty18
`-238 systemctl status
KillMode
shell.service内のプロセスに何が起こるかを制御できます。該当する内容ps axf
は次のとおりです。
1 ? Ss 0:00 /sbin/init arch\vmlinuz-linux
215 tty1 Ss 0:00 /usr/lib/systemd/systemd-sulogin-shell
219 tty1 S 0:00 \_ bash
245 tty1 R+ 0:00 \_ ps axf
246 tty1 S+ 0:00 \_ tail -8
220 tty16 Ss+ 0:00 agetty tty16
222 tty17 Ss+ 0:00 agetty -p tty17
225 tty18 Ss+ 0:00 agetty -p -a USER tty18
両親はいませんagetty
。ありがとうございましたopenvt
か? - しかし、PID1 / init / systemdはまだpidを追跡します。shell.service
別のsでKillMode
再起動できました。
ctrl-D
Aまたは...をsulogin-shellと一緒に使用することはお勧めできません。exit
どうすればこれを止めることができますか?
その後、積極的なディレクトリの名前変更reboot
コマンドは「initデーモンと通信できません」などの操作を実行します。reboot.service
タスク(再起動なし、即時再起動なし)を含むA(レプリカ)はreboot-force
最も直接的な方法であり、このテストの開始(実行中のログなしなど)で十分です。 Sysvinitはまた、非常にエレガントまたは非常に迅速にシャットダウンされません。systemctl start reboot
その後、PID信号も送信され終了しますがsync
(おそらく)他のコマンドは閉じません。これは「最終」または「終了」の対象となり、そこからCPUreboot
またはpoweroff
。halt
shutdown-initramfsの有無にかかわらず。
したがって、systemd
Journald、udevd、dbus、およびすべてのユニットファイルと--user
インスタンスなしで起動および実行(および停止!)が可能です。しかし、これらの200個のリリースユニットを「スーパーマスク」(つまり消える)することは難しく、組み込みユニットと組み込みロジックの痕跡が残っています。
簡単に言うと: emergency.target
、、、DefaultDependencies=no
openvt