我一直使用没有图形界面的文本+控制台启动。这包括登录,这也只是文本,因为我在登录时做了一些同步的东西,特别是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
与同一行,它没有!
当它使终端设备成为会话的控制终端时返回该
cannot get controlling tty: Operation not permitted
错误。agetty
agetty
TIOCSCTTY
ioctl()
agetty
ioctl()
如果终端当前不控制任何会话,或者它控制 id 不是agetty
pid的会话,它会发出问题。从
tty_ioctl(2)
手册页:agetty
因此,如果不是会话负责人,它将不起作用。agetty
如果您启动在子进程中运行的脚本而不是agetty
直接启动,那么 shell 将成为会话负责人,而agetty
不会。Using
exec agetty
将agetty
在与 shell 相同的进程中运行(将替换 shell),然后agetty
将成为会话负责人。如果这在以前版本的 Fedora 中以相同的操作方式工作,我的猜测是systemd
已经使终端设备成为会话的控制终端,可能通过open()
在没有O_NOCTTY
标志的情况下调用它。但即便如此,agetty
不担任会议负责人听起来也是个坏主意。(我认为在那种情况下,受控会话仍然与
agetty
pid 不匹配,所以它仍然会尝试发出TIOCSCTTY
;我现在没有其他解释)。