openeuler2509 fcitx5 输入法排查与修复记录

举报
山涧烟雨村 发表于 2026/09/02 12:25:46 2026/09/02
【摘要】 openeuler2509 fcitx5 输入法排查与修复记录本文档完整记录 openEuler 25.09 + UKUI + VNC 环境下 fcitx5 输入法不可用、无法切换五笔等问题的排查过程、根因、修复步骤与验证方法,供后续维护参考。 1. 环境项目值系统openEuler 25.09(内核 7.2.2 x86_64)桌面UKUI(ukui-session,窗口管理器 kwin)...

openeuler2509 fcitx5 输入法排查与修复记录

本文档完整记录 openEuler 25.09 + UKUI + VNC 环境下 fcitx5 输入法不可用、无法切换五笔等问题的排查过程、根因、修复步骤与验证方法,供后续维护参考。


1. 环境

项目
系统 openEuler 25.09(内核 7.2.2 x86_64)
桌面 UKUI(ukui-session,窗口管理器 kwin)
显示 VNC:Xvnc :1(1920x1020,端口 5901),:0 是 lightdm-greeter
输入法框架 fcitx5 5.1.12(fcitx5-chinese-addons 5.1.6,含拼音/五笔)
输入法列表 keyboard-us(英文)+ wbpy(五笔拼音,DefaultIM=wbpy)
环境变量约定 XMODIFIERS=@im=fcitx(注意原脚本曾误写为 =fcitx,已修正)、GTK_IM_MODULE=fcitxQT_IM_MODULE=fcitx

2. 问题现象

  1. VNC 登录后 fcitx5 输入法不可用 / 时好时坏;
  2. 出现 fcitx5 托盘窗口,但点击无法切换输入法(无法切到五笔);
  3. 日志中出现 Failed to open xim, retrying

3. 根因分析

3.1 双实例 + 会话 D-Bus 分裂(切换失效的根本原因)

/root/.vnc/xstartup 原先写法:

unset DBUS_SESSION_BUS_ADDRESS
DISPLAY=:1 fcitx5 -d --replace >/dev/null 2>&1 &   # 提前、无总线启动
lightdm &
ukui-session &

问题链:

  1. unset DBUS_SESSION_BUS_ADDRESS 后启动的 fcitx5 运行在私有会话总线上;
  2. 桌面应用(ukui-session 启动的)各自跑在桌面会话总线上,看不到 fcitx5;
  3. 桌面总线上的应用请求 org.fcitx.Fcitx5 时,D-Bus 自动激活出第二个 fcitx5 实例;
  4. 两个 fcitx5 实例争抢 XIM 槽位 → Failed to open xim, retrying → 输入法失灵、切换无效。

3.2 托盘图标(次要)

  • fcitx5 托盘图标由 notificationitem 插件(StatusNotifierItem,SNI)提供;
  • 本 openEuler 5.1.12 构建里 GlobalConfigDisabledAddons=notificationitem 配置运行时实际不生效(插件仍被加载,/proc/<pid>/maps 可证);
  • 本机 ukui-panel 虽有 StatusNotifierWatcher,但 fcitx5 的 StatusNotifierItem 未注册(总线 ListNames 中无 org.kde.StatusNotifierItem-*),因此实际不显示托盘图标;
  • 窗口树中的 “Fcitx5 Input Window” 是候选词输入窗口(打字必需),不是托盘,勿混淆。

4. 修复步骤

4.1 现场修复(杀掉双实例,在同一桌面总线上重启单个 fcitx5)

# 1) 获取桌面会话总线地址(来自 ukui-session / dbus-launch 进程环境)
tr '\0' '\n' < /proc/$(pgrep -f 'dbus-launch --exit-with-session' | head -1)/environ \
  | grep '^DBUS_SESSION_BUS_ADDRESS='        # 形如 unix:path=/tmp/dbus-XXXX,guid=...

# 2) 杀掉全部 fcitx5 实例
kill $(pgrep -x fcitx5); sleep 2

# 3) 携带桌面总线地址重启单个 fcitx5
DBUS_SESSION_BUS_ADDRESS='unix:path=/tmp/dbus-XXXX,guid=...' \
  DISPLAY=:1 fcitx5 -d --replace >/dev/null 2>&1 &

4.2 修改 /root/.vnc/xstartup(保证登录时正确启动,最终内容)

#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export GTK_IM_MODULE='fcitx'
export QT_IM_MODULE='fcitx'
export XMODIFIERS='@im=fcitx'
lightdm &
ukui-session &
# 等待桌面会话总线就绪后,再在同一 D-Bus 上启动 fcitx5,避免桌面总线自动拉起第二个实例
i=0
while [ $i -lt 20 ]; do
    BUS=
    for PID in $(pgrep -x ukui-session; pgrep -f 'dbus-launch --exit-with-session'); do
        BUS=$(tr '\0' '\n' < /proc/$PID/environ 2>/dev/null | sed -n 's/^DBUS_SESSION_BUS_ADDRESS=//p')
        [ -n "$BUS" ] && break 2
    done
    i=$((i+1))
    sleep 1
done
[ -n "$BUS" ] && export DBUS_SESSION_BUS_ADDRESS="$BUS"
DISPLAY=:1 fcitx5 -d --replace >/dev/null 2>&1 &

