冷蟊初退 孤灯野澜 志起鸡鸣 墓不悲秋 技术交流 软件开发 商业合作 加Q:411239339

我把开发机从 GNOME 换成了 XFCE,折腾了一整天,值了

浏览:19次阅读
没有评论

共计 3420 个字符,预计需要花费 9 分钟才能阅读完成。

TL;DR:gnome-shell 在双屏开发机上空闲吃掉 5% CPU + 833MB 内存。切换到 XFCE 4.18 之后内存占用降到不足 200MB,双屏拖窗口终于不再像在搅拌水泥。过程中遇到七个坑——输入法、SecureCRT 中文、钉钉扫码、登录界面消失、Plank 不显示应用、合成器闪烁、Ghostty hook 报错——每一个都有点反直觉。


问题:桌面壳子比我的业务进程还能吃

这台机器的配置不差:18 核 Xeon E5-2686、64GB ECC、GTX 1060 6GB。理论上它跑什么都应该很顺。但切换 workspace、拖动窗口、偶尔开个 file manager,整体手感就像隔着一层薄棉。

有天习惯性地 ps aux 了一眼,看到这行:

chin   4969  5.0  1.2 5236980 833564 ?  Ssl  4 月 01  73:17  /usr/bin/gnome-shell

一个桌面 shell,在没什么前台操作的情况下持续 5% CPU,开机到现在累计跑了 73 分钟。内存 833MB,比我跑的几个后台服务还多。

GPU 利用率只有 10%,驱动完全正常。问题不在硬件,在 GNOME 自己。

GNOME Shell 基于 GJS(JavaScript 运行时),它的合成器 Mutter 在双屏配置下渲染压力会直接翻倍。我的显示器是 DVI + HDMI 各一块 1920×1080,合计 3840×1080,全部 60Hz。这个组合对 Mutter 来说不是什么灾难,但它就是不够利索。

在另一台 GTX 660 的旧机器上,切换到 XFCE 之后变得丝滑。那台机器 GPU 比这台弱得多——说明瓶颈从来就不在 GPU。


第一步:装 XFCE,没什么好说的

sudo apt install xfce4 xfce4-goodies xfce4-terminal thunar \
    xfce4-power-manager xfce4-notifyd -y

注销,登录界面点齿轮选 Xfce Session。进去之后 xfwm4 的 CPU 占用在 top 里基本找不到,内存加起来不到 200MB。这部分完全没有意外。


第一个坑:卸载 GNOME 后进不了桌面

XFCE 跑稳之后,自然想把 GNOME 卸掉省资源。apt remove gnome-shell gnome-desktop* 一敲,重启——黑屏,只剩一个闪烁的光标。

Ctrl+Alt+F2 进 TTY,查 LightDM 日志:

Seat seat0: Failed to find session configuration default
Seat seat0: Failed to create greeter session

原因是 GNOME 卸载时把 LightDM 的 greeter 一起拖走了。/usr/share/xgreeters/ 目录空了,LightDM 找不到登录界面,直接 crash 循环。

修法很简单:

sudo apt install lightdm-gtk-greeter -y
sudo systemctl restart lightdm

Ctrl+Alt+F7 切回去,登录界面回来了。

教训:卸载 GNOME 前,先确认 /usr/share/xgreeters/ 里有至少一个 .desktop 文件。 没有的话先装 lightdm-gtk-greeter,再卸 GNOME。


第二个坑:输入法

在 GNOME 下输入法一般能凑合,到了 XFCE 就要手动把环境变量搞定。

sudo apt install fcitx5 fcitx5-chinese-addons \
    fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 \
    fcitx5-frontend-qt5 fcitx5-frontend-qt6 \
    fcitx5-config-qt -y

im-config -n fcitx5

然后在 ~/.xprofile 里写死:

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
fcitx5 -d &

这个文件在 XFCE 登录时会被 source,所以只需要写一次。

五笔用户注意

如果你用的不是拼音而是五笔,需要额外安装码表:

sudo apt install fcitx5-table-wubi-large -y

然后 必须先杀掉 fcitx5 再编辑 profile,否则 fcitx5 退出时会把你的修改覆盖回去:

kill $(pgrep fcitx5)

cat > ~/.config/fcitx5/profile << 'EOF'
[Groups/0]
Name=Default
Default Layout=us
DefaultIM=wubi-large

