找回密码
 立即注册

QQ登录

只需一步,快速开始

peUfSYR.png
查看: 262|回复: 0

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

[复制链接]

1710

主题

14

回帖

5554

积分

管理员

积分
5554
发表于 2026-4-2 22:10:21 | 显示全部楼层 |阅读模式
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,整体手感就像隔着一层薄棉。

有天习惯性地
  1. ps aux
复制代码
了一眼,看到这行:
  1. 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,没什么好说的
  1. sudo apt install xfce4 xfce4-goodies xfce4-terminal thunar \
  2.     xfce4-power-manager xfce4-notifyd -y
复制代码

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

━━━━━━━━━━━━━━━━━━━━

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

XFCE 跑稳之后,自然想把 GNOME 卸掉省资源。
  1. apt remove gnome-shell gnome-desktop*
复制代码
一敲,重启——黑屏,只剩一个闪烁的光标。
  1. Ctrl+Alt+F2
复制代码
进 TTY,查 LightDM 日志:
  1. Seat seat0: Failed to find session configuration default
  2. Seat seat0: Failed to create greeter session
复制代码

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

修法很简单:
  1. sudo apt install lightdm-gtk-greeter -y
  2. sudo systemctl restart lightdm
复制代码
  1. Ctrl+Alt+F7
复制代码
切回去,登录界面回来了。

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

━━━━━━━━━━━━━━━━━━━━

第二个坑:输入法

在 GNOME 下输入法一般能凑合,到了 XFCE 就要手动把环境变量搞定。
  1. sudo apt install fcitx5 fcitx5-chinese-addons \
  2.     fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 \
  3.     fcitx5-frontend-qt5 fcitx5-frontend-qt6 \
  4.     fcitx5-config-qt -y
  5. im-config -n fcitx5
复制代码

然后在
  1. ~/.xprofile
复制代码
里写死:
  1. export GTK_IM_MODULE=fcitx
  2. export QT_IM_MODULE=fcitx
  3. export XMODIFIERS=@im=fcitx
  4. fcitx5 -d &
复制代码

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

五笔用户注意

如果你用的不是拼音而是五笔,需要额外安装码表:
  1. sudo apt install fcitx5-table-wubi-large -y
复制代码

然后必须先杀掉 fcitx5 再编辑 profile,否则 fcitx5 退出时会把你的修改覆盖回去:
  1. kill $(pgrep fcitx5)
  2. cat > ~/.config/fcitx5/profile << 'EOF'
  3. [Groups/0]
  4. Name=Default
  5. Default Layout=us
  6. DefaultIM=wubi-large
  7. [Groups/0/Items/0]
  8. Name=keyboard-us
  9. Layout=
  10. [Groups/0/Items/1]
  11. Name=wubi-large
  12. Layout=
  13. [GroupOrder]
  14. 0=Default
  15. EOF
  16. fcitx5 -d
复制代码

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

━━━━━━━━━━━━━━━━━━━━

第三个坑:SecureCRT 的中文输入

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

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

第一反应:Qt 插件没装好。检查了
  1. fcitx5-frontend-qt5
复制代码
和
  1. qt6
复制代码
,都装了。

第二反应:环境变量没传进去。加了
  1. QT_IM_MODULE=fcitx
复制代码
,没用。

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

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

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

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

创建一个启动脚本
  1. ~/.local/bin/securecrt-launch.sh
