dpkg:警告:无法找到软件包 XXXX 问题解决

纠结了好久在ubuntu server 上 出现的 一大批“ dpkg:警告:无法找到软件包 XXXX 问题” 终于解决了!

先来讲讲 这个问题是咋出来的

一.由于前段时间想安装一个vsftpd+ldap在服务器上,google了各种安装配置方法,没装成功!

因为多次尝试,使用了各种apt-get install  +apt-get remove ,结果就导致出现了 一些“pkg:警告:无法找到软件包 XXXX ” 问题

当时,警告还是很少的 也就是提示无法找到的包不多,渐渐地,服务器装的东西多了,这个问题就越来越明显

于是求google 大师,找各种答案  其中:

  1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //现将info文件夹更名
2.$ sudo mkdir /var/lib/dpkg/info //再新建一个新的info文件夹
3.$ sudo apt-get update, apt-get -f install
4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下
5.$ sudo rm -rf /var/lib/dpkg/info //把自己新建的info文件夹删掉
6.$ sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info //把以前的info文件夹重新改回名字

被我尝试多次,依然会出现那个问题!

其实这里 我们可以发现为什么会在安装新的内容时会出现无法找到软件包问题,因为在apt-get install 安装一个新包时 先回去检查/var/lib/dpkg/info/目录下的已安装包的配置文件信息;如果发现有已经安装的应用 的配置文件信息不在info目录下 就会提示这个错误

 所以这个时候我们 可以通过:sudo dpkg --configure -a

然后通过:dpkg -l | grep ^ii | awk '{print $2}' | grep -v XXX | xargs sudo aptitude reinstall 

重新获取包内容配置信息 ,这样一步步重新安装下去 很快就可以解决这个问题了

二.当然也还有第二种方法,那就是通过:sudo apt-get --reinstall install `dpkg --get-selections | grep '[[:space:]]install' | cut -f1`

来重新安装全部软件,会全部刷新info目录 不过这个方法就要多花点时间去等了


二、状况

安装这卸载软件的时候总是出现dpkg:警告:无法找到软件包****信息。

  • 预期就是解决这个问题。
  • Ubuntu切换工作区间的快捷键[Ctrl+Alt+方向键]

三、探究

这个问题还是有前人处理过的,我们来学习下。 
1. dpkg:警告:无法找到软件包 XXXX 问题解决 
2. dpkg:警告:无法找到软件包 XXXX 问题解决

3.1、了解下/var/lib/dpkg/info

  1. /var 包含系统一般运行时要改变的数据。通常这些数据所在的目录的大小是要经常变化或扩充的。原来/ v a r目录中有些内容是在/ u s r中的,但为了保持/ u s r目录的相对稳定,就把那些需要经常改变的目录放到/ v a r中了。每个系统是特定的,即不通过网络与其他计算机共享。下面列出一些重要的目录 
    /var/lib存放系统正常运行时要改变的文件。*

  2. 简单的说关于dpkg是一个dpkg是Debian的中级软件包管理器,类似RPM. 
    而其中的:/var/lib/dpkg/info”用于保存各个软件包的配置文件列表. 
    如果把这个里面的东西全部删除系统并不会瘫痪

  3. 从根本上说我们没有了解到这个/var/lib/dpkg/info路径在apt-get ***一些命令中起到的作用。但是这个过程还是有收获的,就当是预习Ubuntu知识了,不做记录了。

3.2、没头的苍蝇

1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //现将info文件夹更名

2.$ sudo mkdir /var/lib/dpkg/info //再新建一个新的info文件夹

3.$ sudo apt-get update, apt-get -f install

  • 现在尝试安装搜狗输入法看还会不会出现那些错误了。(事实上出现了,所以我们把文章中后面的操作也做了)

4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下

5.$ sudo rm -rf /var/lib/dpkg/info //把自己新建的info文件夹删掉

6.$ sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info //把以前的info文件夹重新改回名字


dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v xxxx | grep -v xxxx| xargs sudo aptitude reinstall

  • 做出解释:

    1. “|”管道
    2. dpkg -l:显示已经安装的软件包列表。
    3. grep ^ii:筛选显示处于 ii状态的已安装软件包列表。
    4. awk ‘{print $2}’:仅仅打印软件的名字。 
      • dpkg -l | grep ^ii | awk ‘{print $2}’ 仅用这个命令得到的是一系列已经安装的软件名字
    5. 而 xargs sudo aptitude reinstall 的作用是对 dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v xxxx | grep -v xxxx| 筛选出来的软件进行重新安装
    6. grep -v packageName 此命令:举个例子,如果 dpkg -l | grep ^ii | awk ‘{print $2}’ 得到的结果是 软件1,软件2,软件3但我们并不希望 软件3 重新安装 整个命令就应该是: 
      dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v 软件3| xargs sudo aptitude reinstall
  • 这里写图片描述

    • 期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h) 
      | 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T) 
      |/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
    • 结合图片应该把这三行内容结合分析
    • 第一个i表示用户期望软件的状态是安装
    • 第二个i表示软件的实际状态是已安装
    • 第三个空格表示无误
    • 总结:“ii ”表示用户期望安装的软件处于正确的安装状态。
    • dpkg包管理器ii、rc含义

其中“grep -v xxxx”为需要排除的包。

例如,用户是在网站上下载的opera的deb包安装的opera,这时是修复的时候,系统可能出现如下提示: 
E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。 
正在编辑扩展状态信息… 完成 
E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。 
E: 内部错误:无法生成下载软件包列表 
xargs: sudo:以状态 255 退出;中止

这时只要把提示的包名称输入在“grep -v xxxx”里替换掉“X”就可以,就像这样: 
dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v opera | xargs sudo aptitude reinstall

如果还有上面的提示,但是包的名称不同,就在后面再加一个“| grep xxx” 
以包”benliud”为例: 
dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v opera | grep -v benliud | xargs sudo aptitude reinstall 
以此类推。

不过我的问题是我没有出现:

E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。 
正在编辑扩展状态信息… 完成 
E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。 
E: 内部错误:无法生成下载软件包列表 
xargs: sudo:以状态 255 退出;中止

—当前还是不知道要怎么处理呢。


四、解决

我最终通过 dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v xxxx | grep -v xxxx| xargs sudo aptitude reinstall 命令部分解决了我的问题。 
值得注意的是这个命令并不是防止四海皆准的 
使用步骤可以是这样的 
dpkg -l | grep ^ii | awk '{print $2}' | xargs sudo aptitude reinstall 
如果提示 
E: 没有源可以用来下载 5.1.6~rc2-0ubuntu1~xenial1 版本的 uno-libs3:amd64 
可以修改为 
dpkg -l | grep ^ii | awk '{print $2}' | xargs sudo | grep -v uno-libs3 | aptitude reinstall 
再次运行就再次添加 
dpkg -l | grep ^ii | awk '{print $2}' | xargs sudo | grep -v uno-libs3 | grep -v ^libreoffice | aptitude reinstall 
我的最终命令是:

dpkg -l | grep ^ii | awk '{print $2}' | grep -v uno-libs3 | grep -v ^libreoffice | grep -v account-plugin-facebook | grep -v account-plugin-flickr | grep -v  libaccount-plugin-google | grep -v  account-plugin-google | grep -v fonts-opensymbol | grep -v libaccount-plugin-1.0-0 | grep -v libaccount-plugin-generic-oauth | grep -v libicu55 |grep -v netease-cloud-music| grep -v python3-uno | grep -v sogoupinyin | grep -v unattended-upgrades | grep -v unity-control-center-signon | grep -v ure |  xargs  aptitude reinstall
  • 1

中间失败过我就又重新运行了这个命令两遍。结果很可观。 
从前我的错误有1900+条

dpkg:警告:无法找到软件包 
…… 
执行上述命令后 
错误就只有一屏幕了

最新的问题是对于这些剩余的dpkg:警告:无法找到软件包,再次逐条执行 aptitude reinstall packageName 会提示:

E: 没有源可以用来下载 xxx 版本的 xxx

好在效果还是有的。

参考

不妨读一下 
1. Linux 各目录及每个目录的详细介绍 
2. Linux 各目录及每个目录的详细介绍 /var文件系统 
3. ubuntu APT-GET工作原理 
4. ubuntu APT-GET工作原理

  1. http://www.iteye.com/topic/138041
  2. apt-get 命令详解
  3. dpkg的介绍及命令使用
  4. 富有指导意义,但是尚不能找到重点

有待处理

  1. Linux方便的跳墙方式。
  2. Debian
  3. 清空控制台

猜你喜欢

转载自blog.csdn.net/weixin_40539892/article/details/80623090