解决apt-get install不能安装软件问题

前几天在删除一个软件的的时候使用 apt-get autoremove,结果把所有依赖的软件都卸载了,而且导致很多库文件出了问题,不能再安装任何软件。
后来在网上查了一下,
autoremove – 卸载所有自动安装且不再使用的软件包
例如:C 依赖于 B, D 依赖于B, 且D没有被其他手动安装的包依赖,apt-get autoremove C 将删除B, C, D。其实很多时候我们并不想删除B,D。所以一定慎用autoremove.
经过这次删除后,导致后面任何软件都无法安装了。然后仔细研究了一下ubuntu的安装软件原理。这里讲一下如何在出现上面情况的时候恢复。

当误删后再安装软件,可能会出现下面情况

me@-ThinkPad-T470p:/etc/apt$ sudo apt-get install libproj-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 curl : Depends: libcurl3-gnutls (= 7.47.0-1ubuntu2.18) but 7.47.0-1ubuntu2.16 is to be installed
 krb5-multidev : Depends: libkrb5-3 (= 1.13.2+dfsg-5ubuntu2.2) but 1.13.2+dfsg-5ubuntu2.1 is to be installed
                 Depends: libk5crypto3 (= 1.13.2+dfsg-5ubuntu2.2) but 1.13.2+dfsg-5ubuntu2.1 is to be installed
 libgssapi-krb5-2 : Depends: libkrb5-3 (= 1.13.2+dfsg-5ubuntu2.2) but 1.13.2+dfsg-5ubuntu2.1 is to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

如果依赖的库不是比较关键的话,根据提示最简单的情况是,使用命令 -f 强制更新一下安装包

sudo apt-get -f install

如果能仍然不能恢复,出现像下面我遇到的情况,就比较麻烦了。
当执行apt-get -f install 时候仍然有错误,

me@-ThinkPad-T470p:/etc/apt$ sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following packages were automatically installed and are no longer required:
  gir1.2-nautilus-3.0 python-dulwich python-fastimport python-nautilus python-svn
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libcurl3-gnutls libk5crypto3 libkrb5-3 libkrb5support0
Suggested packages:
  krb5-doc krb5-user
The following packages will be upgraded:
  libcurl3-gnutls libk5crypto3 libkrb5-3 libkrb5support0
4 upgraded, 0 newly installed, 0 to remove and 197 not upgraded.
101 not fully installed or removed.
Need to get 0 B/569 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
(Reading database ... 390968 files and directories currently installed.)
Preparing to unpack .../libkrb5-3_1.13.2+dfsg-5ubuntu2.2_amd64.deb ...
Unpacking libkrb5-3:amd64 (1.13.2+dfsg-5ubuntu2.2) over (1.13.2+dfsg-5ubuntu2.1) ...
dpkg: error processing archive /var/cache/apt/archives/libkrb5-3_1.13.2+dfsg-5ubuntu2.2_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/x86_64-linux-gnu/libkrb5.so.3', which is also in package avostools 1.0.1.2
Preparing to unpack .../libkrb5support0_1.13.2+dfsg-5ubuntu2.2_amd64.deb ...
Unpacking libkrb5support0:amd64 (1.13.2+dfsg-5ubuntu2.2) over (1.13.2+dfsg-5ubuntu2.1) ...
dpkg: error processing archive /var/cache/apt/archives/libkrb5support0_1.13.2+dfsg-5ubuntu2.2_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/x86_64-linux-gnu/libkrb5support.so.0', which is also in package avostools 1.0.1.2
Preparing to unpack .../libk5crypto3_1.13.2+dfsg-5ubuntu2.2_amd64.deb ...
Unpacking libk5crypto3:amd64 (1.13.2+dfsg-5ubuntu2.2) over (1.13.2+dfsg-5ubuntu2.1) ...
dpkg: error processing archive /var/cache/apt/archives/libk5crypto3_1.13.2+dfsg-5ubuntu2.2_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/x86_64-linux-gnu/libk5crypto.so.3', which is also in package avostools 1.0.1.2
Preparing to unpack .../libcurl3-gnutls_7.47.0-1ubuntu2.18_amd64.deb ...
Unpacking libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.18) over (7.47.0-1ubuntu2.16) ...
dpkg: error processing archive /var/cache/apt/archives/libcurl3-gnutls_7.47.0-1ubuntu2.18_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4', which is also in package avostools 1.0.1.2
No apport report written because MaxReports is reached already
                                                              Processing triggers for libc-bin (2.23-0ubuntu11.2) ...
