拿到麒麟Linux的机器,第一件事通常是装软件。刚上手的人最容易被卡住的就是:应用商店里东西太少,想装个网易云音乐,官网下回来的.deb双击上去,系统弹一个提示,依赖关系不满足,安装失败。这个提示很劝退,但问题其实不难,只是绝大多数人没搞明白deb包背后那点事。
这篇文章是"麒麟第三方软件实战"系列的第一篇,拿网易云音乐当例子,完整走一遍从deb包获取、安装、报错排查、依赖修复,一直到重新打包的流程。不绕弯子,直接说人话。适合刚转到麒麟Linux的普通用户,也适合手里一堆机器要批量配软件、装一次不想再来第二遍的运维同学。
1. 为什么第三方软件到了麒麟系统上总是水土不服
想解决问题,先要知道问题是怎么来的。很多人在Windows上装了十几年软件,形成的思维定式是"安装包双击就能用"。到了Linux上,这个经验依然成立,但前提是系统的软件包格式和依赖环境对得上。麒麟Linux在这一点上确实有点特殊。
1.1 先分清你手里的麒麟是哪个分支
很多人不知道麒麟其实有两条技术路线。银河麒麟桌面版(Kylin Desktop)走的是Debian系,所以安装包格式是.deb,包管理器是dpkg和apt;另一条路线走Red Hat/RPM系,对应的是.rpm包和dnf/yum。这个区别是决定性的——你拿一个deb包去rpm系统上装,第一步就死了。
判断手里系统的分支不难:在终端跑一句cat /etc/os-release,看ID字段,能直接看出来是基于哪个上游做的。我自己的使用经验是,x86_64架构的银河麒麟V10桌面版,绝大多数是基于Ubuntu 20.04衍生出来的,所以deb这条路是通的。搞清楚这个,后面所有方案才有意义。如果你拿的是rpm分支的机器,这篇的打包思路可以参考,但命令要换成rpmbuild那套。
1.2 软件源给了你基础,但给不了你全部
麒麟预装的软件源里,常见基础工具、开发库都有,但第三方商业软件的官方包,比如网易云音乐、微信、QQ这类,多半不在源里。应用商店里虽然有一些,但版本经常滞后,或者干脆没有。这就是第一篇要解决的核心矛盾:官方只给了deb包,不保证你的系统能装,你只能自己动手让结构对齐。
另一个常见误解是"麒麟不是基于Ubuntu吗,Ubuntu的包直接拿过来用不就行了"。理论上可以,但实际不是这么简单。衍发行距离上游版本会有偏移,系统自带的Qt、GTK、音频组件版本可能和deb包编译时依赖的版本对不上。差别大一点,包管理器就直接报依赖冲突;差别小一点,装上了也可能运行崩溃。这种"装上了但不工作"的情况比装不上更坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开工前的准备:认识deb包的结构
依赖报错既然绕不开,不如花十分钟把deb包的结构搞清楚。deb本质是个用ar打包的压缩归档,里面能让你改的部分,其实暴露得清清楚楚。
2.1 deb包内部到底长什么样
手工拆一个deb包,在终端进入安装包所在目录,执行:
bash复制dpkg -c netease-cloud-music_1.2.1_amd64_ubuntu_16.04.deb | head -30
dpkg -c只列内容不实际解压。你会看到两条主线:一堆真实文件路径,以及一个特殊的DEBIAN/目录——注意是大写。DEBIAN/目录里放的不是程序本身,而是包管理器用来做判断的元数据,其中最重要的就是control文件。真正要落地到系统里的文件在usr/、opt/、etc/等路径下,安装时dpkg会严格按照路径解压过去。
很多人安装失败后觉得"这个包是坏的",其实文件本身没问题,文件内容一个字节都不缺,缺的是control文件里声明的依赖项,在当前系统里找不到满足条件的版本。所以后续所有修复动作,本质都是在修复依赖关系,而不是修复文件。
2.2 control文件是deb包的灵魂
control文件决定包管理器认不认这个包、肯不肯装,字段不多但每个都关键:
| 字段 | 作用 | 典型值 |
|---|---|---|
| Package | 包名,必须全局唯一 | netease-cloud-music |
| Version | 版本号,包管理器依赖它判断新旧 | 1.2.1-1 |
| Architecture | 架构,x86_64对应amd64 | amd64 |
| Maintainer | 维护者信息 | author@example.com |
| Depends | 依赖列表,用逗号分隔 | libqt5core5a, libqt5widgets5 |
| Description | 包描述 | Cloud music app for Linux |
Depends这一行的含义是:当前系统里这些包必须存在,且版本满足括号内的要求,否则就是"依赖关系不满足"。搞清楚这个,安装报错的含义就一目了然了——不是安装器跟你过不去,是系统在按你定的标准做校验。
2.3 安装deb的几种方式,差别在依赖处理
装deb包有三条路:dpkg -i、apt install、图形化双击安装。很多人只知道双击,但这恰恰是最难排查问题的方式,因为图形安装器往往只把dpkg的输出弹窗给你看,报错信息还不给全。
实际操作优先级应该是:
sudo apt install ./包名.deb——apt会检查依赖,并尝试从已配置的软件源里补齐缺失项,是普通用户的首选;sudo dpkg -i 包名.deb——只安装文件,不做依赖解析,"裸装";- 双击deb——内部调用的还是dpkg,但报错信息被界面截断了。
我在第一遍安装网易云时吃过亏,双击后系统弹了个"安装失败"就没下文了。换成终端跑sudo dpkg -i,才看到了完整的依赖清单。做系统维护的人一定要养成看终端输出的习惯。
3. 网易云音乐安装实录:一次完整的deb安装与依赖修复
理论说够了,开始实际操作。以下是我在麒麟V10(x86_64)上完整跑通的过程,每一步都是真实复现过、能直接照抄的。
3.1 拿到官方deb包
网易云音乐Linux版官方提供的deb包,以1.2.1版本为示例,文件名通常是netease-cloud-music_1.2.1_amd64_ubuntu_16.04.deb。可以从官网下载,也可以在内网做一次镜像供批量分发。
拿到包以后,先确认架构匹配,不要只看文件名带个amd64就完了。在终端跑:
bash复制dpkg --print-architecture
正常输出是amd64。如果机器是arm架构,那就别折腾这个包了,要去找对应的arm64版本。架构不匹配是硬伤,怎么改control都没用。
3.2 第一次安装,报错的经典现场
直接上dpkg:
bash复制sudo dpkg -i netease-cloud-music_1.2.1_amd64_ubuntu_16.04.deb
这里的输出很有代表性。你会看到类似这样的内容:
code复制Selecting previously unselected package netease-cloud-music.
(Reading database ... 123456 files and directories currently installed.)
Preparing to unpack netease-cloud-music_1.2.1_amd64_ubuntu_16.04.deb ...
Unpacking netease-cloud-music (1.2.1) ...
dpkg: dependency problems prevent configuration of netease-cloud-music:
netease-cloud-music depends on libqt5libqgtk2; however:
Package libqt5libqgtk2 is not installed.
关键信息全在最后两行:netease-cloud-music depends on libqt5libqgtk2; however: Package libqt5libqgtk2 is not installed. 这个libqt5libqgtk2是经典坑,它是Deepin系发行版里提供的一个Qt-Gtk主题桥接库,Ubuntu官方源和麒麟官方源里默认没有。网易云音乐把这个写进了依赖,装不上就卡住了。
文件本身已经解压了,但安装处于"未配置"状态。这个状态很尴尬,命令找不到,菜单里也没有图标。现在要做的不是重装,而是把依赖问题解决掉,然后让dpkg接着完成配置。
3.3 依赖修复的完整排查链路
拿到报错后,第一反应不要想着绕过,先排查依赖到底缺了什么。标准做法是让apt帮你找:
bash复制sudo apt --fix-broken install
apt会扫描当前所有未配置的包,尝试从源里补充缺失依赖。但网易云这个场景下,libqt5libqgtk2在麒麟源里通常也搜不到。这时就要分两步走。
第一步,确认系统里实际还缺哪些依赖,可以用dpkg -s逐个检查,也可以看dpkg缓存区的信息:
bash复制apt-cache policy libqt5libqgtk2
如果输出显示N: Unable to locate package libqt5libqgtk2,说明源里没有,常规补依赖这条路断了。
第二步,多方渠道找这个库的deb包。有几种思路,按优先级排列:
- 检查系统是否自带Qt的GTK插件,
dpkg -l | grep qgtk有时能发现已装了类似功能的库; - 从Deepin系的仓库镜像下载
libqt5libqgtk2的deb包,但注意版本要与系统的Qt版本兼容,拿一个编译给Qt5.12的库装到Qt5.6的环境里,即使暴力装上了,运行时也可能崩; - 更稳的方案是重新打包,把多余的依赖去掉,这个我放在下一节详细讲。
如果目标机器只是少这一个依赖,而你又能拿到对应的deb,逐个安装也是最直接的:
bash复制sudo dpkg -i libqt5libqgtk2_xxx_amd64.deb
sudo dpkg --configure -a
dpkg --configure -a这条命令的作用是让dpkg回头把之前卡在"未配置"状态的包补齐配置。跑完再验证:
bash复制netease-cloud-music --version
能看到版本输出,说明程序本体已经可以启动了。
4. 从安装到打包:拆解、修改、重新制作网易云deb包
直接凑依赖解决单台机器可以,但如果要给一批机器部署,每台都手动塞依赖,运维会疯。更优雅的办法是重新打包:把网易云官方deb拆开,改掉control里的依赖声明,再打成一个不依赖缺失库的定制deb。这样做一次,之后所有机器一条dpkg -i命令就完事。
4.1 为什么推荐重打包而不是强制安装
有同学会问:dpkg -i --force-depends不是能强制忽略依赖装上去吗?
能,但我不推荐。这个操作等于告诉系统"不用校验了,直接装"。依赖确实被忽略了,可程序运行时需要的库文件并不会因为你忽略检查就凭空出现。典型的翻车现场是:装是装上了,双击图标没反应,终端启动报error while loading shared libraries——找不到共享库。到时候排错比装之前更麻烦,因为包状态、依赖检查全乱了。
重新打包是"正面解决问题"的方式:让deb包声明的依赖与系统实际环境一致。这不会破坏包管理器的一致性,后续卸载、升级都能正常进行。授人以鱼不如授人以渔,这也是我写这篇系列文章的初衷。
4.2 拆包命令:dpkg-deb -R一次搞定
拆包用dpkg-deb,参数不复杂:
bash复制mkdir netease-repack && cd netease-repack
dpkg-deb -R ../netease-cloud-music_1.2.1_amd64_ubuntu_16.04.deb extracted/
-R是raw extract,会把数据和控制信息全部解出来。命令执行完,目录结构有两部分,一部分是extracted/DEBIAN/,里面躺着control、md5sums等文件;另一部分是extracted/usr/、extracted/opt/这种真实文件目录。
也可以分步做:dpkg-deb -e单独提取控制信息,dpkg-deb -x单独提取数据文件。但日常操作用-R一步到位就够了,反正后面都要改。
4.3 修改control文件:去掉多余依赖
现在编辑control文件:
bash复制vim extracted/DEBIAN/control
找到Depends行。原始内容类似:
code复制Depends: libqt5core5a, libqt5dbus5, libqt5gui5, libqt5network5, libqt5sql5, libqt5widgets5, libqt5xml5, libqt5x11extras5, libgconf-2-4, libgl1-mesa-glx, libpulse0, libqt5libqgtk2
这里面libqt5libqgtk2就是卡住大家的那个库。处理它有两种策略:一是直接从Depends里删掉,适用于这个库对程序核心功能影响不大时;二是改成系统里真实存在的同类库名,适用于有替代关系时。
删掉以后,还要顺手检查一下其他依赖项在当前系统里是否都已满足。做法是打开终端逐项检查:
bash复制dpkg -l libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5sql5 libqt5widgets5 libqt5xml5 libqt5x11extras5 libgconf-2-4 libgl1-mesa-glx libpulse0
输出里每行的第一列如果显示ii,说明已安装且状态正常。哪一项不是ii,就要留意,能apt装就apt装,装不了改天单独处理。若大量依赖项在麒麟系统里根本不存在(比如libgconf-2-4在Ubuntu 20.04里就已经被替换了),也可以一起从Depends里移除。
control文件改完,还有个小坑:Version字段可以加个后缀,比如1.2.1-1kylin1,这样以后官方包更新版本时,apt能正确识别并升级。如果不改版本号直接重新打包,下次官方包一覆盖,你自己做的定制包就被顶掉了,之前做的依赖修改全白费。
4.4 重新打包并验证
拆包容易打包也不难,一条命令:
bash复制dpkg-deb -b extracted/ netease-cloud-music_1.2.1_amd64_repack.deb
打包时终端会警告dpkg-deb: warning: 'extracted/DEBIAN/control' contains user-defined field...,这是正常现象,不用管,除非你想彻底干净。打包完成后,先用dpkg -I查看新包的元信息确认依赖已经改对:
bash复制dpkg -I netease-cloud-music_1.2.1_amd64_repack.deb
重点看Depends那行,确认原来的libqt5libqgtk2已经不在了。然后安装:
bash复制sudo dpkg -i netease-cloud-music_1.2.1_amd64_repack.deb
正常情况下,这一步不会再有依赖报错。装完启动一下,能出窗口就没大问题。这个重新打好的包要保存好,之后用于批量分发,省去每台机器手动修依赖的时间。
我实际测试过多次,重打包对网易云音乐这种固定环境的应用非常有效。但也要提醒一句:重打包不等于魔法。如果缺失的依赖是程序运行的核心库,删掉依赖后程序启动就会缺库崩溃。删依赖前还是要做评估,判断一个库是不是可删,可以看它是在usr/lib下被程序直接链接的,还是只是一个环境适配层。可以用ldd /usr/bin/netease-cloud-music查看程序实际链接了哪些动态库,实测照妖镜。
5. 装完之后的事:输入法、音效、桌面图标的实战调优
包能装上只是万里长征第一步。网易云音乐这种Qt应用在麒麟上跑起来之后,还有一串小毛病等着你。这一节全是实战里踩过的坑,属于不写到文档里的经验。
5.1 Qt程序输入法失效的根治办法
装好后第一次在网易云搜索框里打字就发现,输入法没反应,英文能进,中文出不来。原因很早就有人总结过:Qt程序默认不直接挂输入法框架,需要通过环境变量告诉它用哪个输入法。
麒麟桌面一般预装的是fcitx方案,个别新版本用fcitx5。先确认当前输入法类型:
bash复制fcitx5 --version 2>/dev/null || fcitx --version
然后在/etc/profile或用户级环境变量里加三行:
bash复制export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
如果你用的是fcitx5,把第一行改成export QT_IM_MODULE=fcitx在多数场景下依然兼容,但保险起见给fcitx5的Qt插件装好:
bash复制sudo apt install fcitx5-frontend-qt5
改完环境变量要重新登录,或者直接注销一次再进。这些变量对Qt5应用全局生效,不只会解决网易云,其他Qt程序比如某些配置工具也能跟着受益。
5.2 播放没声音,问题多半在PulseAudio管道
网易云装好后能登录,能浏览歌单,一按播放,进度条在走,声音就是出不来。查了音量、声卡都正常,Linux下的音频路径比Windows多一层,程序的声音要先经过PulseAudio,才送到声卡。
确认PulseAudio服务是否在跑:
bash复制pactl info
如果提示Connection failure: Connection refused,说明服务没起来。就手动拉起:
bash复制systemctl --user start pulseaudio
systemctl --user enable pulseaudio
还有一个更隐蔽的坑:网易云音乐自带了一些音频后端,如果系统里同时有多个音频后端在竞争,可能会抢不过。检查一下/usr/share/netease-cloud-music/下有没有libpulse*这类动态库,如果有,并且和系统PulseAudio版本冲突,也会无声。极端情况下,把程序目录下自带的音频库改名备份,让程序退回使用系统库,问题反而解决了。
5.3 桌面图标和启动器:desktop文件要检查
装完以后,如果应用菜单里找不到网易云的图标,别急着重装,多半是.desktop文件没有被正确识别。dpkg安装的包会把desktop文件放到/usr/share/applications/下面,检查一下:
bash复制ls -l /usr/share/applications/ | grep netease
有文件但是菜单不显示,通常是Exec行指向的程序路径不对,或者Icon图标路径有问题。用文本编辑器打开:
bash复制vim /usr/share/applications/netease-cloud-music.desktop
如果Exec行写的是netease-cloud-music %U,而程序实际不在PATH里,需要改成绝对路径,比如Exec=/usr/bin/netease-cloud-music %U。改完再跑一下:
bash复制update-desktop-database
刷新图标缓存。这一步经常被忽略,但图标和启动器问题九成都能靠它解决。
6. 给后续篇埋伏笔:第三方软件打包的通用经验
网易云音乐这个case做完,其实暴露了一个更大的需求:麒麟系统上需要手动处理的第三方软件远不止一个。很多软件要么官方包年代久远,要么依赖写得一塌糊涂,要么干脆只有源码没有现成deb。这一节的通用经验,就是为了后面的文章做铺垫。
6.1 打包踩坑清单
几轮折腾下来,建议你把这些记在小本子上:
- 删依赖前先用
ldd确认程序链接情况,不要盲删,盲删的结果早晚是运行时崩溃; control文件的Package字段包名必须全小写,大写会导致dpkg拒绝安装;- 重打包后加自己的版本后缀,比如
1.2.1-1kylin1,避免被官方后续版本覆盖; Installed-Size字段可以不写,dpkg-deb会自动计算,但如果写了它又算出来不一致,会产生警告,建议干脆删掉这行;- 依赖项之间用英文逗号加空格分隔,字段值里不要用中文逗号,这是很多手写control文件报错的根因;
- deb包内的文件权限要保留好,尤其可执行文件必须有执行权限。用
-R解包再打包时,权限信息一般能保留,但如果你手动添加了新的可执行文件,记得chmod +x。
对于批量部署场景,我强烈建议自己维护一个小型本地仓库:把重打包好的deb和各种系统缺失的依赖库deb集中放到一台内网服务器上,用dpkg-scanpackages生成Packages索引,客户端配置一个本地源,一条apt install netease-cloud-music就能解决,连依赖解析都能自动完成。这个方法等我后面写到"搭建本地软件仓库"时详细展开。
6.2 这个系列后面会聊什么
第一篇把"拿到别人的deb,改造它"这条路走通了。这只是开始,后面还有几类常见场景:
- 从源码编译打包成deb,把开源软件变成自己分发使用的安装包,这个过程中
debian/目录的写法、rules文件的作用、多架构构建的坑都值得一篇长文; - 没有官方Linux版的Windows软件,如何借助兼容层方案整合进应用菜单,做成"假原生"体验,这是另一个大话题;
- 处理安装包升级路径的方案,多个版本并存时的dpkg管理策略,以及如何避免"升级一次,配置全丢"的尴尬。
这些思路的根子都是同一个:理解软件包管理器的规则,按规则做自己的定制包。所以这一篇如果能帮你把deb的概念和dpkg-deb的用法吃透,后面对付其他软件就会顺手很多。网易云只是第1篇,后面还有一堆软件等你把它们一个个"驯服"成麒麟系统上能用的样子。
