dpkg:警告:无法找到软件包 XXX的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。(详细的解决过程)

1.问题描述:在使用sudo apt-get update 和upgrade中会出现:

dpkg:警告:无法找到软件包ca-certificates 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包libgstreamer-plugins-good1.0-0:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包libopencv-video-dev:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包libkf5sonnet5-data 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包fcitx-libs 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包fonts-tlwg-loma 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包fonts-tibetan-machine 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包libpango-perl 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

dpkg:警告:无法找到软件包libacl1:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

 

这里我只摘了一小部分,无法找到软件包就是在系统中的全部软件,问题的本质就是dpkg和软件包之间的链接本打断;

2.问题前身

出现这个问题的前身是在处理某个程序时,出现了:

E: Sub-process /usr/bin/dpkg returned anerror code (1)

 

而这个错误网上似乎只有一种解决办法:

cd /var/lib/dpkg

sudo mv info info.bak #即备份一个info

sudo mkdir info #新建一个新的info目录

然后采用以下命令重装那些出错的软件包

sudo apt-get –reinstallinstall 软件包名

开始我是想在一条命令中同时安装几个软件包,结果还是出现E: Sub-process/usr/bin/dpkg returned an error code (1) 。于是把新的info删掉,一个个地来安装,每装好一个软件包,就把info删掉,再新建一个,这样就没有提示E: Sub-process/usr/bin/dpkg returned an error code (1) 了。

最后用原来的info.bak 替换新的info

sudo -rf info

sudo mv info.bak info

之后输入 sudo apt-get update sudo apt-get upgrade 以及sudo apt-get autoremove都不再有E: Sub-process/usr/bin/dpkg returned an error code (1)

 

这里先说明updateupgrade的区别:
1、apt-get update是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。 
2、apt-get update只是更新了apt的资源列表,没有真正的对系统执行更新。如果需要,要使用apt-get upgrade来更新。

 

问题本身是dpkg的依赖关系的话,那定位到是什么依赖被打断是解决这个问题的关键,一些小问题可以直接用这个命令来自动修复被无意间打断的依赖:

 

sudo apt-get -finstall 

 

3.多个内核依赖错误

在我现在遇到的问题当中,整个ubuntu出现同时使用了多个内核镜像,这些镜像又被一个程序依赖,直接删掉导致了内核的使用上面命令不能更新成功,而被依赖的4个内核镜像如果同时安装,报出来的问题就是磁盘空间不足,出现这个的原因是每次ubuntu内核升级后,旧的内核不会被删除,久而久之就会积压很多旧的内核,查看已经安装的内核版本

dpkg --get-selections| grep linux-image

linux-image-4.10.0-28-generic                        deinstall

linux-image-4.10.0-33-generic                        deinstall

linux-image-4.10.0-35-generic                        deinstall

linux-image-4.10.0-37-generic                        deinstall

linux-image-4.13.0-36-generic                        install

linux-image-4.13.0-37-generic                        install

linux-image-4.13.0-38-generic                        install

linux-image-4.13.0-39-generic                        install

linux-image-4.4.0-119-generic                        install

linux-image-extra-4.10.0-28-generic             deinstall

linux-image-extra-4.10.0-33-generic             deinstall

linux-image-extra-4.10.0-35-generic             deinstall

linux-image-extra-4.10.0-37-generic             deinstall

linux-image-extra-4.13.0-36-generic             install

linux-image-extra-4.13.0-37-generic             install

linux-image-extra-4.13.0-38-generic             install

linux-image-extra-4.13.0-39-generic             install

linux-image-extra-4.4.0-119-generic             install

linux-image-extra-4.4.0-121-generic             install

linux-image-extra-4.4.0-122-generic             install

linux-image-extra-4.4.0-124-generic             install

linux-image-extra-4.4.0-128-generic             install

linux-image-extra-4.4.0-130-generic             install

linux-image-generic                                  install

linux-image-generic-hwe-16.04                      install

 

uname –a 可以查看正在使用的内核:

Linux combustion-Super-Server4.13.0-38-generic #43~16.04.1-Ubuntu SMP Wed Mar 14 17:48:43 UTC 2018 x86_64x86_64 x86_64 GNU/Linux

 

 

