没有文本控制台的文本启动:Fedora 36 中的agetty 问题

没有文本控制台的文本启动:Fedora 36 中的agetty 问题

我一直都是使用文本+控制台启动,没有图形界面。这包括登录,这也只是文本,因为我在登录时做了一些同步操作,特别是在tty1我有自动登录脚本的地方,它通过文件执行以下命令:/etc/systemd/system/[email protected]/override.conf

/usr/sbin/agetty --autologin <myusername> --noclear %I 38400 linux

我刚刚升级到 Fedora 36(从 35),直到最后一步引导都很顺利。它没有显示文本登录提示,而是显示黑屏,左上角有下划线。

为什么?

该命令systemctl运行良好,除了一条红线:

[email protected]    loaded failed failed    Getty on tty1

在日志中,我可以看到一个错误:

agetty[4565]: /dev/tty1: "cannot get controlling tty: Operation not permitted"
agetty[4565]: setting terminal attributes failed: Input/output error

每次我以 root 身份尝试时,我都会在控制台中看到此错误

 service [email protected] start

我不知道出了什么问题,但好像agetty命令改变了?

编辑

如果我输入以下行:

ExecStart=-/usr/sbin/agetty --autologin <myusername> --noclear tty1 38400 linux

在文件中自动登录有效。然而,如果我改为/etc/systemd/system/[email protected]/override.conf

ExecStart=-/home/<myusername>/bin/myautologinscript.sh

用同样的线,它没有!

答案1

当终端设备成为会话的控制终端失败时,将返回该cannot get controlling tty: Operation not permitted错误。agettyagettyTIOCSCTTY ioctl()agetty

ioctl()如果终端当前不控制任何会话,或者它控制 id 不是agettypid的会话,则会出现问题。

tty_ioctl(2)手册页:

TIOCSCTTY
      Argument: int arg

      Make the given terminal the controlling terminal of the  calling
      process.   The  calling process must be a session leader and not
      have a controlling terminal already.  For this case, arg  should
      be specified as zero.

      If  this  terminal is already the controlling terminal of a dif‐
      ferent session group, then the ioctl fails  with  EPERM,  unless
      the caller has the CAP_SYS_ADMIN capability and arg equals 1, in
      which case the terminal is stolen, and all processes that had it
      as controlling terminal lose it.

agetty因此,如果不是会话领导者,它将无法工作。

如果您启动一个在子进程中运行的脚本agetty而不是agetty直接启动,那么 shell 将成为会话领导者,但agetty也不会。

usingexec agetty将在与 shell 相同的进程中运行agetty(将替换 shell),然后agetty将成为会话领导者。

如果这在以前版本的 Fedora 中具有相同的操作方式,我的猜测是systemd已经使终端设备成为会话的控制终端,可以通过在open()没有标志的情况下调用它来实现O_NOCTTY。但即便如此,agetty不担任会议主持人听起来也是个坏主意。

(我认为在这种情况下,受控会话仍然agetty与 pid 不匹配,因此它仍然会尝试发出TIOCSCTTY;我现在没有其他解释)。

相关内容