Linux

沒有文本控制台的文本啟動:Fedora 36 中的 getty 問題

  • June 22, 2022

我一直使用沒有圖形界面的文本+控制台啟動。這包括登錄,這也只是文本,因為我在登錄時做了一些同步的東西,特別是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 不是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 agettyagetty在與 shell 相同的程序中執行(將替換 shell),然後agetty將成為會話負責人。

如果這在以前版本的 Fedora 中以相同的作案方式工作,我的猜測是systemd已經使終端設備成為會話的控制終端,可能通過open()在沒有O_NOCTTY標誌的情況下呼叫它。但即便如此,agetty不擔任會議負責人聽起來也是個壞主意。

(我認為在那種情況下,受控會話仍然與agettypid 不匹配,所以它仍然會嘗試發出TIOCSCTTY;我現在沒有其他解釋)。

引用自:https://unix.stackexchange.com/questions/707044