如何使用 Systemd 获得更少的 tty?

dai*_*isy 31 linux systemd console

在过去,我只是修改了/etc/inittab. 现在,使用 systemd,它似乎会自动启动 tty[1-6],我应该如何禁用 tty[4-6]?

看起来只有一个 systemd 服务文件,它使用 a%I来区分不同的 tty 会话。我希望我不需要删除该服务,并getty@ttyX.service手动创建每个服务。

jas*_*yan 37

没有真正需要禁用“额外的”TTY,因为在systemdgettys下是按需生成的:man systemd-getty-generator有关详细信息,请参阅。请注意,默认情况下,此自动生成仅针对 VT6 以下的 VT 完成(以模仿传统的 Linux 系统)。

正如Lennart 在博客文章1 中所说

为了使事情更有效,登录提示现在仅按需启动。当您切换到 VT 时,getty 服务被实例化为 getty@tty2.service、getty@tty5.service 等等。由于我们不必再无条件地启动 getty 进程,这使我们可以节省一些资源,并使启动速度更快。

如果您确实希望配置特定数量的 getty,您可以logind.conf使用适当的条目进行修改,在此示例 3 中:

NAutoVTs=3
Run Code Online (Sandbox Code Playgroud)


1. 事实上,systemd for Administrators的整个系列帖子(目前编号为 18 )非常值得一读。


小智 12

在基于 Debian 的系统上,如果您刚刚构建了一个服务器(没有 dbus 服务),则有一个文件会导致在启动时启动 5 个额外的 getty:

/lib/systemd/system/getty.target.wants/getty-static.service
Run Code Online (Sandbox Code Playgroud)

在里面,它说:

[Service]
Type=oneshot
ExecStart=/bin/systemctl --no-block start getty@tty2.service getty@tty3.service getty@tty4.service getty@tty5.service getty@tty6.service
RemainAfterExit=true
Run Code Online (Sandbox Code Playgroud)

只需删除此文件即可阻止额外的 getty 生成。如果您只想生成一个额外的 getty(用于 2 个 virt 控制台),请随意缩短列表。请注意,您会在 tty1 上自动获得一个,因此您始终至少拥有一个虚拟控制台。

另请参阅:如果缺少 dbus,则 systemd-logind.service 无法启动

  • 注意:该文件归 systemd 包所有,因此要修改或删除它,请先使用 `dpkg-divert`。但是,还有一种 systemd-native 方法可以解决这个问题 - 运行 `sudo systemctl mask getty-static.service` 并在 `/etc` 中设置你自己的 (2认同)
  • `屏蔽`启用的服务是[嘈杂](https://unix.stackexchange.com/questions/369713/removing-debian-package-automatically-masks-systemd-service-causes-a-systemd-w),它在 `/etc` 中创建一个同名的单元来覆盖它的内容会更清晰。如果您希望启动零静态 getty,请使用 ExecStart=/bin/true。 (2认同)

tem*_*oto 12

要在特定 TTY 4-6 上禁用 gettys 同时可能使 1-3 和 7-9 工作,请运行:

for i in {4..6}; do
  systemctl mask getty@tty${i}.service
done
Run Code Online (Sandbox Code Playgroud)

mask创建/etc/systemd/system/{name} -> /dev/null有效禁用服务的符号链接。尝试通过运行它systemctl start会显示错误Failed to start NAME.service: Unit NAME.service is masked.

如果你有 A.service Wants=masked.service,那么start A会成功,但也会在日志中产生依赖启动错误。

如果你有 B.service Requires=masked.service,那么start B也会失败。

是的,死灵回答。干杯。