复制代码
:
  1. #!/bin/bash
  2. IBUS_ADDRESS=$(grep -h "^IBUS_ADDRESS=" ~/.config/ibus/bus/*-unix-0 2>/dev/null \
  3.     | grep -v "^IBUS_ADDRESS=$" | head -1 | cut -d= -f2-)
  4. export IBUS_ADDRESS
  5. export QT_IM_MODULE=ibus
  6. export XMODIFIERS=@im=ibus
  7. exec SecureCRT "$@"
复制代码

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

注意 Plank 用户:如果你的 Plank Dock 上固定了 SecureCRT,还需要编辑
  1. ~/.config/plank/dock1/launchers/SecureCRT.dockitem
复制代码
,把
  1. Launcher
复制代码
指向用户级的 desktop 文件:
  1. [PlankDockItemPreferences]
  2. Launcher=file:///home/你的用户名/.local/share/applications/SecureCRT.desktop
复制代码

改完之后重启 Plank(
  1. killall plank && plank &
复制代码
),否则 Plank 会缓存旧的 desktop 文件,从 Dock 启动的 SecureCRT 仍然没有中文输入。

━━━━━━━━━━━━━━━━━━━━

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

这个是最反直觉的。

切换到 XFCE 之后,打开钉钉,账号密码登录正常,但扫码登录一扫就闪退,连报错都不打。
  1. journalctl --user
复制代码
里什么都没有,因为它在写日志之前就死了。

用
  1. strings
复制代码
翻了一下
  1. dingtalk_dll.so
复制代码
(137MB 的主逻辑库),找到这些字符串:
  1. gnome-screenshot
  2. DesktopInfo::GNOME
  3. disable_use_gnome_screen_shot_bugfix
复制代码

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

修法:先装上
  1. gnome-screenshot
复制代码
,然后用包装脚本欺骗钉钉,让它以为自己在 GNOME 下运行。
  1. sudo apt install gnome-screenshot -y
复制代码

创建
  1. ~/.local/bin/dingtalk-launch.sh
复制代码
:
  1. #!/bin/bash
  2. export XDG_CURRENT_DESKTOP=GNOME
  3. export GNOME_DESKTOP_SESSION_ID=this-is-deprecated
  4. exec /opt/apps/com.alibabainc.dingtalk/files/Elevator.sh "$@"
复制代码

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

━━━━━━━━━━━━━━━━━━━━

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

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

问题出在
  1. bamfdaemon
复制代码
。Plank 依赖它来匹配窗口和
  1. .desktop
复制代码
文件的对应关系——知道哪个窗口属于哪个应用。卸载 GNOME 的时候,
  1. bamfdaemon
复制代码
的自启动被一起移除了。
  1. # 确认 bamfdaemon 没在跑
  2. pgrep bamfdaemon || echo "没运行"
  3. # 找到正确路径并启动
  4. /usr/lib/x86_64-linux-gnu/bamf/bamfdaemon &
复制代码

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

设置开机自启:
  1. cat > ~/.config/autostart/bamfdaemon.desktop << 'EOF'
  2. [Desktop Entry]
  3. Type=Application
  4. Name=BAMFDaemon
  5. Exec=/usr/lib/x86_64-linux-gnu/bamf/bamfdaemon
  6. Hidden=false
  7. NoDisplay=true
  8. X-XFCE-Autostart=true
  9. EOF
复制代码

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

━━━━━━━━━━━━━━━━━━━━

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

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

关掉 XFWM4 的内置合成器,闪烁立刻消失:
  1. xfconf-query -c xfwm4 -p /general/use_compositing -s false
复制代码

但没有合成器就没有透明、阴影和动画效果。解决方案是换用 picom:
  1. sudo apt install picom -y
复制代码

创建配置
  1. ~/.config/picom/picom.conf
复制代码
:
  1. backend = "glx";
  2. vsync = true;
  3. glx-no-stencil = true;
  4. # 透明
  5. opacity-rule = [
  6.   "90:class_g = 'Plank'"
  7. ];
  8. # 阴影
  9. shadow = true;
  10. shadow-radius = 12;
  11. shadow-offset-x = -5;
  12. shadow-offset-y = -5;
  13. shadow-opacity = 0.5;
  14. shadow-exclude = [
  15.   "class_g = 'Plank'"
  16. ];
  17. # 淡入淡出
  18. fading = true;
  19. fade-in-step = 0.06;
  20. fade-out-step = 0.06;
  21. # 圆角(macOS 风格)
  22. corner-radius = 10;
  23. rounded-corners-exclude = [
  24.   "class_g = 'Plank'",
  25.   "class_g = 'xfce4-panel'"
  26. ];
复制代码

设置开机自启:
  1. cat > ~/.config/autostart/picom.desktop << 'EOF'
  2. [Desktop Entry]
  3. Type=Application
  4. Name=Picom
  5. Exec=picom --daemon
  6. Hidden=false
  7. NoDisplay=true
  8. X-XFCE-Autostart=true
  9. EOF
复制代码

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

━━━━━━━━━━━━━━━━━━━━

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

如果你用 Ghostty 作为本地终端,切换到 XFCE 之后在 SecureCRT 或其他终端里会看到:
  1. __ghostty_hook: 未找到命令
复制代码

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

在
  1. ~/.bashrc
复制代码
末尾加一个判断:
  1. # Remove ghostty hook if not running in Ghostty terminal
  2. if [ "$TERM_PROGRAM" != "ghostty" ]; then
  3.   PROMPT_COMMAND="${PROMPT_COMMAND//__ghostty_hook/}"
  4. fi
复制代码

━━━━━━━━━━━━━━━━━━━━

收尾:macOS 风格美化全套

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

GTK 主题 + 窗口管理器主题
  1. git clone --depth=1 https://github.com/vinceliuice/WhiteSur-gtk-theme.git /tmp/wgt
  2. cd /tmp/wgt && ./install.sh
复制代码

图标主题
  1. git clone --depth=1 https://github.com/vinceliuice/WhiteSur-icon-theme.git /tmp/wit
  2. cd /tmp/wit && ./install.sh -a
复制代码

应用设置
  1. # GTK 主题
  2. xfconf-query -c xsettings -p /Net/ThemeName -s "WhiteSur-Light"
  3. # 图标主题
  4. xfconf-query -c xsettings -p /Net/IconThemeName -s "WhiteSur"
  5. # 窗口管理器主题
  6. xfconf-query -c xfwm4 -p /general/theme -s "WhiteSur-Light"
复制代码

字体:用 Inter 替代 SF Pro

苹果的 SF Pro 有许可限制,开源世界最接近的替代是 Inter——同样为屏幕阅读设计的无衬线字体,与 SF Pro 有约 88% 的视觉相似度。
  1. sudo apt install fonts-inter -y
  2. # 应用到系统
  3. xfconf-query -c xsettings -p /Gtk/FontName -s "Inter 10"
  4. xfconf-query -c xfwm4 -p /general/title_font -s "Inter Bold 10"
复制代码

顶栏:全局菜单
  1. sudo apt install xfce4-appmenu-plugin -y
复制代码

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

Plank Dock
  1. sudo apt install plank -y
复制代码

Plank 关键配置(
  1. ~/.config/plank/dock1/settings
复制代码
):

    1. Theme=Transparent
    复制代码
    1. IconSize=52
    复制代码
    1. ZoomEnabled=true
    复制代码
    ,
    1. ZoomPercent=150
    复制代码
    (鼠标滑过放大效果)
    1. HideMode=1
    复制代码
    (智能隐藏)

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

    壁纸

    macOS 官方壁纸可以从 512pixels.net 免费下载 6K 分辨率版本:
    1. mkdir -p ~/Pictures/Wallpapers
    2. wget -O ~/Pictures/Wallpapers/macOS-Sonoma-Dark.jpg \
    3.     "https://512pixels.net/downloads/macos-wallpapers-6k/14-Sonoma-Dark.jpg"
    复制代码

    右键桌面 → 桌面设置 → 选择壁纸,或者用命令行批量设置所有工作区:
    1. WALLPAPER="$HOME/Pictures/Wallpapers/macOS-Sonoma-Dark.jpg"
    2. for monitor in DVI-D-0 HDMI-0; do
    3.   for ws in 0 1 2 3; do
    4.     xfconf-query -c xfce4-desktop \
    5.       -p "/backdrop/screen0/monitor${monitor}/workspace${ws}/last-image" \
    6.       -s "$WALLPAPER"
    7.   done
    8. done
    复制代码

    显示器名称换成你自己的(用
    1. xrandr --query
    复制代码
    查看)。

    防撕裂
    1. 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 被连带删除 |
    1. 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 |
    |
    1. __ghostty_hook
    复制代码
    报错 | 每次出 prompt 都报 | Ghostty 的 PROMPT_COMMAND 被继承 | bashrc 里条件清除 |

    ━━━━━━━━━━━━━━━━━━━━

    三条金句
    软件的卡顿,九成不是硬件的问题,是设计理念的代价。
    GNOME 选择了一个可扩展的 JavaScript 运行时,换来了丰富的生态,也换来了桌面 Shell 本身成为性能瓶颈。这不是 bug,是 trade-off。
    "绑定了第三方依赖的应用",永远不要用系统级手段去解决它的问题。
    SecureCRT 带着自己的 Qt,钉钉带着自己的截图逻辑——应对这类应用,包装脚本注入环境变量比修改系统配置更干净,也更容易回滚。
    迁移成本最低的方案,是让新旧环境并存而不是替换。
    XFCE 和 GNOME 共存于同一台机器,登录时选择会话即可切换。折腾坏了,注销重选就回去了。没有什么比"可以随时撤退"更让人有胆量往前走。——但如果你真的卸了 GNOME,记得先检查 greeter。
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-11-1 19:02 , Processed in 0.041384 second(s), 20 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表