在 Gentoo 这种非主流发行版上,很多主流软件要么没有官方 ebuild,要么编译起来非常痛苦。比如微信、QQ、Trae 这些闭源商业软件,官方只提供 deb 或 rpm 包。
今天分享一个我用了很久的”野路子”:直接从 deb/rpm 包提取可执行文件和依赖,手动组装成可用的软件。
阅读说明:
- 本文以 Gentoo 为例,其他发行版思路类似,但具体操作请以你的发行版实际情况为准。
- 工作流程: 下载 deb/rpm 包 → 在用户目录创建软件文件夹(如
~/WeChat/)→ 直接解包到该目录 → 整理文件 → 补依赖 → 写启动脚本 → 写 desktop 文件 → 试运行排错。- 你可以选择在下载目录(如
~/Downloads/)先解包,然后把需要的文件移动到最终目录;也可以直接在最终目录(如~/软件名/)解包,两种方式都可以,本文采用直接在最终目录解包的方式。- 核心思路: 提取 → 补依赖 → 写启动脚本 → 写 desktop 文件 → 试运行排错。
⚠️ 注意事项:
- 文中的文件名(如
wechat-linux.deb、qq.rpm等)仅作为示例,请以你实际下载的文件名为准。- 你可以用
mv命令把实际文件名改成文中的示例文件名,或者直接把文中的文件名替换成你的实际文件名,方法是一样的。- 我使用的是 Gentoo,其他发行版的读者可以参考本文的思路,但具体命令和包管理器请以你的发行版为准。
- 文中的路径
/home/yui/是我的用户名目录,请替换成你自己的用户名(比如/home/你的用户名/或~/)。
一、核心思路
大多数 deb/rpm 包本质上就是一个压缩包,里面包含了:
- 可执行文件(通常在
/opt/或/usr/bin/) - 共享库(
.so文件) - 资源文件(图标、语言包等)
- desktop 文件(
/usr/share/applications/)
我们只需要把这些文件提取出来,放到一个目录下,然后写个启动脚本和 desktop 文件,大部分情况下就能在你使用的发行版上运行了。当然,具体能不能跑起来还得看软件本身的依赖情况。
二、提取 deb/rpm 包
通用方法:提取 deb 包
# 创建目标目录(WeChat 是示例名称,以实际软件为准) |
如果没有 dpkg-deb(比如非 Debian 系),可以用 ar 和 tar:
# 使用 ar 提取 deb 包(deb 本质是 ar 归档) |
通用方法:提取 rpm 包
# 使用 rpm2cpio 提取(QQ 是示例名称,qq.rpm 是示例文件名,以实际为准) |
如果没有 rpm2cpio,可以确认一下 app-arch/rpm 是否安装成功,或者试试用 alien 转换:
# 安装 alien |
提取后的目录结构
提取后的目录结构通常和系统目录一致,但具体取决于包的内容:
~/WeChat/ |
注意: 不同软件的目录结构可能不同:
- 有的软件放在
opt/下(如微信、QQ) - 有的软件放在
usr/下(如 Trae、Clash Verge) - 有的包可能没有
etc/目录 - 具体以实际提取的内容为准
三、Gentoo 上的提取工具
在 Gentoo 上,需要先安装提取工具:
# 提取 deb 包需要的工具 |
安装好后就可以用 dpkg-deb -x 和 rpm2cpio 来提取包了。
四、编写启动脚本
提取出来的可执行文件通常不能直接运行,需要一些环境变量和配置。
简单案例:微信(示例)
微信的依赖在我的环境里比较完整,只需要一个简单的启动脚本:
|
中等案例:QQ(示例)
QQ 在我的环境下需要禁用 DMA-BUF 渲染器,否则在 Wayland 下可能会黑屏:
|
复杂案例:Trae(示例,Electron 应用)
Trae 是基于 Electron 的编辑器,可能需要处理中文环境、Wayland 兼容和代理:
|
常见环境变量说明
| 变量 | 作用 |
|---|---|
WEBKIT_DISABLE_DMABUF_RENDERER=1 |
禁用 DMA-BUF,可能解决 Wayland 黑屏 |
GDK_BACKEND=x11 |
尝试强制使用 X11 后端 |
QT_QPA_PLATFORM=xcb |
尝试让 Qt 应用使用 X11 |
LANG/LC_ALL |
设置语言环境 |
http_proxy/https_proxy |
设置代理 |
LD_LIBRARY_PATH |
指定额外的库搜索路径 |
FONTCONFIG_FILE |
指定字体配置文件 |
五、编写 Desktop 文件
Desktop 文件让软件出现在应用菜单中,可以从提取的包中复制修改,也可以自己写。
微信 desktop 文件(示例)
[Desktop Entry] |
QQ desktop 文件(示例)
[Desktop Entry] |
关键字段说明
| 字段 | 说明 |
|---|---|
Exec |
启动脚本的绝对路径,也可以直接写完整的启动命令(例如:Exec=env WEBKIT_DISABLE_DMABUF_RENDERER=1 /home/yui/QQ/opt/QQ/qq %F) |
Icon |
图标文件的绝对路径 |
StartupWMClass |
窗口类名,用于任务栏图标分组 |
Categories |
应用分类 |
MimeType |
支持的文件类型 |
💡 提示: Desktop 文件的
Exec字段可以直接调用启动脚本(如本文示例),也可以直接写完整的启动命令。两种方式都可以,看个人习惯。我习惯写启动脚本是因为环境变量更清晰、方便维护和调试。
把 desktop 文件放到 ~/.local/share/applications/ 目录下。大多数桌面环境会自动检测新文件,如果没有生效,可以运行:
# 更新 desktop 数据库 |
六、Gentoo 上的依赖处理
在 Gentoo 上,提取出来的软件可能会缺少一些依赖库,需要用 Portage 来补。
查看缺失的库(示例)
# 注意:路径是示例,以实际可执行文件路径为准 |
查找哪个包提供这个库(示例)
# 需要先安装 gentoolkit |
安装缺失的依赖(示例)
# libxxx 是示例包名,以实际查找到的包名为准 |
常见依赖示例
比如微信可能需要这些依赖:
media-libs/libvlc- VLC 媒体库media-video/ffmpeg- 音视频处理dev-libs/nss- 网络安全服务x11-libs/gtk+- GTK 图形库
具体缺什么,还是得用 ldd 看了才知道。
七、试运行与排错
第一步:命令行直接运行(示例)
先在终端里直接运行可执行文件,看看缺什么依赖:
# 注意:路径是示例,以实际可执行文件路径为准 |
常见错误及解决
1. 缺少共享库
error while loading shared libraries: libxxx.so: cannot open shared object file |
解决方法:
- 用
ldd /path/to/executable查看缺失的库 - 从 deb/rpm 包里找对应的
.so文件 - 或者用发行版的包管理器安装系统级依赖
2. 中文显示为方块
字体缺失,中文显示为口口口 |
解决方法:
- 安装中文字体:
emerge media-fonts/noto-cjk - 或者在启动脚本中设置
FONTCONFIG_FILE指向自定义字体配置
3. Wayland 下黑屏/崩溃
如果你的桌面环境使用 Wayland,可能会遇到这个问题:
解决方法:
- 尝试添加
WEBKIT_DISABLE_DMABUF_RENDERER=1 - 或者尝试强制使用 X11:
GDK_BACKEND=x11 - Electron 应用可以尝试:
--ozone-platform=x11或--ozone-platform-hint=auto
4. 代理不生效
如果你的软件需要走代理:
解决方法:
- 在启动脚本中设置
http_proxy和https_proxy - Electron 应用可能需要额外的
--proxy-server参数 - 或者尝试使用
proxychains:proxychains4 /path/to/executable
5. 权限问题
Permission denied |
解决方法:
# 注意:路径是示例,以实际路径为准 |
6. 沙盒错误(Electron 应用)
The SUID sandbox helper binary was found, but is not configured correctly |
解决方法:
- 在启动脚本中添加
--no-sandbox参数 - 或者设置
CHROME_DEVEL_SANDBOX环境变量
八、进阶技巧
1. 用 LD_LIBRARY_PATH 指定库路径(示例)
如果软件依赖的库版本和系统不一致,可以试试把库放在软件目录下:
|
2. 自动更新脚本(示例)
写个脚本自动下载最新版本并提取:
|
3. 用 patchelf 修改 ELF 文件(示例)
如果库路径不对,可以试试用 patchelf 修改:
# 安装 patchelf |
4. 用 strace 调试(示例)
如果软件启动失败,可以用 strace 查看系统调用:
# 注意:路径是示例,以实际可执行文件路径为准 |
5. 用 ldd 检查依赖完整性(示例)
# 注意:路径是示例,以实际可执行文件路径为准 |
九、我的软件目录结构
目前我用这个方法安装了这些软件:
/home/yui/ |
可以看到,不同包的目录结构差异挺大的:
- deb 包(微信、QQ)通常有
opt/目录 - rpm 包(Trae、Clash)通常只有
usr/目录 - 具体以实际提取的内容为准
十、总结
这个方法的优点:
- 不需要 root 权限:所有文件都在用户目录下
- 不影响系统:不会和 Portage 管理的包冲突
- 灵活可控:可以自定义环境变量和启动参数
- 学习价值:能深入了解 Linux 软件的依赖关系
缺点:
- 需要手动更新:软件更新时需要重新提取
- 依赖管理麻烦:需要自己处理缺失的库
- 安全性:闭源软件,无法审计代码
- 兼容性:某些软件可能依赖特定发行版的特性
总的来说,对于 Gentoo 这种非主流发行版的用户来说,这是一个非常实用的”野路子”。虽然不够优雅,但能解决问题就是好方法。
小贴士:
- 如果你用的是 KDE Plasma,可以在”系统设置 → 外观 → 应用程序风格”中设置
StartupWMClass,让任务栏图标正确分组。- 对于 Electron 应用,可以考虑用
electron-builder打包的版本,通常依赖更完整。- 如果某个软件实在跑不起来,不妨试试 Flatpak 或 AppImage 版本。
关于本文
由 青空由依(AozoraYui)/青空由纪(AozoraYuki)/青空葵(AozoraAoi) 撰写,采用 CC BY-NC 4.0 许可协议。