問題描述
在執行 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 之後):
xdg-desktop-portal-gnome.service
在 08:31:46 嘗試啟動,早於graphical-session.target
完全就緒的時間(08:31:49)- 由於
Requisite=graphical-session.target
相依性,GNOME portal 啟動失敗 - fcitx5 在 08:31:49 正確啟動(在 graphical-session.target 之後),但立即嘗試查詢 portal 設定
- portal 尚未就緒,導致 fcitx5 被阻塞並重試 4 次(每次逾時 5 秒 = 總共 20 秒)
- gnome-terminal 的啟動被阻塞,等待 fcitx5 完成初始化
- 在 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
關鍵要點
- 服務相依性很重要:即使修正了最初的 im-config 競爭條件,其他相依性(如桌面 portal)仍可能引入新的時序問題
- 系統更新可能改變時序:套件更新可能改變服務啟動順序或相依性,暴露出先前隱藏的競爭條件
- 監控所有元件:問題不在於 fcitx5 相對於 graphical-session.target 的時序(這部分是正確的),而是它與 portal 服務的互動
- 適當的相依鏈:同時使用
After=
和Wants=
確保服務以正確順序啟動,並且所需的服務確實被啟動
參考資料
- 先前的修正:http://highaltitudeoolong.blogspot.com/2025/10/gnome-terminal_32.html
- systemd.unit(5):服務相依性和順序
- fcitx5 portalsettingmonitor.cpp:桌面 portal 整合