沒有文本控制台的文本啟動:Fedora 36 中的 getty 問題
我一直使用沒有圖形界面的文本+控制台啟動。這包括登錄,這也只是文本,因為我在登錄時做了一些同步的東西,特別是
tty1
在我有一個自動登錄腳本的地方,它通過文件執行以下命令/etc/systemd/system/getty@tty1.service.d/override.conf
:/usr/sbin/agetty --autologin <myusername> --noclear %I 38400 linux
我剛剛升級到 Fedora 36(從 35 開始),並且引導一切正常,直到最後一步。它沒有向我顯示文本登錄提示,而是在左上角顯示一個帶有下劃線的黑屏。
為什麼?
該命令
systemctl
執行良好,除了一條紅線:● getty@tty1.service 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 getty@tty1.service start
我不知道出了什麼問題,但似乎 agetty 命令改變了?
編輯:
如果我把這條線:
ExecStart=-/usr/sbin/agetty --autologin <myusername> --noclear tty1 38400 linux
在文件
/etc/systemd/system/getty@tty1.service.d/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)
手冊頁: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
不會。Using
exec agetty
將agetty
在與 shell 相同的程序中執行(將替換 shell),然後agetty
將成為會話負責人。如果這在以前版本的 Fedora 中以相同的作案方式工作,我的猜測是
systemd
已經使終端設備成為會話的控制終端,可能通過open()
在沒有O_NOCTTY
標誌的情況下呼叫它。但即便如此,agetty
不擔任會議負責人聽起來也是個壞主意。(我認為在那種情況下,受控會話仍然與
agetty
pid 不匹配,所以它仍然會嘗試發出TIOCSCTTY
;我現在沒有其他解釋)。