Linux 依赖问题“硬核”解决方案( 二 )

接下来说说暴力的解决方案之所以说暴力,是因为刚才的方式,已经是在我的认知里,工具和系统提供的自动化程序能做到的极限 。
如果还是出现了依赖无法满足的问题,比如什么即将安装 xxxx 但是现在的系统内的版本高于 xxxx 。
一般这种情况,系统已经不建议你再搞了,你如果非要硬来,很可能会破坏现有的程序依赖结构 。

  • 运气好或者你手高,硬装上一点问题没有 。
  • 影响小一点,你装了这个软件,另一个软件不能用或者会崩 。
  • 影响大一点,有些系统命令不好使了,界面卡死了,资源管理器崩了等等 。
  • 影响更大一点,装完用着啥毛病没有,重启后卡在加载过程,再也进不了系统 。
“以上这些情况,我全部都遇到过!”
所以下面的搞法,你就当学习知识或看我装逼都行,自己实操,还是要谨慎地折腾 。至少,别在客户机器和生产环境的服务器上硬来 。
暴力的解决方案有:
  1. --ignore-depends,忽略依赖直接装 。
  2. 解压安装包,删掉依赖字段重新打包 。
  3. 修改系统中记录的 status 文件 。
  4. 无视安装失败,直接运行 。
  5. 直接拿到根目录,就地解压 。
  6. 改掉 dpkg 源码,直接不检测依赖 。一个一个说:
1、--ignore-depends
这是所有暴力方案里技术门槛最低的一个,你可以通过 dpkg --help 查看 --ignore-depends 选项:
选项: ......其它选项 --ignore-depends=<软件包>,... 忽略关于 <软件包> 的所有依赖关系 。--force-...
忽视遇到的问题(参见 --force-help) 。......其它选项
这个选项可以指定要忽略的依赖包 。所以安装的时候如果依赖不满足,你直接加上这个参数把依赖忽略的就完了:
Linux 依赖问题“硬核”解决方案

文章插图
 
当然,安装不会有任何问题,但是能不能用就看要造化了 。
“并不是依赖不满足,装上就一定完全不能用”,有时候只是功能不全而已 。
比如你装了一个 QQ,它依赖 ffmpeg,你忽略了它后直接安装使用很可能没问题,但是一点击视频通话,程序立马就崩掉了 。(这是个假设,QQ 用啥不用啥我也不知道)
这个方案虽然门槛低,有个致命的缺陷就是太麻烦,我这里缺两个,写两个 ignore 参数 。安装过程中经常遇到那种一下子缺十个八个的,要写十个八个这样的参数属实费劲 。
2、解压安装包,删掉依赖字段重新打包
这个方案可以直接大刀阔斧地把软件包的依赖全干掉,不过稍微需要点技术底子:
“首先你得会解压安装包,其次你得会制作安装包 。”
dpkg -X 只会解压出安装包的文件,无法解压出安装包带的脚本和控制信息 。
“右键”->“提取到此处”,解压出来的control和data分开两个压缩包,也不是打包前完美的状态 。
这里要用的是
dpkg-deb -R sogoupinyin_xxxx.deb ./sogou这样解压出来的就是 deb 在被打包前完完整整的样子,我解压了一个搜狗输入法的安装包为例:
Linux 依赖问题“硬核”解决方案

文章插图
 
其他的我们都不用管,直接打开 control 文件:
Linux 依赖问题“硬核”解决方案

文章插图
 
看到红框的部分了吧,直接把这行全部干掉 。然后再把拆出来的文件重新打回一个安装包:
fakeroot dpkg-deb --build ./sogou mysogou.deb这个自己打的 mysogou 安装包,和搜狗原生安装包唯一的区别就是没有依赖 。
这下就可以一路畅通无阻,直接装完 。
3、修改系统中记录的 status 文件
和刚才那个方案思路差不多,只不过换了一个突破点,比刚才要更方便一点 。
刚才我们突破的思路是:安装包里记录有对软件依赖,全部干掉就没有依赖了 。
那么这个方案的思路则是:如果检测依赖发现系统不满足,我们给他伪造一个满足的依赖环境不就完了!
刚才我们说的 control 文件,所有的 deb 文件都有,安装过程中(不是安装后也不是前),它就被记录在了系统里的:/var/lib/dpkg/status 文件里 。
这个文件里的内容,也是 dpkg -l 命令显示内容的信息来源 。
也是我们上面说的,依赖检测时检索系统内是否满足依赖的信息来源 。
如果软件通过 dpkg -r 卸载,这个 status 文件里的信息不会删除,只会把 Status 字段改为: deinstall ok config-files 。通过 dpkg -P 或者 dpkg --purge 才会把信息完全抹除 。


推荐阅读