在虚拟控制台上启动 getty 的最小 systemd 启动需要什么?

Mat*_*nco 23 boot systemd

对于SysV的init,我需要/etc/inittab重生的getty项目中,/sbin/init二进制,二进制文件和共享库的外壳,logingetty,的PAM /安全性/阴影的东西,和一些设备文件。

因为upstart我需要几乎相同的要求,但不是/etc/inittab,我在下面有几个*.conf文件/etc/init:一个 *.confstart on startup设置运行级别telinit,每个 tty 的 *.confgetty在适当的运行级别上在该 tty 上启动/重新生成.

我需要什么配置和二进制文件systemd init

我发现的所有文档似乎都集中在如何使用已安装的系统来启动和停止服务。

从正在运行的Archfedora安装中复制的最小文件列表(内核/initrd 除外)就可以了,但我似乎找不到关于systemd.


我想知道的是,systemd在 initramfsswitch_root调用systemd /sbin/init.


例如upstart,二进制文件和两个*.conf文件:

文件/etc/init/whatever.conf

启动时开始
发出运行级别
任务
脚本
  telinit 2
结束脚本

文件/etc/init/tty1.conf

从运行级别开始 [12345]
重生
exec /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某处至少需要1 个文件,其中一个[Service]条目包含ExecStart=-/sbin/agetty --noclear %I linuxRestart=always,但还需要什么?

Mat*_*nco 19

首先,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的特殊功能来agetty动态启动,在按Alt+F3等时按需启动,看来您还必须至少拥有这两个文件:

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

哪里autovt@.servicegetty@.service.

配置文件内容:

default.targetgetty.targetsysinit.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:(控制台上agetty的特殊情况)

[单元]
描述=控制台盖蒂
After=systemd-user-sessions.service plymouth-quit-wait.service
之前=getty.target

[服务]
ExecStart=-/sbin/agetty --noclear --keep-baud 控制台 115200,38400,9600 $TERM
类型=空闲
重启=总是
重启秒=0
UtmpIdentifier=cons
TTYPath=/dev/console
TTYReset=是
TTYVHangup=是
KillMode=进程
忽略SIGPIPE=no
发送SIGHUP=是

[安装]
WantedBy=getty.target

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

[单元]
描述 = Getty on %I
After=systemd-user-sessions.service plymouth-quit-wait.service
之前=getty.target
IgnoreOnIsolate=yes
ConditionPathExists=/dev/tty0

[服务]
ExecStart=-/sbin/agetty --noclear %I $TERM
类型=空闲
重启=总是
重启秒=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=是
TTYVHangup=是
TTYVTDisallocate=no
KillMode=进程
忽略SIGPIPE=no
发送SIGHUP=是

[安装]
WantedBy=getty.target
默认实例=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-激活
/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/systemd/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-预读
/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-update-done

总结 systemd 的启动过程,我认为它的工作原理是这样的:

  1. systemd 定位basic.target(或所有*.target文件?)
  2. 依赖项根据WantedBy=, Wants=, Before=, After=...和配置文件[Install]部分中的指令进行解析。*.service*.target
  3. *.services 应该启动(不是“特殊”服务),有一个[Service]带有ExecStart=指令的部分,指出要启动的可执行文件。


pqn*_*net 6

systemd当您切换到终端时,自动创建一个 getty,最多达到某个最大数量。默认值为 6(因此您会自动获得 alt+f1 到 alt+f6 的 getty)。如果您想更改此参数,您可以编辑/etc/systemd/logind.confNAutoVTs参数更改为其他数字(最多 12 个)

如果即使不手动切换也希望生成 getty,可以/usr/lib/systemd/system/getty@.service/etc/systemd/system/getty.target.wants/目录添加符号链接:

ln -sf /usr/lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service
Run Code Online (Sandbox Code Playgroud)

这将导致getty.target需要多一项getty@服务。目标是需要生成的服务集合,用于替换支持依赖项的运行级别。默认目标取决于getty.target

请参阅ArchWiki中的systemd 常见问题解答

编辑: 我在文档中研究了更多。

在启动时,systemd守护进程加载default目标中的所有系统及其依赖项。目标由文件定义

/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target
Run Code Online (Sandbox Code Playgroud)

目标具有由目录中的符号链接指定的附加服务列表

/etc/systemd/system/default.target.wants
/usr/lib/systemd/system/default.target.wants
Run Code Online (Sandbox Code Playgroud)

/etc版本覆盖了/usr/lib. 只需要其中一个.target文件,不需要目录

getty只是可以由 init 脚本运行的服务之一。在我检查的发行版中(fedora、arch)getty以两种不同的方式运行:

  1. 由每个终端的特定脚本启动(链接到/usr/lib/systemd/system/getty@.service文件中的 tty 名称被替换为systemd来自链接文件名
  2. logind当用户切换到虚拟终端时根据需要自动启动(类似于旧的inetd仅在请求到达时启动服务的方式)。logind是一个不同的守护进程systemd,与一起分发,并从/etc/systemd/logind.conf文件中读取其配置。

希望这是令人满意的。