解释下后面带的install和deinstall:

带install的是已经安装的,除了正在使用的可以全面删掉;

带deinstall的是没有安装的,但是卸载有残留;

 

处理:

带install的用:

sudo apt purgelinux-image-4.13.0-36-generic linux-image-4.13.0-37-generic

linux-image-4.13.0-39-generic

 

果然在执行过程中又遇到了不满足依赖的问题,那么先处理deinstall的吧:

sudo dpkg -P linux-image-4.10.0-28-generic

sudo dpkg -P linux-image-4.10.0-37-generic linux-image-4.10.0-35-genericlinux-image-4.10.0-37-generic

sudo dpkg -P linux-image-extra-4.10.0-28-genericlinux-image-extra-4.10.0-33-generic

sudo dpkg -P linux-image-extra-4.10.0-35-genericlinux-image-extra-4.10.0-37-generic

sudo dpkg -P linux-image-4.10.0-33-generic

将deinstall卸载之后:

linux-image-4.13.0-36-generic                        install

linux-image-4.13.0-37-generic                        install

linux-image-4.13.0-38-generic                        install

linux-image-4.13.0-39-generic                        install

linux-image-4.4.0-119-generic                        install

linux-image-extra-4.13.0-36-generic             install

linux-image-extra-4.13.0-37-generic             install

linux-image-extra-4.13.0-38-generic             install

linux-image-extra-4.13.0-39-generic             install

linux-image-extra-4.4.0-119-generic             install

linux-image-extra-4.4.0-121-generic             install

linux-image-extra-4.4.0-122-generic             install

linux-image-extra-4.4.0-124-generic             install

linux-image-extra-4.4.0-128-generic             install

linux-image-extra-4.4.0-130-generic             install

linux-image-generic                                  install

linux-image-generic-hwe-16.04                      install

 

再来处理install的:

sudo apt purge linux-image-4.13.0-36-generic

 

4./boot下空间不足

发现此时还是没法处理,报的是/boot下空间不足的错误:

1.       原因是这样:在修复的时候需要下载依赖包,然而在/boot下本来就没有多余的空间了,所以无法修复依赖的问题。

