Boot

最小的 systemd 啟動需要什麼才能在虛擬控制台上啟動 getty?

  • October 4, 2021

對於 SysV init,我需要/etc/inittab重新生成 getty 條目、/sbin/init二進製文件、shell 的二進製文件和共享庫、logingetty、 PAM/security/shadow 的東西,以及一些設備文件。

因為upstart我需要幾乎相同的要求,但是/etc/inittab我在下面有幾個*.conf文件/etc/init:一個 *.conf 用於start on startup設置執行級別telinit,以及一個 *.conf 用於每個 ttygetty在適當的執行級別上啟動/重生.

我需要什麼配置和二進製文件systemd init

我發現的所有文件似乎都集中在如何使用已安裝的系統來啟動和停止服務。

從正在執行的Archfedora安裝中複製的最小文件列表(核心/initrd 除外)就可以了,但我似乎找不到關於systemd.


我想知道的是,對於systemd在 initramfsswitch_root呼叫systemd /sbin/init.


例如upstart,二進製文件和兩個*.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:initdefault:
c1:12345:respawn:/sbin/agetty 38400 tty1 linux

現在我追求systemd等價物。

*.service我假設某處至少需要一個文件,其中一個[Service]條目包含ExecStart=-/sbin/agetty --noclear %I linuxand Restart=always,但還需要什麼?

首先,systemd不是傳統的 unix init。Systemd 要多得多,所以比較兩者有點不公平。

要回答這個問題,似乎需要一些二進製文件和以下配置文件:

/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/system/getty@.service
/usr/lib/systemd/system/console-getty.service

然後發出systemctl enable console-getty.service getty@tty2.service創建這些符號連結:

/etc/systemd/system/default.target.wants/getty@tty2.service -> /lib/systemd/system/getty@service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

注意:要利用systemd’s 的特殊功能來動態啟動,按+等agetty時按需啟動,看來您至少還必須擁有以下兩個文件:Alt``F3

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

autovt@.service的符號連結在哪裡getty@.service

配置文件內容:

, , 文件可以是空的default.target,除了getty.target標籤和(可能)。sysinit.target``[Unit]``Description=xxx

basic.target還包含依賴資訊:

[單元]
描述=基本系統
需要=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)手冊頁上進行了描述。


console-getty.service:(控制台上的特殊情況)

[單元]
描述=控制台蓋蒂
After=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
TTYReset=是
TTYVHangup=是
KillMode=程序
忽略SIGPIPE=否
發送SIGHUP=是

[安裝]
WantedBy=getty.target

getty@.service: (除控制台外的所有 getty 服務的通用配置)

[單元]
描述=蓋蒂在 %I
After=systemd-user-sessions.service plymouth-quit-wait.service
之前=getty.target
IgnoreOnIsolate=是
ConditionPathExists=/dev/tty0

[服務]
ExecStart=-/sbin/agetty --noclear %I $TERM
類型=空閒
重啟=總是
重啟秒=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=是
TTYVHangup=是
TTYVTDisallocate=否
KillMode=程序
忽略SIGPIPE=否
發送SIGHUP=是

[安裝]
WantedBy=getty.target
預設實例=tty1

最後,您可能需要一些特殊的二進製文件(我沒有嘗試過哪些是關鍵的):

/lib/systemd/systemd(/sbin/init 通常指向這個)
/lib/systemd/systemd-logind
/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-回复-密碼
/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-journald
/lib/systemd/systemd-journal-gatewayd
/lib/systemd/systemd-journal-remote
/lib/systemd/systemd-localed
/lib/systemd/systemd-machined
/lib/systemd/systemd-modules-load
/lib/systemd/systemd-multi-seat-x
/lib/systemd/systemd-networkd
/lib/systemd/systemd-networkd-線上等待
/lib/systemd/systemd-quotacheck
/lib/systemd/systemd-隨機種子
/lib/systemd/systemd-readahead
/lib/systemd/systemd-remount-fs
/lib/systemd/systemd-resolved
/lib/systemd/systemd-rfkill
/lib/systemd/systemd-關閉
/lib/systemd/systemd-shutdownd
/lib/systemd/systemd-socket-proxyd
/lib/systemd/systemd-timedated
/lib/systemd/systemd-timesyncd
/lib/systemd/systemd-udevd
/lib/systemd/systemd-更新-完成

總結 systemd 啟動過程,我認為它的工作原理如下:

  1. systemd 定位basic.target(或所有*.target文件?)
  2. 依賴關係是基於WantedBy=, Wants=, Before=, After=…和配置文件[Install]部分中的指令解析的。*.service``*.target
  3. *.service應該啟動的s(不是“特殊”服務),有一個[Service]帶有ExecStart=指令的部分,指出要啟動的執行檔。

引用自:https://unix.stackexchange.com/questions/150975