[Groups/0/Items/0]
Name=keyboard-us
Layout=

[Groups/0/Items/1]
Name=wubi-large
Layout=

[GroupOrder]
0=Default
EOF

fcitx5 -d

这个 "kill → 改 → 启动 " 的顺序很重要。fcitx5 会在退出时把内存里的 profile 写回磁盘,如果你在它还活着的时候改了文件,下次退出就会被覆盖。


第三个坑:SecureCRT 的中文输入

这是第一个真正让我头疼的问题。

XFCE + fcitx5 之后,所有应用的中文输入都正常,就是 SecureCRT 不行。候选词框出不来,直接把拼音字母上屏。

第一反应:Qt 插件没装好。检查了 fcitx5-frontend-qt5qt6,都装了。

第二反应:环境变量没传进去。加了 QT_IM_MODULE=fcitx,没用。

搜了一圈,才意识到问题根本不在这里。SecureCRT 不用系统的 Qt。它把自己的 Qt 6.8.4 打包在 /usr/lib/scrt-sfx/ 里,QT_PLUGIN_PATH 只指向自己的目录,完全无视系统的 fcitx5 Qt 插件。

所以不管系统侧怎么配,SecureCRT 根本读不到。

解法有点绕,但有效:fcitx5 自带一个 IBus 兼容层(libibusfrontend.so),它能模拟 IBus 服务,暴露一个 IBUS_ADDRESS socket。SecureCRT 内置了 ibus 输入插件,而这个插件不依赖 Qt 版本——它直接通过 socket 通信。

换言之,绕开 Qt 插件机制,走 IBus 协议。

创建一个启动脚本 ~/.local/bin/securecrt-launch.sh

