加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

史上最 硬核的 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分开两个压缩包,也不是打包前完美的状态。
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!