我一直都是使用文本+控制台启动,没有图形界面。这包括登录,这也只是文本,因为我在登录时做了一些同步操作,特别是在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
错误。agetty
agetty
TIOCSCTTY
ioctl()
agetty
ioctl()
如果终端当前不控制任何会话,或者它控制 id 不是agetty
pid的会话,则会出现问题。
从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
;我现在没有其他解释)。