#!/bin/bash
IBUS_ADDRESS=$(grep -h "^IBUS_ADDRESS=" ~/.config/ibus/bus/*-unix-0 2>/dev/null \
    | grep -v "^IBUS_ADDRESS=$" | head -1 | cut -d= -f2-)
export IBUS_ADDRESS
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
exec SecureCRT "$@"

修改 ~/.local/share/applications/SecureCRT.desktop,把 Exec 改成这个脚本路径。用户目录下的 .desktop 文件优先于 /usr/share/applications/,不需要 sudo。

注意 Plank 用户:如果你的 Plank Dock 上固定了 SecureCRT,还需要编辑 ~/.config/plank/dock1/launchers/SecureCRT.dockitem,把 Launcher 指向用户级的 desktop 文件:

[PlankDockItemPreferences]
Launcher=file:///home/ 你的用户名 /.local/share/applications/SecureCRT.desktop

改完之后 重启 Plankkillall plank && plank &),否则 Plank 会缓存旧的 desktop 文件,从 Dock 启动的 SecureCRT 仍然没有中文输入。


第四个坑:钉钉扫码登录直接闪退

这个是最反直觉的。

切换到 XFCE 之后,打开钉钉,账号密码登录正常,但扫码登录一扫就闪退,连报错都不打。

journalctl --user 里什么都没有,因为它在写日志之前就死了。

strings 翻了一下 dingtalk_dll.so(137MB 的主逻辑库),找到这些字符串:

gnome-screenshot
DesktopInfo::GNOME
disable_use_gnome_screen_shot_bugfix

钉钉的扫码功能需要截取屏幕内容来识别二维码。它的截图逻辑里有一个 DesktopInfo::GNOME 的分支检查,匹配到 GNOME 就调用 gnome-screenshot。XFCE 下 XDG_CURRENT_DESKTOP=XFCE,这个分支不命中,截图调用失败,整个流程 crash。

修法:先装上 gnome-screenshot,然后用包装脚本欺骗钉钉,让它以为自己在 GNOME 下运行。

sudo apt install gnome-screenshot -y

创建 ~/.local/bin/dingtalk-launch.sh

#!/bin/bash
export XDG_CURRENT_DESKTOP=GNOME
export GNOME_DESKTOP_SESSION_ID=this-is-deprecated
exec /opt/apps/com.alibabainc.dingtalk/files/Elevator.sh "$@"

覆盖用户级 desktop 文件,修改 Exec 指向这个脚本。扫码登录恢复正常。


第五个坑:Plank 不显示正在运行的应用

装好 Plank 之后,Dock 栏上只有固定的图标,打开 Chrome、SecureCRT 等应用,Dock 上完全没有反应。PinnedOnly 已经设成 false

问题出在 bamfdaemon。Plank 依赖它来匹配窗口和 .desktop 文件的对应关系——知道哪个窗口属于哪个应用。卸载 GNOME 的时候,bamfdaemon 的自启动被一起移除了。

# 确认 bamfdaemon 没在跑
pgrep bamfdaemon || echo "没运行"

# 找到正确路径并启动
/usr/lib/x86_64-linux-gnu/bamf/bamfdaemon &

启动后重启 Plank(killall plank && plank &),运行中的应用立刻出现在 Dock 上。

设置开机自启:

cat > ~/.config/autostart/bamfdaemon.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=BAMFDaemon
Exec=/usr/lib/x86_64-linux-gnu/bamf/bamfdaemon
Hidden=false
NoDisplay=true
X-XFCE-Autostart=true
EOF

教训:Plank 不光需要自己自启,还需要 bamfdaemon 一起自启。 两者缺一不可。


第六个坑:XFWM4 合成器导致 Plank 和输入法闪烁

主题和 Plank 都配好之后,发现输入法候选框一直在闪,Plank Dock 栏也在抖,像是一直在重绘。

关掉 XFWM4 的内置合成器,闪烁立刻消失:

xfconf-query -c xfwm4 -p /general/use_compositing -s false

但没有合成器就没有透明、阴影和动画效果。解决方案是换用 picom:

sudo apt install picom -y

创建配置 ~/.config/picom/picom.conf

backend = "glx";
vsync = true;
glx-no-stencil = true;

# 透明
opacity-rule = ["90:class_g ='Plank'"];

# 阴影
shadow = true;
shadow-radius = 12;
shadow-offset-x = -5;
shadow-offset-y = -5;
shadow-opacity = 0.5;
shadow-exclude = ["class_g ='Plank'"];

# 淡入淡出
fading = true;
fade-in-step = 0.06;
fade-out-step = 0.06;

# 圆角(macOS 风格)corner-radius = 10;
rounded-corners-exclude = ["class_g ='Plank'","class_g = 'xfce4-panel'"];

设置开机自启:

cat > ~/.config/autostart/picom.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=Picom
Exec=picom --daemon
Hidden=false
NoDisplay=true
X-XFCE-Autostart=true
EOF

picom 用 GLX 后端 + vsync,不会触发 XFWM4 那种闪烁问题,同时还提供了窗口阴影、圆角和淡入淡出动画。


第七个坑:Ghostty 终端的 hook 报错

如果你用 Ghostty 作为本地终端,切换到 XFCE 之后在 SecureCRT 或其他终端里会看到:

__ghostty_hook: 未找到命令

原因是 Ghostty 会在 PROMPT_COMMAND 里注入 __ghostty_hook,这个函数只在 Ghostty 进程内部定义。当你通过 SSH 连到远程、或在非 Ghostty 终端打开 bash 时,PROMPT_COMMAND 被继承了,但函数没有,所以报错。

~/.bashrc 末尾加一个判断:

# Remove ghostty hook if not running in Ghostty terminal
if ["$TERM_PROGRAM" != "ghostty"]; then
  PROMPT_COMMAND="${PROMPT_COMMAND//__ghostty_hook/}"
fi

收尾:macOS 风格美化全套

把 XFCE 打造成 " 果味十足 " 的桌面,需要从主题、图标、字体、顶栏、Dock 和壁纸六个方面入手。

GTK 主题 + 窗口管理器主题

git clone --depth=1 https://github.com/vinceliuice/WhiteSur-gtk-theme.git /tmp/wgt
cd /tmp/wgt && ./install.sh

图标主题

git clone --depth=1 https://github.com/vinceliuice/WhiteSur-icon-theme.git /tmp/wit
cd /tmp/wit && ./install.sh -a

应用设置

# GTK 主题
xfconf-query -c xsettings -p /Net/ThemeName -s "WhiteSur-Light"
# 图标主题
xfconf-query -c xsettings -p /Net/IconThemeName -s "WhiteSur"
# 窗口管理器主题
xfconf-query -c xfwm4 -p /general/theme -s "WhiteSur-Light"

字体:用 Inter 替代 SF Pro

苹果的 SF Pro 有许可限制,开源世界最接近的替代是 Inter——同样为屏幕阅读设计的无衬线字体,与 SF Pro 有约 88% 的视觉相似度。

sudo apt install fonts-inter -y

# 应用到系统
xfconf-query -c xsettings -p /Gtk/FontName -s "Inter 10"
xfconf-query -c xfwm4 -p /general/title_font -s "Inter Bold 10"

顶栏:全局菜单

sudo apt install xfce4-appmenu-plugin -y

在面板里添加 AppMenu 插件,布局调整为:左侧放应用菜单 + 全局菜单,中间用分隔符撑开,右侧放系统托盘、音量、时钟、电源、通知。

Plank Dock

sudo apt install plank -y

Plank 关键配置(~/.config/plank/dock1/settings):

  • Theme=Transparent
  • IconSize=52
  • ZoomEnabled=trueZoomPercent=150(鼠标滑过放大效果)
  • HideMode=1(智能隐藏)

别忘了同时设置 Plank 和 bamfdaemon 的自启动(见第五个坑)。

壁纸

macOS 官方壁纸可以从 512pixels.net 免费下载 6K 分辨率版本:

mkdir -p ~/Pictures/Wallpapers
wget -O ~/Pictures/Wallpapers/macOS-Sonoma-Dark.jpg \
    "https://512pixels.net/downloads/macos-wallpapers-6k/14-Sonoma-Dark.jpg"

右键桌面 → 桌面设置 → 选择壁纸,或者用命令行批量设置所有工作区:

WALLPAPER="$HOME/Pictures/Wallpapers/macOS-Sonoma-Dark.jpg"
for monitor in DVI-D-0 HDMI-0; do
  for ws in 0 1 2 3; do
    xfconf-query -c xfce4-desktop \
      -p "/backdrop/screen0/monitor${monitor}/workspace${ws}/last-image" \
      -s "$WALLPAPER"
  done
done

显示器名称换成你自己的(用 xrandr --query 查看)。

防撕裂

xfconf-query -c xfwm4 -p /general/vblank_mode --create -t string -s glx

结果对比

GNOME 46 XFCE 4.18
Shell 内存 833 MB ~180 MB
Shell CPU(空闲) 持续 5% 基本 0%
双屏拖窗口 有粘滞感 无感知延迟
输入法 开箱即用 需手动配置
合成器 Mutter(稳定但重) picom(轻量无闪烁)

踩坑清单速查

症状 原因 修法
卸载 GNOME 后黑屏 LightDM 反复 crash greeter 被连带删除 apt install lightdm-gtk-greeter
输入法不出候选框 打字直接上英文 fcitx5 profile 里没有输入法 kill → 改 profile → 重启
fcitx5 配置不生效 改了 profile 重启后被还原 fcitx5 退出时覆盖文件 先 kill 再改
SecureCRT 无中文 候选框不出现 自带 Qt,不加载系统 fcitx5 插件 走 IBus 协议绕过
钉钉扫码闪退 扫码瞬间 crash 截图逻辑硬编码检查 GNOME 包装脚本伪装 GNOME
Plank 不显示应用 Dock 只有固定图标 bamfdaemon 没运行 手动启动 + 自启动
Plank/ 输入法闪烁 候选框和 Dock 持续闪 XFWM4 合成器兼容问题 关掉换 picom
__ghostty_hook 报错 每次出 prompt 都报 Ghostty 的 PROMPT_COMMAND 被继承 bashrc 里条件清除

三条金句

软件的卡顿,九成不是硬件的问题,是设计理念的代价。
GNOME 选择了一个可扩展的 JavaScript 运行时,换来了丰富的生态,也换来了桌面 Shell 本身成为性能瓶颈。这不是 bug,是 trade-off。

" 绑定了第三方依赖的应用 ",永远不要用系统级手段去解决它的问题。
SecureCRT 带着自己的 Qt,钉钉带着自己的截图逻辑——应对这类应用,包装脚本注入环境变量比修改系统配置更干净,也更容易回滚。

迁移成本最低的方案,是让新旧环境并存而不是替换。
XFCE 和 GNOME 共存于同一台机器,登录时选择会话即可切换。折腾坏了,注销重选就回去了。没有什么比 " 可以随时撤退 " 更让人有胆量往前走。——但如果你真的卸了 GNOME,记得先检查 greeter。

正文完
创作不易,扫码加点动力
post-qrcode
 0
果较瘦
版权声明:本站原创文章,由 果较瘦 于2026-04-02发表,共计3420字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。