冒险岛079

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7|回复: 0

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

[复制链接]

724

主题

13

回帖

2310

积分

管理员

积分
2310
发表于 昨天 22:10 | 显示全部楼层 |阅读模式
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-4-3 04:31 , Processed in 0.204096 second(s), 20 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

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