/sbin/ldconfig.real: /usr/lib/x86_64-linux-gnu/libwind.so.0 is not a symbolic link
....
/sbin/ldconfig.real: /usr/lib/x86_64-linux-gnu/libasn1.so.8 is not a symbolic link
Errors were encountered while processing:
 /var/cache/apt/archives/libkrb5-3_1.13.2+dfsg-5ubuntu2.2_amd64.deb
 /var/cache/apt/archives/libkrb5support0_1.13.2+dfsg-5ubuntu2.2_amd64.deb
 /var/cache/apt/archives/libk5crypto3_1.13.2+dfsg-5ubuntu2.2_amd64.deb
 /var/cache/apt/archives/libcurl3-gnutls_7.47.0-1ubuntu2.18_amd64.deb

像我遇到的这个现象,有两个问题,一个是依赖的库又与其他安装的软件的库版本不一样,导致安装不成功,另一个是当时在卸载时候导致一些动态库连接出了问题。
首先解决连接库的问题/sbin/ldconfig.real: /usr/lib/x86_64-linux-gnu/libwind.so.0 is not a symbolic link, 以libwind.so为例。
ls看一下会发现同名但是版本不同的两个库文件,而且大小一致,如果使用diff libwind.so.0 libwind.so.0.0.0看一下的话,会发现两个文件一致没有区别
,这样的话就可以做强制连接库执行ln -sf 将libwind.so.0强制做成链接文件,就能解决提示的错误。这一步只能一个个手动重新建立链接,避免系统里有多个版本,弄错了链接。

me@-ThinkPad-T470p:/usr/lib/x86_64-linux-gnu$ ls -lh | grep libwind
-rw-r--r--  1 idriver idriver  163K 8月  20 08:21 libwind.so.0
-rw-r--r--  1 root    root     163K 7月  14  2017 libwind.so.0.0.0
me@-ThinkPad-T470p:/usr/lib/x86_64-linux-gnu$ sudo ln -sf libwind.so.0.0.0 libwind.so.0

当解决完链接问题后,就可以再执行

sudo apt-get -f install

到这里如果成功,文件解决,如果像我遇到的情况还有另一个问题需要解决,安装的软件冲突问题。

Errors were encountered while processing:
 /var/cache/apt/archives/libkrb5-3_1.13.2+dfsg-5ubuntu2.2_amd64.deb
 /var/cache/apt/archives/libkrb5support0_1.13.2+dfsg-5ubuntu2.2_amd64.deb
 /var/cache/apt/archives/libk5crypto3_1.13.2+dfsg-5ubuntu2.2_amd64.deb
 /var/cache/apt/archives/libcurl3-gnutls_7.47.0-1ubuntu2.18_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

这介个通过手动安装一下,

me@-ThinkPad-T470p:/usr/lib/x86_64-linux-gnu$ sudo dpkg -i --force-overwrite /var/cache/apt/archives/libkrb5-3_1.13.2+dfsg-5ubuntu2.2_amd64.deb
(Reading database ... 390968 files and directories currently installed.)
Preparing to unpack .../libkrb5-3_1.13.2+dfsg-5ubuntu2.2_amd64.deb ...
Unpacking libkrb5-3:amd64 (1.13.2+dfsg-5ubuntu2.2) over (1.13.2+dfsg-5ubuntu2.1) ...
dpkg: warning: overriding problem because --force enabled:
dpkg: warning: trying to overwrite '/usr/lib/x86_64-linux-gnu/libkrb5.so.3', which is also in package avostools 1.0.1.2
dpkg: dependency problems prevent configuration of libkrb5-3:amd64:
 libkrb5-3:amd64 depends on libkrb5support0 (= 1.13.2+dfsg-5ubuntu2.2); however:
  Version of libkrb5support0:amd64 on system is 1.13.2+dfsg-5ubuntu2.1.

