最小限のシステム起動で仮想コンソールでgettyを起動するには何が必要ですか?

最小限のシステム起動で仮想コンソールでgettyを起動するには何が必要ですか?

SysVの場合は、gettyエントリ、バイナリ、シェルバイナリと共有ライブラリ、PAM /security/shadowコンテンツ、および一部のデバイスファイルを再生成する必要がinitあります。/etc/inittab/sbin/initlogingetty

upstartほとんど同じ要件が必要ですが、必要ないため、/etc/inittab以下にいくつかの*.confファイルがあります。ランレベルを設定するため/etc/initの* .confと適切なランレベルReborn ttyで、そのttyの各boot /の* .confです。start on startuptelinitgetty

どの構成とバイナリが必要ですかsystemd init

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

実行からコピーされた最小ファイルのリスト(kernel / initrdを除く)アーチまたはFedoraの帽子インストールはうまくいきますが、これに関する情報が見つからないようですsystemd


私が知りたいのは、initramfsから呼び出されるsystemdために必要なファイルと含める必要があるファイルです。switch_rootsystemd /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つがある場所に少なくとも*.service1つのファイルが必要であるとします。しかし、何が必要ですか?[Service]ExecStart=-/sbin/agetty --noclear %I linuxRestart=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起動プロセスを要約すると、次のように動作すると思います。

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

答え2

systemd端末に切り替えると、特定の最大数までgettyが自動的に生成されます。デフォルトは6です(したがって、alt + f1からalt + f6まで自動的にgettyを取得します)。このパラメータを変更するには、編集してパラメータ/etc/systemd/logind.confNAutoVTs別の数字(最大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

よりArchWikiのsystemd FAQ

編集する: もう少し調べました。文書

起動すると、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ディレクトリは必要ありません。

gettyinitスクリプトで実行できるサービスの1つです。私が確認したディストリビューション(fedora、arch)では、getty2つの異なる方法で実行されました。

  1. 各端末の特定のスクリプト(次にリンクされたファイル)によって実行されます。/usr/lib/systemd/system/[email protected]tty名はsystemd次のように置き換えられます。)
  2. 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。また、rwKCLで正しく配置する場所も特定する必要があります。また、[OK]両方で起動します。使い捨てそして怠惰提供する。

依存関係ツリーは次のとおりです。

mini.target
* |-io.service
* |-remount.service
* `-shell.service

remountこれは、KCLとの重複/衝突のため、ターゲット/サービスのペアに過ぎず、io実行中ですmodprobe usbhidExecStart...inを介して実行することもできますshell.service)。カーネルCLをdefault.target追加しない場合は、リンクを追加してください。systemd.unit=mini.target

私は追いかけて何時間も過ごしました。暫定的な dev-sdaX.device(ただし、ルートパーティション)今では半分は正常だと思います。

-.mountそして本質的-.sliceinit.scope意味があります。

tmp.mountで生成されたと思います/run

Journald not-found、local-fs、swap、およびumountユニットはsystemdに害を及ぼさないようです--state loaded。おそらく、最初の追加ユニットとして作成する必要があります。しかし、local-fsinitrdでルートパーティションを調べる時点を定義する方法は? 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

KillModeshell.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-DAまたは...をsulogin-shellと一緒に使用することはお勧めできません。exit

どうすればこれを止めることができますか?

その後、積極的なディレクトリの名前変更rebootコマンドは「initデーモンと通信できません」などの操作を実行します。reboot.serviceタスク(再起動なし、即時再起動なし)を含むA(レプリカ)はreboot-force最も直接的な方法であり、このテストの開始(実行中のログなしなど)で十分です。 Sysvinitはまた、非常にエレガントまたは非常に迅速にシャットダウンされません。systemctl start rebootその後、PID信号も送信され終了しますがsync(おそらく)他のコマンドは閉じません。これは「最終」または「終了」の対象となり、そこからCPUrebootまたはpoweroffhaltshutdown-initramfsの有無にかかわらず。


したがって、systemdJournald、udevd、dbus、およびすべてのユニットファイルと--userインスタンスなしで起動および実行(および停止!)が可能です。しかし、これらの200個のリリースユニットを「スーパーマスク」(つまり消える)することは難しく、組み込みユニットと組み込みロジックの痕跡が残っています。

簡単に言うと: emergency.target、、、DefaultDependencies=noopenvt

関連情報