跳至主要内容

非主流发行版生存指南:从 deb/rpm 包提取文件手动安装软件

在 Gentoo 这种非主流发行版上,很多主流软件要么没有官方 ebuild,要么编译起来非常痛苦。比如微信、QQ、Trae 这些闭源商业软件,官方只提供 deb 或 rpm 包。

今天分享一个我用了很久的”野路子”:直接从 deb/rpm 包提取可执行文件和依赖,手动组装成可用的软件

阅读说明:

  1. 本文以 Gentoo 为例,其他发行版思路类似,但具体操作请以你的发行版实际情况为准。
  2. 工作流程: 下载 deb/rpm 包 → 在用户目录创建软件文件夹(如 ~/WeChat/)→ 直接解包到该目录 → 整理文件 → 补依赖 → 写启动脚本 → 写 desktop 文件 → 试运行排错。
  3. 你可以选择在下载目录(如 ~/Downloads/)先解包,然后把需要的文件移动到最终目录;也可以直接在最终目录(如 ~/软件名/)解包,两种方式都可以,本文采用直接在最终目录解包的方式。
  4. 核心思路: 提取 → 补依赖 → 写启动脚本 → 写 desktop 文件 → 试运行排错。

⚠️ 注意事项:

  • 文中的文件名(如 wechat-linux.debqq.rpm 等)仅作为示例,请以你实际下载的文件名为准。
  • 你可以用 mv 命令把实际文件名改成文中的示例文件名,或者直接把文中的文件名替换成你的实际文件名,方法是一样的。
  • 我使用的是 Gentoo,其他发行版的读者可以参考本文的思路,但具体命令和包管理器请以你的发行版为准。
  • 文中的路径 /home/yui/ 是我的用户名目录,请替换成你自己的用户名(比如 /home/你的用户名/~/)。

一、核心思路

