对于SysV的init
,我需要/etc/inittab
重生的getty项目中,/sbin/init
二进制,二进制文件和共享库的外壳,login
的getty
,的PAM /安全性/阴影的东西,和一些设备文件。
因为upstart
我需要几乎相同的要求,但不是/etc/inittab
,我在下面有几个*.conf
文件/etc/init
:一个 *.confstart on startup
设置运行级别telinit
,每个 tty 的 *.confgetty
在适当的运行级别上在该 tty 上启动/重新生成.
我需要什么配置和二进制文件systemd
init
?
我发现的所有文档似乎都集中在如何使用已安装的系统来启动和停止服务。
从正在运行的Arch或fedora安装中复制的最小文件列表(内核/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 linux
和Restart=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@.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
:(控制台上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 的启动过程,我认为它的工作原理是这样的:
basic.target
(或所有*.target
文件?)WantedBy=
, Wants=
, Before=
, After=
...和配置文件[Install]
部分中的指令进行解析。*.service
*.target
*.service
s 应该启动(不是“特殊”服务),有一个[Service]
带有ExecStart=
指令的部分,指出要启动的可执行文件。systemd
当您切换到终端时,自动创建一个 getty,最多达到某个最大数量。默认值为 6(因此您会自动获得 alt+f1 到 alt+f6 的 getty)。如果您想更改此参数,您可以编辑/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
Run Code Online (Sandbox Code Playgroud)
这将导致getty.target
需要多一项getty@
服务。目标是需要生成的服务集合,用于替换支持依赖项的运行级别。默认目标取决于getty.target
编辑: 我在文档中研究了更多。
在启动时,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
以两种不同的方式运行:
/usr/lib/systemd/system/getty@.service
文件中的 tty 名称被替换为systemd
来自链接文件名)logind
当用户切换到虚拟终端时根据需要自动启动(类似于旧的inetd
仅在请求到达时启动服务的方式)。logind
是一个不同的守护进程systemd
,与一起分发,并从/etc/systemd/logind.conf
文件中读取其配置。希望这是令人满意的。
归档时间: |
|
查看次数: |
24049 次 |
最近记录: |