2.    这就产生死循环了,为了省出更多boot空间需要删除旧的内核,删除旧的内核时又需要修复一些依赖,修复依赖就需要下载依赖包,而boot空间下本来就满了,(

3.    解决办法就是先把boot空间下几个比较大的文件暂存到别的文件夹,腾出来足够的空间来修复依赖,等依赖修复好了并且删除了旧的内核后再迁移回来(如果文件没什么用处就不用迁移回来了)。

 

 

(这一段是参考博客:https://blog.csdn.net/qq_27818541/article/details/72675954)

 

这里发现两个文件比较大,因为用的远程,所以用xftp拷出来之后就删掉了:

initrd.img-4.13.0-36-generic

initrd.img-4.4.0-119-generic

 

然后此时运行sudo apt-get –f install 就会发现卡死的齿轮有了松动的迹象;

不过还是会报错,在处理内核时出问题,这个时候因为依赖问题已经解决,dpkg的进程处理完成,使用sudo apt purge 将出错的那些内核全部删个干干净净,再用sudo ap-get autoremove 卸掉多于的那些内核依赖。

通过这一轮大的清洗,整个服务器的内核变得很清爽,查看一下:

linux-image-4.13.0-38-generic                        install

linux-image-4.13.0-39-generic                        install

linux-image-4.4.0-121-generic                        deinstall

linux-image-extra-4.13.0-38-generic             install

linux-image-extra-4.13.0-39-generic             install

linux-image-generic-hwe-16.04                      install

 

发现还可以进一步清理,当然,清理之前先备份:

这里发现文件很多,而且有很多都是不能拷出来的,只拷了当前使用的内核,这是备份的三个内核文件:

 

然后,就继续吧,对于deinstall:

sudo dpkg -P linux-image-4.4.0-121-generic

对于 install:

sudo apt purge linux-image-4.13.0-39-generic

 

 

这里出现一个有意思的事,在purge -39这个内核的时候,系统又自己把linux-image-4.15.0-24-generic内核装上了,然后又sudo aptpurge linux-image-4.15.0-24-generic

 

现在再查看安装的内核:dpkg --get-selections | grep linux-image

linux-image-4.13.0-38-generic                        install

linux-image-extra-4.13.0-38-generic             install

 

这里说明一点,在删内核的时候千万千万不要删错,如果删除,也不要贸然重启,这里有个血的教训,https://blog.csdn.net/sarkerson/article/details/76430975,当然了,不是我。

 

5.源的Hash 校验和不符

现在sudo apt-get update,嗯,源有点问题,把源也修一下吧:

忽略:1 https://repo.fdzh.org/chrome/deb stable InRelease

命中:2 https://repo.fdzh.org/chrome/deb stable Release                                                                                                     

命中:4 http://packages.osrfoundation.org/gazebo/ubuntu-stable xenialInRelease                                                                              

忽略:5 https://dl.google.com/linux/chrome/deb stable InRelease                                                                                             

命中:6 https://dl.google.com/linux/chrome/deb stable Release                                                                                               

命中:9 http://ppa.launchpad.net/ondrej/php/ubuntu xenial InRelease                                                                                         

获取:8 http://packages.ros.org/ros/ubuntu xenial InRelease [4,040B]                                                                                       

获取:10 http://10.6.251.2:9999/packages.ros.org/ros/ubuntu xenial/mainamd64 Packages [620 kB]                                                              

错误:10 http://10.6.251.2:9999/packages.ros.org/ros/ubuntu xenial/mainamd64 Packages                                                                      

 Hash 校验和不符

命中:11 http://ppa.launchpad.net/webupd8team/java/ubuntu xenialInRelease                                                                                  

命中:13 https://packages.microsoft.com/repos/vscode stableInRelease                                                                                    

命中:14 http://archive.ubuntukylin.com:10006/ubuntukylin xenialInRelease                               

命中:15 http://mirrors.ustc.edu.cn/ubuntu xenial InRelease       

命中:16 http://mirrors.ustc.edu.cn/ubuntu xenial-security InRelease   

命中:17 http://linux.teamviewer.com/deb stable InRelease              

命中:18 http://mirrors.ustc.edu.cn/ubuntu xenial-updates InRelease     

命中:19 http://mirrors.ustc.edu.cn/ubuntu xenial-proposed InRelease   

命中:20 http://linux.teamviewer.com/deb preview InRelease             

命中:21 http://mirrors.ustc.edu.cn/ubuntu xenial-backportsInRelease  

已下载 619 kB,耗时 4秒 (130 kB/s)                

正在读取软件包列表... 完成

E: 无法下载

http://10.6.251.2:9999/packages.ros.org/ros/ubuntu/dists/xenial/main/binary-amd64/Packages.gz  Hash 校验和不符

E: 无法下载

http://10.6.251.2:9999/packages.ros.org/ros/ubuntu/dists/xenial/main/binary-i386/Packages.gz 

E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。

 

在上面的解释中,update执行的是索引的本地化,而查看本地的源

cat/etc/apt/sources.list

deb http://mirrors.ustc.edu.cn/ubuntu/xenial main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu/xenial-security main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu/xenial-updates main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu/xenial-proposed main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu/xenial-backports main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu/xenial main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu/xenial-security main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu/xenial-updates main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu/xenial-proposed main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu/xenial-backports main restricted universe multiverse

#deb http://mirrors.aliyun.com/ubuntu/trusty main restricted universe multiverse

#deb http://mirrors.aliyun.com/ubuntu/trusty-security main restricted universe multiverse

#deb http://mirrors.aliyun.com/ubuntu/trusty-updates main restricted universe multiverse

#deb http://mirrors.aliyun.com/ubuntu/trusty-proposed main restricted universe multiverse

#deb http://mirrors.aliyun.com/ubuntu/trusty-backports main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/trusty main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/trusty-security main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/trusty-updates main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/trusty-proposed main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/trusty-backports main restricted universe multiverse

#deb http://archive.ubuntu.com/ubuntuxenial main universe

 

发现整个源和报的错误包根本就没有半毛钱关系,还是一样,先定位错误源,校验和不符,

百度到的解决方案:(https://blog.csdn.net/mandagod/article/details/53968940)

1.清除临时文件

sudo apt-getclean

sudorm -rf /var/lib/apt/lists/*

好吧,看见rm –rf一定要警惕,先备份吧:

 

然后update发现还是没有解决,不过现在upgrade能更新很多软件,并且又出现了开头的那种错误:

 在处理时有错误发生:

 php5.6-common

 php5.6-json

 php5.6-opcache

 php5.6-readline

 php5.6-cli

 libapache2-mod-php5.6

 linux-firmware

 php5.6

 php5.6-gd

 php5.6-mbstring

 php5.6-mysql

 php7.1-common

 php7.1-mbstring

 php7.1-mcrypt

 php7.1-xml

 initramfs-tools

E: Sub-process /usr/bin/dpkg returned anerror code (1)

 

和之前的内核都没有关系,说明内核正常,按开头的方法处理:

cd /var/lib/dpkg

sudo mv info info.bak #即备份一个info

sudo mkdir info #新建一个新的info目录

sudo apt-get -reinstall install php5.6-commonphp5.6-json php5.6-opcache php5.6-readline php5.6-cli libapache2-mod-php5.6linux-firmware php5.6 php5.6-gd php5.6-mbstring php5.6-mysql php7.1-commonphp7.1-mbstring php7.1-mcrypt php7.1-xml initramfs-tools

 

 

将之前备份的info拷回去,upgrade上面的错误消失,现在系统中存在着两个问题:

一个是在使用sudo apt-get update时:

命中:1 http://archive.ubuntukylin.com:10006/ubuntukylin xenial InRelease

命中:2 http://packages.osrfoundation.org/gazebo/ubuntu-stable xenialInRelease    

忽略:3 https://dl.google.com/linux/chrome/deb stable InRelease                    

忽略:4 https://repo.fdzh.org/chrome/deb stable InRelease                          

命中:5 https://repo.fdzh.org/chrome/deb stable Release                            

命中:6 https://dl.google.com/linux/chrome/deb stable Release                      

命中:9 http://ppa.launchpad.net/ondrej/php/ubuntu xenial InRelease                

获取:10 http://packages.ros.org/ros/ubuntu xenial InRelease [4,040B]             

获取:11 http://10.6.251.2:9999/packages.ros.org/ros/ubuntu xenial/mainamd64 Packages [620 kB]

错误:11 http://10.6.251.2:9999/packages.ros.org/ros/ubuntu xenial/mainamd64 Packages

 Hash 校验和不符

命中:12 http://linux.teamviewer.com/deb stable InRelease                          

命中:14 http://linux.teamviewer.com/deb preview InRelease                         

命中:15 http://ppa.launchpad.net/webupd8team/java/ubuntu xenialInRelease

命中:16 http://mirrors.sohu.com/ubuntu xenial InRelease

命中:17 http://mirrors.sohu.com/ubuntu xenial-security InRelease

命中:18 http://mirrors.sohu.com/ubuntu xenial-updates InRelease

命中:19 http://mirrors.sohu.com/ubuntu xenial-proposed InRelease

命中:20 http://mirrors.sohu.com/ubuntu xenial-backports InRelease

命中:21 https://packages.microsoft.com/repos/vscode stable InRelease

已下载 619 kB,耗时 5秒 (105 kB/s)

正在读取软件包列表... 完成

E: 无法下载

http://10.6.251.2:9999/packages.ros.org/ros/ubuntu/dists/xenial/main/binary-amd64/Packages.gz  Hash 校验和不符

E: 无法下载

http://10.6.251.2:9999/packages.ros.org/ros/ubuntu/dists/xenial/main/binary-i386/Packages.gz 

E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。

 

另一个是在安装软件时:

出现无法找到软件包列表,网上有一种解决办法是通过sudo apt-get --reinstall install `dpkg--get-selections | grep '[[:space:]]install' | cut -f1`

来重装全部软件,但是这样的有很多软件是没法下载的,而没法下载的这些软件,如果猜得没错,全部来源于之前Hash校验和不符的站点;

 

这样的话,估计还是得先解决校验和的问题。

 

 

出现这个问题不知道是不是网络的原因,验证的方法就是直接打开网址,能打开就不是,刚开始还以为是墙,结果又是装lantern又是装谷歌浏览器的,但是还是不行;

 

网上第二种解决办法是在在/etc/apt/apt.conf.d/00aptitude文件中,(如果没有这个文件请自建)的最后一行添加如下内容:

Acquire::CompressionTypes::Order "gz"; (不要漏掉分号)

然而对于我的情况并不起作用;

 

第三种解决办法:

所以我找到设置源的地方:将其他软件中的两个独立的源勾去掉

 

我用的xfce4进的ubuntu软件中心,并没有找到所谓的独立的源,但是我看见了ros的源,在终端输出的信息中一直都是ros出的错,然后就把它取消勾选,保存,关闭,重新载入,update一下,发现hash 校验和的错误没了;与此同时,ros站点的软件还是可以下载的;

 

 

此时update&upgrade都是没有问题的,只有在装软件的时候问题才会跳出来,虽然是警告,但是因为这个问题前几天导致了另一个做燃烧仿真的同学电脑崩溃,今天还是决定正式的解决一下:

 

6.直面问题

这个时候再用sudo apt-get --reinstall install `dpkg --get-selections | grep'[[:space:]]install' | cut -f1`来获取跳出错误中的所有软件,然后全部重新,这样会更新dpkg的软件信息,从而解决问题,但是这样出现的结果是:

不能重新安装 libfltk1.3-dev,因为无法下载它。

不能重新安装 gir1.2-gdesktopenums-3.0,因为无法下载它。

不能重新安装 qtdeclarative5-test-plugin,因为无法下载它。

不能重新安装 ros-kinetic-rospy-tutorials,因为无法下载它。

不能重新安装 libfile-stripnondeterminism-perl,因为无法下载它。

不能重新安装 libgksu2-0,因为无法下载它。

不能重新安装 mesa-utils,因为无法下载它。

不能重新安装 libjpeg8,因为无法下载它。

不能重新安装 ros-kinetic-theora-image-transport,因为无法下载它。

不能重新安装 ros-kinetic-visualization-msgs,因为无法下载它。

不能重新安装 python-sip,因为无法下载它。

不能重新安装 ros-kinetic-laser-pipeline,因为无法下载它。

不能重新安装 python-talloc,因为无法下载它。

不能重新安装 libjsoncpp1,因为无法下载它。

不能重新安装 libdbusmenu-qt2,因为无法下载它。

不能重新安装 python-ldb,因为无法下载它。

不能重新安装 libxcb-xkb1,因为无法下载它。

不能重新安装 ros-kinetic-controller-manager,因为无法下载它。

不能重新安装 ros-kinetic-python-orocos-kdl,因为无法下载它。

 

当然这只是一小部分,如果单个重装:sudo apt-get --reinstall install python-ldb 结果也一样,无法下载的原因先不去深究,考虑解决这个问题的逻辑,发现是dpkg没有软件包的信息,那么是不是可以生成一份现在安装的所有软件的信息报放到dpkg的info里,问题是不是就可以得到解决?(还没试,先记下想法——后来证明这种想法似乎并不靠谱,因为在dpkg的所有命令中,没有找到生成软件包列表的命令,如果有同学找到了。可以告诉我一下)

 

在考虑那个问题之前,不能重装的后面又跳了一个错误:

debhelper : 依赖: dh-autoreconf(>= 12~) 但是它将不会被安装

E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

 

这里顺便讲一下解决这种问题的逻辑:什么有问题就装上面,一直装到头;

 sudoapt-get install debhelper 报依赖dh-autoreconf错误,装它

 sudoapt-get install dh-autoreconf,报依赖错误:

 dh-autoreconf : 依赖: autoconf 但无法安装它

                 依赖: automake 但无法安装它 或

                         automaken 但无法安装它

                 依赖: autopoint 但无法安装它

 

装它们

 sudoapt-get install autoconf automake autopoint 结果一样,源里没有,只能通过源码安装了,

第一个先来autoconf吧:

cd

mkdir autoconf

cd autoconf

wget http://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.gz 

 tar -xzvf autoconf-2.65.tar.gz

 cdautoconf-2.65

./configure --prefix=/usr/local

make && sudo make install

 

然后是automake:

cd

mkdir automake

cd automake

wget http://mirrors.kernel.org/gnu/automake/automake-1.11.tar.gz 

 tar xzvf automake-1.11.tar.gz

 cdautomake-1.11

./configure --prefix=/usr/local

make && sudo make install

 

好吧,用这种方法安装之后,dpkg是找不到的,原因不详(应该是用源码安装,dpkg的info里没有办法生成对应的软件包列表的问题),autopoint用deb的包装的,倒是解决了;

autopoint:https://packages.ubuntu.com/xenial/all/autopoint/download

所以automake和autoconf也用deb包装一下:

automake:https://packages.ubuntu.com/xenial/all/autopoint/download

autoconf:https://ubuntu.pkgs.org/16.04/ubuntu-main-amd64/autoconf_2.69-9_all.deb.html

 

这里deb包的安装用sudo dpkg –i [PACKAGENAME.deb]

 

注意这个地方要先装autoconf 再装automake(依赖关系),补装m4,这个源里有,直接apt-get装就行,这个时候再upgrade就没有什么问题了。

 

再用:sudo apt-get --reinstall install `dpkg --get-selections | grep'[[:space:]]install' | cut -f1`

和之前的结果都不一样,看样子所有的程序都进入了重装的正轨。

在waiting了一个小时之后,问题任然存在,但是因为是出现了问题,用

sudo apt-get update 然后 sudoapt-get updte –fix-missing

之后再用:sudo apt-get --reinstall install `dpkg --get-selections | grep'[[:space:]]install' | cut -f1`

发现所有程序进入解包进行,说明上一次没有执行完毕。

等待…….

 

dpkg命令小笔记:

dpkg -i package.deb     #安装包

dpkg -r package         #删除包

dpkg -P package         #删除包(包括配置文件)

dpkg -L package         #列出与该包关联的文件

dpkg -l package         #显示该包的版本

dpkg --unpack package.deb  #解开deb包的内容

dpkg -S keyword            #搜索所属的包内容

dpkg -l                    #列出当前已安装的包

dpkg -c package.deb        #列出deb包的内容

dpkg --configure package   #配置包

 

到了这个地方,从返回的消息来看,找到了出现文章开始内核问题的源头,就是因为dpkg找不到包,使用重装的方法之后,重装和配置了大量的内核,此处需要重复之前的方法将多余的内核删掉,这里验证了用sudo apt-get --reinstall install `dpkg --get-selections | grep'[[:space:]]install' | cut -f1`时解决不通的,重新配置应该才是解决办法,

强制重新配置dpkg软件包的命令是:dpkg-reconfigure –force [PACKAGE] 这里使用sudo重配之后,发现并没有解决问题,因为这个命令并不能在/var/lib/dpkg/info下生成对应的软件包列表,而现在我所知道的范围内,只有重装才能生成软件包的文件列表,所以好像最后就只能重装了,解决方案“sudo apt-get --reinstall install `dpkg --get-selections | grep'[[:space:]]install' | cut -f1`”的原理其实就是重装,但是中间的“dpkg --get-selections”及后面那一串是为了产生要安装的软件名,这里发现的问题是dpkg –get-selection是将所有本地的dpkg软件包重装,而不是找不到软件包列表的文件包,但其实如果是全部丢失,这两个概念是一样的,如果没有全部丢失,那正确的解决办法应该是先复现问题,找到丢失文件列表的软件包名称,因为我的正则表达式用得还不是很好,这里我用的是曲线救国的解决办法:

1.sudo apt-get install minicom -y >log.log(复现问题的方法要看自己的情况)

2.将log.log传到windows下,全部复制到word中,用ctrl+H将重复的字段“dpkg:警告:无法找到软件包”,“的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。”以及换行“^p”都替换为空格,然后再将两个空格替换为一个空格,多执行几次,删掉多于的提示,那就整理出来了一个超级大的软件包列表,我的足足有两千多个,而且并没有全部显示,“(正在读取数据库 ... 系统当前共安装有 288443 个文件和目录。)”,

也就是说,有288443个软件要重装(笑哭),sudo apt-get --reinstall install 重装了下前两页,发现有的可以解决问题,有的还解决不了,会报无法下载的错误,而且吧,照这个方法下去,我可能整个硕士生涯都要费在这上面了,当然了,你可能会问我为什么不干脆重装系统,我的原因是在这台服务器上装的环境太多,OpenFOAM,laminarSMOKE,Cuda,ROS,Invidia显卡驱动等等,重装这些软件,没个一周两周的估计是搞不定,而且遇到问题就重装,这显然不是咱的做事风格,但如果你的系统只是轻量级的,那重装这些软件和重装这个系统其实差别也不大;我的情况,在这个地方又不能重装系统,又不能重装全部软件,那是不是就陷入死胡同了呢?(这个地方如果选择重装全部软件,那估计这辈子是装不完了,下辈子也别想,毕竟每装一批都会报出一些无法预知的错误,夜晚两点,揉眼…….)最后,事实证明,要找到问题的根源才能轻而易举的解决问题,直接讲原因:

在使用

cd /var/lib/dpkg sudo mv infoinfo.bak 吧啦吧啦”这个解决方案时,我在每次操作时都漏掉了一步,就是删掉新建的info,这样用 sudo mv info.bak info我以为这样能覆盖掉原来的文件,但还是too youngtoo simple,这条命令的意思是将info.bak移到了info文件夹里,所以,dpkg过来找的时候,是不会找info下面的子文件夹的,因为我来来回回弄了很多次,所以文件里套文件,将他们全部整理到一个文件夹里,重命名为info,问题解决,这里其实还说明了一点,这种丢失文件包列表的问题,只要确认没有删过,那么多半的文件的地方不对,需要仔细排查。

 

后记:本来这段时间是做机器人的事是很忙的,但是因为这个问题之前就遇到过,但因为不影响使用就暂时搁置了,之前也说过,这个问题现在已经危及到系统的使用,dpkg找不到软件包,所有的链接都被打断,导致了图形界面也不能用,如果不处理,只要重启一次,整个系统就会陷入全面瘫痪的状态,还有一个感受,就系统来说,ubuntu的稳定性确实不够好,虽然更新很快,但这个事也不一定是好事呀,外围的ROSOpenFOAM等跟得应该很辛苦,照这个速度下去,在新系统里能解决问题的人可能会越来越少。而最大的感受是,如果你真的感觉一个问题超级超级难解决,那多半是没有找到问题的根源,人生大概也是如此吧。

 

然后,再总结一下通过这次问题解决学到的命令吧:

sudo apt-get update

sudo apt-get upgrade

两者的区别是一个更新索引,一个更新仓库列表;

sudo apt-get -finstall  修复已经安装软件的依赖;

dpkg --get-selections| grep linux-image 查看已经安装的内核版本

 

dpkg --get-selections 获取本系统的dpkg软件包

其中install是已经安装的,deinstall是没安装,但是有残留的

 

最重要的还是mv,文件拷贝……..

 

 

参考博客:

1. https://blog.csdn.net/wise622453/article/details/7905253

包含了这个问题出现的机理:“其实这里我们可以发现为什么会在安装新的内容时会出现无法找到软件包问题,因为在apt-get install 安装一个新包时先回去检查/var/lib/dpkg/info/目录下的已安装包的配置文件信息;如果发现有已经安装的应用的配置文件信息不在info目录下就会提示这个错误”,但并没有详细说明第二种解决办法的解决机理及来源

2. http://forum.ubuntu.org.cn/viewtopic.php?t=257302

这里博客帖子里有一些思路,可以简单浏览,看看人们都是怎么说这个问题的;

3. http://forum.ubuntu.org.cn/viewtopic.php?t=140396

同上。

4. http://forum.ubuntu.org.cn/viewtopic.php?t=243666

同上,但是在正则表达部分有点新东西。

5. https://blog.csdn.net/weixin_40539892/article/details/80623090

这个好像看起来是转的,但是正则表达式部分讲得多些,注意,遇到这个问题的同仁,这个博客绝对是值得一看的。

 

 

你可能感兴趣的:(Linux,ubuntu16.04,dpkg,hash检验和不符,boot空间不足,dpkg:警告:无法找到软件包,XXX的文件名列表文件)