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


21

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

因为upstart我需要几乎相同的要求,但不是,而是在下面/etc/inittab有几个*.conf文件/etc/init:一个* .conf,start on startup它使用来设置运行级别telinit,以及每个* .conf,用于getty在适当的运行级别上在该tty上启动/重生的每个tty 。

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

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

从正在运行的Archfedora安装中复制文件的最小清单(内核/ initrd除外)就可以了,但是我似乎找不到关于的那种信息systemd


我想知道的是,systemd在initramfs switch_root调用后,要启动登录shell,需要哪些文件以及必须包含什么文件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 linux和条目Restart=always,但还需要什么呢?


现在,最近有RedHat知识库文章(754933)在此URL下描述了systemd引导:RHEL 7的systemd概述
MattBianco 2015年

令人沮丧的是,人们如何将一条配置线炸成一片混乱并称之为改进。
将于

Answers:


17

首先,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@.service的符号链接在哪里getty@.service

配置文件内容:

default.targetgetty.targetsysinit.target文件可以是除空[Unit]标签和(可能)Description=xxx

basic.target 还包含依赖项信息:

[单元]
Description =基本系统
需要= sysinit.target
Wants = sockets.target timers.target路径.target slices.target
After = sysinit.target sockets.target timers.target路径.target slices.target

我不确定是否需要引用文件中不存在的目标。它们在systemd.special(7)手册页中进行了描述。


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

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

[服务]
ExecStart =-/ sbin / agetty --noclear --keep-baud控制台115200,38400,9600 $ TERM
类型=空闲
重启=总是
RestartSec = 0
UtmpIdentifier =缺点
TTYPath = / dev /控制台
TTYReset =是
TTYVHangup =是
KillMode =进程
IgnoreSIGPIPE =否
SendSIGHUP =是

[安装]
WantedBy = getty.target

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

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

[服务]
ExecStart =-/ sbin / agetty --noclear%I $ TERM
类型=空闲
重启=总是
RestartSec = 0
UtmpIdentifier =%I
TTYPath = / dev /%I
TTYReset =是
TTYVHangup =是
TTYVTDisallocate =否
KillMode =进程
IgnoreSIGPIPE =否
SendSIGHUP =是

[安装]
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 / 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-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. *.service应该启动的(不是“特殊”服务)具有一个[Service]带有ExecStart=指令的部分,指出要启动的可执行文件。

1
AFAIK [Install]引导顺序不会使用该部分,只能使用systemctl enable。引导程序查看的是其中的符号链接/etc/systemd/system/basic.target.wants/,它们是由创建的systemctl enable
Stefan Majewsky

6

systemd当您切换到终端时,它会自动创建一个盖蒂(最大数量上限)。默认值为6(因此您会自动获得alt + f1到alt + f6的盖蒂)。如果要更改此参数,可以编辑/etc/systemd/logind.conf以将NAutoVTs参数更改为其他某个数字(最多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

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

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

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

在启动时,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文件,而不需要目录

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

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

希望这令人满意。


我想知道需要哪些文件,以及它们应包含的内容。您能否用一个所需文件列表来总结您的答案,是什么导致它们以什么顺序被读取?我缺少有关在该目录中需要找到的内容的信息。我会尽力阐述我的问题。谢谢!
MattBianco 2014年

@MattBianco您不必要地对systemd。我正在研究它,一旦您了解了东西的工作原理,它看起来非常简单
pqnet 2014年

1
是的,其他开放源代码项目的文档让我很着迷。对不起,我听起来很抱歉。令人沮丧的是,似乎没有简单的文档来解释启动过程。(我现在知道这是因为systemd并不简单。)我想以幽默的方式评论说,这也许systemd是敌对的,就像对开放系统启动的方式进行敌对的接管一样。它使GNU / Linux脱离了Unix。并不是说那是一件坏事,但这与传统上的情况大不相同。谷歌搜索表明我并不孤单。
MattBianco 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.