关于解决Ubuntu下apt-get的Unmet dependencies依赖错误

产生原因

准确的产生原因已经不太清楚了,可能是因为我在运行apt-get --reinstall install的时候中断了,导致依赖版本不正确的问题。

问题描述

运行apt-get install upgrade remove或 reinstall时均会出现问题,提示如下:

The following packages have unmet dependencies:
 libpam-systemd : Depends: systemd (= 229-4ubuntu21.2) but 229-4ubuntu21 is to be installed
 systemd : Depends: libsystemd0 (= 229-4ubuntu21) but 229-4ubuntu21.2 is to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

提示的意思是libpam-systemd依赖systemd (= 229-4ubuntu21.2)版本,但即将安装的是229-4ubuntu21版本。
systemd依赖的是libsystemd0 (= 229-4ubuntu21)而即将安装的是229-4ubuntu21.2

解决办法

1.查看libsystemd0版本

运行:
dpkg -l libsystemd0>dpkg.result
并查看dpkg.result的内容,发现libsystemd0目前的版本已经是229-4ubuntu21.2,于是把它卸载,且安装依赖的版本229-4ubuntu21

2.删除libsystemd0

sudo dpkg -P libsystemd0

3.下载并安装依赖的libsystemd0 版本

由于apt-get已无法使用,需要自行下载deb包,并使用dpkg来安装。在Launchpad中可搜索到历史的ubuntu包,而在Packages ubuntu中无法搜到,请使用Launchpad。
在Launchpad搜索到libsystemd0229-4ubuntu21版本的二进制安装文件后,复制下载链接,并在终端运行
wget http://launchpadlibrarian.net/343223052/libsystemd0_229-4ubuntu21_amd64.deb

来下载包的安装文件,其中wget后面跟的是下载链接。
下载好后安装该包
sudo dpkg -i libsystemd0_229-4ubuntu21_amd64.deb

其中-i后面的是该软件安装包的名字。

4.解决systemd安装不成功的问题

可先直接跳到第五步来安装systemd,如发现有这里提到的错误,再回来这里处理。在安装systemd时,发现提示错误:subprocess paste was killed by signal (Broken pipe)

dpkg: error processing archive /var/cache/apt/archives/systemd_229-4ubuntu21.2_amd64.deb (--unpack):
 trying to overwrite '/lib/systemd/systemd', which is also in package systemd-sysv 229-4ubuntu21
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)

这是由于systemd-sysv程序的影响,导致无法安装成功,此时需要把systemd-sysv删掉后,再来安装systemd,由于有其他软件依赖systemd-sysv,导致无法删除,可使用忽略依赖的选项--force-all来删除。运行:
sudo dpkg --force-all -P systemd-sysv

5.下载并安装依赖的systemd 版本

Lauchpad上搜索对应的systemd软件包版本,并下载安装。
wget http://launchpadlibrarian.net/360034029/systemd_229-4ubuntu21.2_amd64.deb

sudo dpkg -i systemd_229-4ubuntu21.2_amd64.deb

最后安装systemd
sudo dpkg --force-all -i systemd_229-4ubuntu21.2_amd64.deb
接着可顺利使用apt-get -f install来修复依赖关系。最后运行update和upgrade命令即可。

sudo apt-get -f install
sudo apt-get update
sudo apt-get upgrade

sudo apt-get -f install运行完过后,可通过sudo apt-get install systemd-sysv来安装重新systemd-sysv,我这里是在sudo apt-get upgrade之后发现systemd-sysv已经安装上了。建议通过dpkg -l systemd-sysv来查看systemd-sysv是否安装,以避免系统出问题。
在upgrade的过程中,mysql会让我们选择配置,直接选择“ok”,使用默认配置即可。而我使用的AWS系统的升级,也会让我选择是使用软件包的配置还是使用机子本地(原来)的配置,我是选择使用软件包的配置的。

感悟

在解决这个问题的过程中,在很多论坛,问了很多人,都说在运行apt-get update后一定要运行apt-get upgrade,不然就会出现我这种错误,但是根据我的分析,既然apt-get update只是更新软件库数据,并不执行安装软件的操作,那应该不会出现我这种“依赖错误”的问题。我的问题应该是在安装软件的时候,突然中止,导致版本依赖错误,或者使用忽略依赖的方法来强制安装软件包而导致的。
并没有人能给出解决方法,还是建议我重装。但是通过摸索后发现,解决办法并不复杂,比重装方便多了。希望大家遇到问题不要冲动,能找到解决问题的方法。

经过这次的努力,学到了以下指示:

  1. dpkg可用于安装软件包,且可通过--force-all选项来忽略依赖,从而强制删除某个软件,但建议除非像本文中一样,你了解系统需要什么版本的软件包,不然不要用这个选项。
  2. Linux中的程序是运行在内存中的,就算是系统程序,也可以在它运行时将其卸载并重装,但在重启前,务必要把系统程序恢复正常,不然会出现系统无法运行的情况。
  3. 在用apt-get时出现错误,要往前寻找,寻找到出现错误的原因,不能光看最后的Errors were encountered while processing:,没有用。

你可能感兴趣的:(服务器搭建与维护,Linux服务器)