哪个 systemd 服务在帧缓冲设备上启动文本控制台?

SF.*_*SF. 6 systemd framebuffer console

我正在使用嵌入式平台,需要/dev/fb0清除供我自己使用(可通过串行控制台访问的设备,而屏幕用于显示信息,没有 X。)。

我已经default.target从图形用户更改为多用户,但现在它在帧缓冲设备上打开 getty 并显示登录提示,但我无法找到哪个服务。我不想偶然禁用串行控制台登录,并且lsof/dev/fb0打开时不显示任何内容。

如果有帮助的话,发行版是 Yocto Linux。

Jde*_*eBP 14

lsof/dev/fb0打开时不显示任何内容。

不会。Linux 内核中内置了一个终端模拟器程序。它不会表现为具有打开文件句柄的正在运行的进程。它位于帧缓冲区和输入事件子系统之上,它使用内部内核接口来访问。它以一系列内核虚拟终端设备的形式呈现给应用模式系统,/dev/tty1等等;下面的伪文件/sys显示了活动的 KVT 编号;以及一系列 CGA 风格的视频缓冲设备,/dev/vcsa1等等。

这些应用程序模式系统之一当然是getty+login系统,它可以配置为在这些内核虚拟终端上运行,并且(如您所见)默认是。您可以getty使用文档化的 systemd 机制轻松摆脱这些流程。

在旧的 System 5init系统中,每个getty都是/etc/inittab. 在 BSDinit系统中,每getty一个都是/etc/ttys. 在 systemd 系统中,事情有点间接。

  • “登录”守护进程logind知道 systemd 俚语中称为“席位”的事情。“座位”零是具有主要帧缓冲区和所有这些内核虚拟终端的座位。
  • 对于那个席位,logind尝试启动N 个systemd 服务,命名为autovt@tty1.serviceto 。N的值在 中的设置中设置。autovt@ttyN.serviceNAutoVTs/etc/systemd/logind.conf
  • 从创建这些systemd服务的服务模板单元,取名autovt@.service。的模板的参数,如上述,内核虚拟终端的的设备名称的设备文件/dev/
  • autovt@.service在默认配置中,是指向getty@.service.
  • getty@.service描述了运行一个getty程序,设置为通过内核虚拟终端设备文件进行输入/输出。

因此,要停止任何此类操作,请访问/etc/systemd/logind.conf并配置logind不自动启动任何autovt服务(并且不保留任何虚拟终端,如果您想对其进行彻底了解)。

然而,这还不是全部。终端模拟器程序在内核中仍然处于活动状态,从定向到内核 VT 的日志消息到光标的定期闪烁,所有内容都会导致终端模拟器干扰您对帧缓冲区的使用。但这是对使用帧缓冲区与内核终端仿真器程序协商的程序进行编码的问题,这里已经回答了这个问题。

顺便说一下,串行控制台登录是通过完全不同的途径进行的。一个发电机创建的实例serial-getty@.service模板单元中的开机时间,每个内核控制台设备,一旦实例化它,它发现,或讲述。

进一步阅读