大多数 deb/rpm 包本质上就是一个压缩包,里面包含了:

  • 可执行文件(通常在 /opt//usr/bin/
  • 共享库(.so 文件)
  • 资源文件(图标、语言包等)
  • desktop 文件(/usr/share/applications/

我们只需要把这些文件提取出来,放到一个目录下,然后写个启动脚本和 desktop 文件,大部分情况下就能在你使用的发行版上运行了。当然,具体能不能跑起来还得看软件本身的依赖情况。

二、提取 deb/rpm 包

通用方法:提取 deb 包

# 创建目标目录(WeChat 是示例名称,以实际软件为准)
mkdir -p ~/WeChat

# 提取 deb 包内容(wechat-linux.deb 是示例文件名,以实际下载的文件名为准)
dpkg-deb -x wechat-linux.deb ~/WeChat/

如果没有 dpkg-deb(比如非 Debian 系),可以用 artar

# 使用 ar 提取 deb 包(deb 本质是 ar 归档)
mkdir -p ~/WeChat
cd ~/WeChat
ar x ../wechat-linux.deb
tar -xf data.tar.xz # 或 data.tar.gz / data.tar.zst

通用方法:提取 rpm 包

# 使用 rpm2cpio 提取(QQ 是示例名称,qq.rpm 是示例文件名,以实际为准)
mkdir -p ~/QQ
cd ~/QQ
rpm2cpio qq.rpm | cpio -idmv

如果没有 rpm2cpio,可以确认一下 app-arch/rpm 是否安装成功,或者试试alien 转换:

# 安装 alien
sudo emerge app-arch/alien

# 转换 rpm 为 tgz 再提取
sudo alien --to-tgz qq.rpm
tar -xzf qq.tgz

提取后的目录结构

提取后的目录结构通常和系统目录一致,但具体取决于包的内容

~/WeChat/
├── opt/wechat/ # 可执行文件和库(部分包放在这里)
└── usr/
├── share/
│ ├── applications/ # desktop 文件
│ └── icons/ # 图标
└── doc/ # 文档(如 changelog)

注意: 不同软件的目录结构可能不同:

  • 有的软件放在 opt/ 下(如微信、QQ)
  • 有的软件放在 usr/ 下(如 Trae、Clash Verge)
  • 有的包可能没有 etc/ 目录
  • 具体以实际提取的内容为准

三、Gentoo 上的提取工具

在 Gentoo 上,需要先安装提取工具:

# 提取 deb 包需要的工具
sudo emerge app-arch/dpkg

# 提取 rpm 包需要的工具
sudo emerge app-arch/rpm

安装好后就可以用 dpkg-deb -xrpm2cpio 来提取包了。

四、编写启动脚本

提取出来的可执行文件通常不能直接运行,需要一些环境变量和配置。

简单案例:微信(示例)

微信的依赖在我的环境里比较完整,只需要一个简单的启动脚本:

#!/bin/bash
# 注意:路径 /home/yui/WeChat/opt/wechat/wechat 是示例,以实际路径为准
exec /home/yui/WeChat/opt/wechat/wechat "$@"

中等案例:QQ(示例)

QQ 在我的环境下需要禁用 DMA-BUF 渲染器,否则在 Wayland 下可能会黑屏:

#!/bin/bash
# 注意:路径 /home/yui/QQ/opt/QQ/qq 是示例,以实际路径为准
export WEBKIT_DISABLE_DMABUF_RENDERER=1
exec /home/yui/QQ/opt/QQ/qq "$@"

复杂案例:Trae(示例,Electron 应用)

Trae 是基于 Electron 的编辑器,可能需要处理中文环境、Wayland 兼容和代理:

#!/bin/bash
# Trae 启动脚本(示例)
# 注意:路径 /home/yui/trae 是示例,以实际路径为准

cd /home/yui/trae

# 中文环境
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
export LANGUAGE=zh_CN:zh

# Wayland 兼容(Electron 应用在 Wayland 下可能需要)
export GDK_BACKEND=x11
export QT_QPA_PLATFORM=xcb

# 代理(如果需要,代理地址是示例,以实际为准)
# 7897 是 Clash Verge Rev 的默认端口,如果你安装了 Clash 可以使用此方法
# 或者开启 Clash 的虚拟网卡模式(TUN 模式),这样所有流量自动走代理,不需要设置环境变量
export https_proxy=http://127.0.0.1:7897 # 端口号以实际代理配置为准
export http_proxy=http://127.0.0.1:7897 # 端口号以实际代理为准

# 运行 Trae
exec /home/yui/trae/usr/share/trae-cn/trae-cn "$@"

常见环境变量说明

变量 作用
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]
Name=WeChat
Comment=Tencent WeChat
Exec=/home/yui/WeChat/run-wechat.sh # 注意:路径是示例,以实际路径为准
Icon=/home/yui/WeChat/usr/share/icons/hicolor/256x256/apps/wechat.png # 图标路径是示例
Terminal=false
Type=Application
Categories=Network;InstantMessaging;
StartupWMClass=wechat

QQ desktop 文件(示例)

[Desktop Entry]
Name=QQ
Comment=Tencent QQ
Exec=/home/yui/QQ/run-qq.sh # 注意:路径是示例,以实际路径为准
Icon=/home/yui/QQ/usr/share/icons/hicolor/512x512/apps/qq.png # 图标路径是示例
Terminal=false
Type=Application
Categories=Network;InstantMessaging;
StartupWMClass=qq

关键字段说明

字段 说明
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 数据库
update-desktop-database ~/.local/share/applications/
# 或者重新登录桌面环境

六、Gentoo 上的依赖处理

在 Gentoo 上,提取出来的软件可能会缺少一些依赖库,需要用 Portage 来补。

查看缺失的库(示例)

# 注意:路径是示例,以实际可执行文件路径为准
ldd /home/yui/WeChat/opt/wechat/wechat | grep "not found"

查找哪个包提供这个库(示例)

# 需要先安装 gentoolkit
sudo emerge app-portage/gentoolkit

# 用 equery 查找(libxxx.so 是示例,以实际缺失的库名为准)
equery belongs libxxx.so

安装缺失的依赖(示例)

# libxxx 是示例包名,以实际查找到的包名为准
sudo emerge media-libs/libxxx

常见依赖示例

比如微信可能需要这些依赖:

  • media-libs/libvlc - VLC 媒体库
  • media-video/ffmpeg - 音视频处理
  • dev-libs/nss - 网络安全服务
  • x11-libs/gtk+ - GTK 图形库

具体缺什么,还是得用 ldd 看了才知道。

七、试运行与排错

第一步:命令行直接运行(示例)

先在终端里直接运行可执行文件,看看缺什么依赖:

# 注意:路径是示例,以实际可执行文件路径为准
/home/yui/WeChat/opt/wechat/wechat

常见错误及解决

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_proxyhttps_proxy
  • Electron 应用可能需要额外的 --proxy-server 参数
  • 或者尝试使用 proxychainsproxychains4 /path/to/executable

5. 权限问题

Permission denied

解决方法:

# 注意:路径是示例,以实际路径为准
chmod +x /home/yui/WeChat/opt/wechat/wechat
chmod +x /home/yui/WeChat/run-wechat.sh

6. 沙盒错误(Electron 应用)

The SUID sandbox helper binary was found, but is not configured correctly

解决方法:

  • 在启动脚本中添加 --no-sandbox 参数
  • 或者设置 CHROME_DEVEL_SANDBOX 环境变量

八、进阶技巧

1. 用 LD_LIBRARY_PATH 指定库路径(示例)

如果软件依赖的库版本和系统不一致,可以试试把库放在软件目录下:

#!/bin/bash
# 注意:路径是示例,以实际路径为准
export LD_LIBRARY_PATH=/home/yui/WeChat/opt/wechat/lib:$LD_LIBRARY_PATH
exec /home/yui/WeChat/opt/wechat/wechat "$@"

2. 自动更新脚本(示例)

写个脚本自动下载最新版本并提取:

#!/bin/bash
# update-wechat.sh(示例,文件名以实际为准)

cd /tmp
# 注意:URL 是示例,以实际下载链接为准
wget https://example.com/wechat-linux.deb

rm -rf ~/WeChat
mkdir -p ~/WeChat
dpkg-deb -x wechat-linux.deb ~/WeChat/

echo "WeChat 已更新"

3. 用 patchelf 修改 ELF 文件(示例)

如果库路径不对,可以试试patchelf 修改:

# 安装 patchelf
sudo emerge dev-util/patchelf

# 修改 RPATH(路径是示例,以实际路径为准)
patchelf --set-rpath '$ORIGIN/lib' /home/yui/WeChat/opt/wechat/wechat

# 查看当前 RPATH(路径是示例,以实际路径为准)
patchelf --print-rpath /home/yui/WeChat/opt/wechat/wechat

4. 用 strace 调试(示例)

如果软件启动失败,可以用 strace 查看系统调用:

# 注意:路径是示例,以实际可执行文件路径为准
strace -f /home/yui/WeChat/opt/wechat/wechat 2>&1 | grep -E "open|ENOENT"

5. 用 ldd 检查依赖完整性(示例)

# 注意:路径是示例,以实际可执行文件路径为准
# 列出所有依赖
ldd /home/yui/WeChat/opt/wechat/wechat

# 只显示缺失的库
ldd /home/yui/WeChat/opt/wechat/wechat | grep "not found"

九、我的软件目录结构

目前我用这个方法安装了这些软件:

/home/yui/
├── WeChat/ # 微信(deb 包,有 opt/ 目录)
│ ├── opt/wechat/ # 可执行文件和库
│ ├── usr/ # 图标、desktop 文件等
│ └── run-wechat.sh # 启动脚本
├── QQ/ # QQ(deb 包,有 opt/ 目录)
│ ├── opt/QQ/ # 可执行文件和库
│ ├── usr/ # 图标、desktop 文件等
│ └── run-qq.sh # 启动脚本
├── trae/ # Trae(rpm 包,只有 usr/ 目录)
│ ├── usr/share/trae-cn/ # 可执行文件在这里
│ └── trae-launcher.sh # 启动脚本
└── clash/ # Clash Verge(rpm 包,只有 usr/ 目录)
├── usr/bin/ # 可执行文件
├── usr/lib/ # 资源文件
├── usr/share/ # 图标、desktop 文件
└── clash-verge.sh # 启动脚本

可以看到,不同包的目录结构差异挺大的:

  • 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 许可协议。

#Linux #Gentoo #效率