要点:

  • 必须遍历所有 ukui-session 进程再取 DBUS_SESSION_BUS_ADDRESS:pgrep -x ukui-session | head -n1 会命中没有该变量的进程(真正的变量在 dbus-launch 的子进程上),导致取不到地址、等待 20 秒超时后 fcitx5 又在无总线状态下启动(即又回到 3.1 的坑);
  • fcitx5 必须与桌面应用共用同一会话总线,否则 D-Bus 会再次自动拉起第二个实例。

4.3 禁用托盘图标配置(尽力而为)

~/.config/fcitx5/config[Behavior] 节:

[Behavior]
# Force Disabled Addons
DisabledAddons=notificationitem

⚠️ 如实说明:本构建中该配置未真正生效(见 3.2),但本机 SNI 本就未注册,实际观察结果即"无托盘图标"。若日后托盘图标出现,可考虑面板侧隐藏或更换 fcitx5 版本再查。

4.4 验证

export DISPLAY=:1
# 环境变量带桌面总线(按 4.1 取到的值)

# 1) 实例数应为 1
pgrep -a -x fcitx5; pgrep -c -x fcitx5

# 2) 切换五笔/英文
fcitx5-remote -s wbpy; fcitx5-remote -n        # 应输出 wbpy
fcitx5-remote -s keyboard-us; fcitx5-remote -n # 应输出 keyboard-us

# 3) XIM 已注册
xprop -root | grep XIM_SERVERS                # 应含 @server=fcitx

# 4) 无托盘图标(SNI 未注册,计数为 0)
dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus \
  org.freedesktop.DBus.ListNames | grep -c StatusNotifierItem

# 5) 窗口检查(需先安装:dnf install -y xwininfo)
xwininfo -root -tree | grep -iE 'fcitx'       # 只应有 Fcitx5 Input Window(候选词窗)

已验证结果:单实例 ✅、wbpy ↔ keyboard-us 切换正常 ✅、XIM 已注册 ✅、无托盘窗口 ✅。


5. 日常使用

快捷键 功能
Ctrl+Space 英文(keyboard-us)↔ 五笔拼音(wbpy)切换
Super+Space 输入法组轮换
候选词窗 “Fcitx5 Input Window” 为打字必需的候选窗,非托盘

若某个已打开的应用仍打不出中文:重启该应用即可(应用会重新连接 XIM/输入法服务),新打开的窗口不受影响。


6. 注意事项与坑(备忘)

  1. 不要在 unset DBUS_SESSION_BUS_ADDRESS 后单独启动 fcitx5 —— 会导致桌面总线 D-Bus 自动激活第二个实例争抢 XIM(双实例坑),输入法失灵。
  2. 取总线地址必须遍历所有 ukui-session 进程:pgrep -x ukui-session | head -n1 会命中没有 DBUS_SESSION_BUS_ADDRESS 的进程,导致取不到地址;等待循环超时后 fcitx5 又会在无总线状态下启动(坑会复发)。
  3. DisabledAddons=notificationitem 在本 openEuler 5.1.12 构建中不生效(运行时仍加载 notificationitem 插件);托盘图标由该插件(SNI)提供,本机 SNI 未注册故实际无托盘图标。
  4. “Fcitx5 Input Window” 是候选词窗口,不是托盘,不要误当作托盘去禁用。
  5. 诊断命令需要 DISPLAY=:1 和桌面 DBUS_SESSION_BUS_ADDRESS,否则 fcitx5-remote/dbus-send 报 Failed to create dbus connection
  6. 窗口排查依赖 xwininfo(已安装:dnf install -y xwininfo);fcitx5-diagnose 可检查插件与输入法配置。
  7. 默认输入法为五笔拼音 wbpy(profile:DefaultIM=wbpy),码表位于 /usr/share/libime/wbpy.main.dict

7. 附录:关键文件与常用诊断命令

文件 作用
/root/.vnc/xstartup VNC 会话启动脚本(等待会话总线 + 启动 fcitx5)
~/.config/fcitx5/config fcitx5 全局配置(热键、[Behavior]DisabledAddons)
~/.config/fcitx5/profile 输入法组与默认输入法(DefaultIM=wbpy)
/usr/share/fcitx5/addon/notificationitem.conf 托盘(SNI)插件定义
/usr/share/libime/wbpy.main.dict 五笔拼音码表

常用诊断命令速查:

# 进程 / 环境
ps aux | grep -E 'fcitx|Xvnc'
pgrep -a -x fcitx5
tr '\0' '\n' < /proc/<fcitx5-pid>/environ | grep -E 'DISPLAY|DBUS_SESSION_BUS_ADDRESS|XMODIFIERS'

# 会话总线
pgrep -a dbus-daemon
ls -la /tmp/dbus-*

# 输入法诊断 / XIM / 运行时插件加载
DISPLAY=:1 fcitx5-diagnose
xprop -root | grep XIM_SERVERS                    # 应含 @server=fcitx
grep -c libnotificationitem /proc/<fcitx5-pid>/maps   # 0 = 插件未加载

# 切换测试(需先 export DISPLAY=:1 与桌面总线地址)
fcitx5-remote -s wbpy; fcitx5-remote -n           # 应输出 wbpy
fcitx5-remote -s keyboard-us; fcitx5-remote -n    # 应输出 keyboard-us
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。