史上最 硬核的 Linux 依赖问题解决方案 | 技术
发布时间:2022-12-19 13:05:45 所属栏目:Linux 来源:
导读: 编者按:本文介绍了一些另类的暴力破解 RPM 和 DEB 软件包依赖关系的方法,对陷入依赖陷阱而不可自拔的人来说,有时候这也是一种绝地求生之路。至于说这样做是否合适,那就是一件见仁见智的事情了,不过这种硬刚
|
编者按:本文介绍了一些另类的暴力破解 RPM 和 DEB 软件包依赖关系的方法,对陷入依赖陷阱而不可自拔的人来说,有时候这也是一种绝地求生之路。至于说这样做是否合适,那就是一件见仁见智的事情了,不过这种硬刚的不罢休态度值得赞赏。此外,本文中一些观点仅代表作者的认识,未必一定正确,大家争鸣即可。 本文的转载得到了作者授权。 硬刚 Linux 软件安装依赖问题的办法有很多,我给他分为两大类!“一类合法,另一类暴力。” 最近正好在研究 dpkg 和 rpm,对 Linux 依赖有了更深的认识。 在网上看了很多,所有 Docker、虚拟机、编译安装、以及各种另辟蹊径的答案,都是面向日常繁重的业务没时间折腾而不得已做出的妥协和让步。 而我们面向技术的,“从来都喜欢正面硬刚!” 硬刚 Linux 软件安装依赖问题的办法有很多,我给他分为两大类! “一类合法,另一类暴力。” 先说合法的解决方案 也是所有人都知道的解决方案: sudo apt-get install xxxxx 一般情况下,它会连带软件的依赖一起安装。如果这个过程中依赖安装失败,就执行: sudo apt-get -f install 一次不行两次,只要源里有,只要能保证依赖关系是顺畅的,再多的依赖多执行几次都能装完。 如果有依赖源里找不到。这个坑就踩不过去了,解决办法是:找到缺失的库的安装包手动下载下来。然后通过 sudo dpkg -i xxxx.deb 安装。 需要手动下载安装包的寻找主要有两个途径: 百度找,直接搜包名 + 版本号并带上关键字 deb通过源。 百度直接找库就不多说了,额外说一下通过源怎么找。 你在网上搜 ubuntu 国内源。会找到很多类似这样的写法: deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse 这其实即是给apt-get工具配置的源地址,也是个实际的网址,你可以直接从浏览器里访问到,比如上面这个: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse 它其实代表的是: 这个路径下的 main、restricted、universe、multiverse 这几个目录: linux软件源_linux 163源_suse linux 软件源 apt-get 工具会在这四个的目录下自动检索对应的软件包下载并安装。 在一些特殊情况,比如机器网络受限,但浏览器开了代理可以访问外网的情况下。apt-get 无法从源里获取软件,你可以从这里手动找到对应的软件包下载下来然后使用 dpkg 安装。 比如这里,手动找到 mysql 的安装包路径,再点击就可以直接下载: linux 163源_linux软件源_suse linux 软件源 刚才说道 apt-get install 无法修复依赖,通过手动下载然后把这些缺失的安装包装上之后,就可以通过 apt-get 把刚才装不上的包装上。 这是非常合理合法的解决方案。 再补充一种合法技巧,可以尝试用: apt-get install 本地软件包 这是因为: “依赖检测”和“软件安装”不是 apt-get 做的,而是 dpkg 做的。依赖不满足“自动修复依赖”才是 apt-get 做的。 所以,如果你下载了一个 deb 安装包通过 dpkg 安装,但依赖不满足的话,他只会提示你依赖缺失,但他不会自动寻找并安装依赖,虽然你仍然可以去下载安装缺失的依赖,但他如果缺失十个八个的,你再手动下载然后 dpkg 安装也不现实了。 举个例子:我这里下载了一个搜狗输入法的安装包,dpkg -i 无法安装,但是可以通过 apt-get install 装上: suse linux 软件源_linux软件源_linux 163源 要注意:通过 apt-get 安装本地软件一定要写路径,相对绝对都可以,但不能只写包名。不然它会去源里面找不会装本地的。 上面的方案几乎可以解决 80% 的安装依赖问题。总结一下: 接下来说说暴力的解决方案 之所以说暴力,是因为刚才的方式,已经是在我的认知里,工具和系统提供的自动化程序能做到的极限。 如果还是出现了依赖无法满足的问题,比如什么即将安装 xxxx 但是现在的系统内的版本高于 xxxx。 一般这种情况,系统已经不建议你再搞了linux软件源,你如果非要硬来,很可能会破坏现有的程序依赖结构。 “以上这些情况,我全部都遇到过!” 所以下面的搞法,你就当学习知识或看我装逼都行,自己实操,还是要谨慎地折腾。至少,别在客户机器和生产环境的服务器上硬来。 暴力的解决方案有: --ignore-depends,忽略依赖直接装。解压安装包,删掉依赖字段重新打包。修改系统中记录的 status 文件。无视安装失败,直接运行。直接拿到根目录,就地解压。改掉 dpkg 源码,直接不检测依赖。一个一个说: 1、--ignore-depends 这是所有暴力方案里技术门槛最低的一个,你可以通过 dpkg --help 查看 --ignore-depends 选项: 选项: ......其它选项 --ignore-depends=,... 忽略关于 的所有依赖关系。 --force-... 忽视遇到的问题(参见 --force-help)。 ......其它选项 这个选项可以指定要忽略的依赖包。所以安装的时候如果依赖不满足,你直接加上这个参数把依赖忽略的就完了: linux 163源_suse linux 软件源_linux软件源 当然,安装不会有任何问题,但是能不能用就看要造化了。 “并不是依赖不满足,装上就一定完全不能用”,有时候只是功能不全而已。 比如你装了一个 QQ,它依赖 ffmpeg,你忽略了它后直接安装使用很可能没问题,但是一点击视频通话,程序立马就崩掉了。(这是个假设,QQ 用啥不用啥我也不知道) 这个方案虽然门槛低,有个致命的缺陷就是太麻烦,我这里缺两个,写两个 ignore 参数。安装过程中经常遇到那种一下子缺十个八个的,要写十个八个这样的参数属实费劲。 2、解压安装包,删掉依赖字段重新打包 这个方案可以直接大刀阔斧地把软件包的依赖全干掉,不过稍微需要点技术底子: “首先你得会解压安装包,其次你得会制作安装包。” dpkg -X 只会解压出安装包的文件,无法解压出安装包带的脚本和控制信息。 “右键”->“提取到此处”,解压出来的control和data分开两个压缩包,也不是打包前完美的状态。 (编辑:云计算网_汕头站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


浙公网安备 33038102330478号