dpkg: error processing package libkrb5-3:amd64 (--install):
 dependency problems - leaving unconfigured
Processing triggers for libc-bin (2.23-0ubuntu11.2) ...
Errors were encountered while processing:
 libkrb5-3:amd64

不过使用dpkg安装软件包的时候,又遇到了一个问题,依赖的库版本不同,
使用dpkg -l 可以查看当前已经安装的版本

me@-ThinkPad-T470p:/var/cache/apt/archives$ dpkg -l libkrb5support0
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                    Version                  Architecture             Description
+++-=======================================-========================-========================-====================================================================================
ii  libkrb5support0:amd64                   1.13.2+dfsg-5ubuntu2.1   amd64                    MIT Kerberos runtime libraries - Support library

这个时候会发现已经安装的版本和期望安装的版本不一致,这只能把已经安装的版本卸载掉,再安装期望的版本。首先是卸载,执行下面命令。

me@-ThinkPad-T470p:/var/cache/apt/archives$ sudo dpkg --force-all -P libkrb5support0
dpkg: libkrb5support0:amd64: dependency problems, but removing anyway as you requested:
 libkrb5-3:amd64 depends on libkrb5support0 (= 1.13.2+dfsg-5ubuntu2.2).
 libkdb5-8:amd64 depends on libkrb5support0 (>= 1.13~alpha1+dfsg); however:
  Package libkrb5support0:amd64 is to be removed.
 libgssapi-krb5-2:amd64 depends on libkrb5support0 (>= 1.13~alpha1+dfsg); however:
  Package libkrb5support0:amd64 is to be removed.
 libkadm5clnt-mit9:amd64 depends on libkrb5support0 (>= 1.13~alpha1+dfsg); however:
  Package libkrb5support0:amd64 is to be removed.
 libkadm5srv-mit9:amd64 depends on libkrb5support0 (>= 1.13~alpha1+dfsg); however:
  Package libkrb5support0:amd64 is to be removed.
 libk5crypto3:amd64 depends on libkrb5support0 (>= 1.13~alpha1+dfsg).

(Reading database ... 390967 files and directories currently installed.)
Removing libkrb5support0:amd64 (1.13.2+dfsg-5ubuntu2.1) ...
Processing triggers for libc-bin (2.23-0ubuntu11.2) ...

以此把错误的几个版本库都卸载掉。
都卸载完后,再尝试安装软件,但是仍然安装失败了,
提示了这样的错误

dpkg: error processing archive /var/cache/apt/archives/libkrb5support0_1.13.2+dfsg-5ubuntu2.2_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/x86_64-linux-gnu/libkrb5support.so.0', which is also in package avostools 1.0.1.2

这就很奇怪了,然后用find找了一下avostools这个包,看一下到底是什么程序。这个时候想起来这个软件是以前同事自己写的安装包,在我电脑试的,谁能想到这么坑,然后接下来就是把这个软件删除了,然后再find 发现在/var/lib/dpkg/info/下有这个软件安装信息。

me@-ThinkPad-T470p:/var/cache/apt/archives$ sudo find / -name "*avos*"
/var/lib/dpkg/info/avostools.md5sums
/var/lib/dpkg/info/avostools.list
/var/lib/dpkg/info/avostools.postinst

其实这个就涉及到了unbutu安装程序的原理了,apt-get 最终也是调用的dpkg进行的安装,为什么每次apt-get -f install 能更新软件,就是因为/var/lib/dpkg下面的信息,每次安装软件会在这个目录下的status文件中增加安装的软件信息,然后info目录下创建同名的***.mdtsums,***.list, ***.postinst文件。就是靠这些信息,进行软件安装和更新的。
既然知道了这些,并且知道这个软件没有用户,果断的删掉这些信息。/info下的这三个文件删除掉。status文件里找到同名的几行信息。删除掉即可。
至此,所有有冲突的版本问题都解决了。
然后在执行

sudo apt-get -f install

所有软件能够正常更新了。
然后在安装希望安装的软件就可以了。

你可能感兴趣的:(ubuntu,linux)