2025/10/14

GNOME Terminal 啟動延遲問題再次發生

 

問題描述

在執行 apt update 和 apt upgrade 之後,gnome-terminal 啟動延遲的問題再次出現。終端機在系統開機後需要 20-30 秒才能啟動,儘管先前的修正(停用 im-config 自動啟動 fcitx5 並建立 systemd 使用者服務)仍然有效。

症狀

  • GNOME Terminal 在系統開機後首次啟動時會有明顯延遲(約 26 秒)
  • 問題只發生在開機後的第一次啟動
  • 後續的啟動正常,沒有延遲
  • 先前的設定(im-config 設為 "none" 及自訂的 fcitx5.service)仍然完整

診斷過程

步驟 1:驗證先前的設定

確認先前的修正仍然有效:

$ im-config -l
 ibus fcitx5 xim

$ cat ~/.xinputrc
# im-config(8) generated on Fri, 10 Oct 2025 13:01:31 +0800
run_im none
# im-config signature: 0a0fbfefedad5558a9e9e2919b262f89  -

$ systemctl --user status fcitx5.service
● fcitx5.service - Fcitx5 Input Method
     Loaded: loaded (/home/charles-chang/.config/systemd/user/fcitx5.service; enabled; preset: enabled)
     Active: inactive (dead) since Tue 2025-10-14 08:32:41 CST

設定完整保留

步驟 2:檢查開機日誌的時序問題

$ journalctl --user -b 0 --no-pager | grep -E "(fcitx5|gnome-terminal|graphical-session)"

從開機序列中發現的關鍵資訊:

08:31:46 - graphical-session.target 尚未就緒
08:31:49 - 達到目標 graphical-session.target
08:31:49 - fcitx5.service 啟動
08:31:55 - 請求啟動 gnome-terminal
08:31:59 - fcitx5: DBus call error: org.freedesktop.DBus.Error.NoReply Method call timed out
08:32:04 - fcitx5: DBus call error: org.freedesktop.DBus.Error.NoReply Method call timed out
08:32:09 - fcitx5: DBus call error: org.freedesktop.DBus.Error.NoReply Method call timed out
08:32:14 - fcitx5: DBus call error: org.freedesktop.DBus.Error.NoReply Method call timed out
08:32:14 - fcitx5: Query portal value reaches retry limit
08:32:21 - gnome-terminal-server.service 啟動(請求後 26 秒!)

步驟 3:找出 Portal 服務問題

fcitx5 的日誌顯示 portalsettingmonitor.cpp 重複嘗試查詢桌面 portal 設定時發生錯誤。進一步檢查 portal 服務:

$ journalctl --user -b 0 --no-pager | grep -E "portal"

關鍵發現:

08:31:46 - 啟動 xdg-desktop-portal.service
08:31:46 - 啟用 org.freedesktop.impl.portal.desktop.gnome
08:31:46 - xdg-desktop-portal-gnome.service: Job failed with result 'dependency'
08:31:49 - fcitx5 啟動(portal 尚未就緒!)
08:32:36 - xdg-desktop-portal-gtk.service 以備用方案啟動(延遲 50 秒!)

根本原因分析

這個問題是從先前問題演變而來的:

先前的問題(已解決):

  • fcitx5 啟動太早(在 graphical-session.target 之前)
  • 透過讓 fcitx5 等待 graphical-session.target 來修正

目前的問題(apt upgrade 之後):

  1. xdg-desktop-portal-gnome.service 在 08:31:46 嘗試啟動,早於 graphical-session.target 完全就緒的時間(08:31:49)
  2. 由於 Requisite=graphical-session.target 相依性,GNOME portal 啟動失敗
  3. fcitx5 在 08:31:49 正確啟動(在 graphical-session.target 之後),但立即嘗試查詢 portal 設定
  4. portal 尚未就緒,導致 fcitx5 被阻塞並重試 4 次(每次逾時 5 秒 = 總共 20 秒)
  5. gnome-terminal 的啟動被阻塞,等待 fcitx5 完成初始化
  6. 在 fcitx5 放棄後,xdg-desktop-portal-gtk 以備用方案啟動,gnome-terminal 終於能夠啟動

為什麼在 apt upgrade 後發生:

套件更新可能修改了 xdg-desktop-portal 服務的時序或相依性,導致 GNOME portal 在開機序列中更早失敗。這造成了 fcitx5 和 portal 服務之間的新競爭條件。

解決方案

更新 fcitx5 systemd 服務,明確等待桌面 portal 服務:

檔案: ~/.config/systemd/user/fcitx5.service

[Unit]
Description=Fcitx5 Input Method
Documentation=man:fcitx5(1)
PartOf=graphical-session.target
After=graphical-session.target xdg-desktop-portal.service
Wants=graphical-session.target xdg-desktop-portal.service

[Service]
Type=simple
ExecStart=/usr/bin/fcitx5
ExecStartPost=/usr/bin/dbus-update-activation-environment --systemd GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx
Restart=on-failure
RestartSec=3

[Install]
WantedBy=graphical-session.target

變更內容:

  • 在 After= 指令中加入 xdg-desktop-portal.service:fcitx5 會等到 portal 就緒後才啟動
  • 在 Wants= 指令中加入 xdg-desktop-portal.service:確保 portal 服務被請求/啟動

套用修正:

$ systemctl --user daemon-reload
$ systemctl --user show fcitx5.service | grep -E "^(After|Wants)="
Wants=graphical-session.target xdg-desktop-portal.service
After=graphical-session.target basic.target xdg-desktop-portal.service app.slice

驗證結果

重新開機系統後:

  • gnome-terminal 立即啟動,沒有延遲
  • fcitx5 日誌中沒有 DBus 逾時錯誤
  • 正確的啟動序列:graphical-session.target → xdg-desktop-portal → fcitx5 → gnome-terminal

關鍵要點

  1. 服務相依性很重要:即使修正了最初的 im-config 競爭條件,其他相依性(如桌面 portal)仍可能引入新的時序問題
  2. 系統更新可能改變時序:套件更新可能改變服務啟動順序或相依性,暴露出先前隱藏的競爭條件
  3. 監控所有元件:問題不在於 fcitx5 相對於 graphical-session.target 的時序(這部分是正確的),而是它與 portal 服務的互動
  4. 適當的相依鏈:同時使用 After= 和 Wants= 確保服務以正確順序啟動,並且所需的服務確實被啟動

參考資料

沒有留言:

張貼留言