产生原因
准确的产生原因已经不太清楚了,可能是因为我在运行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搜索到libsystemd0
的229-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
只是更新软件库数据,并不执行安装软件的操作,那应该不会出现我这种“依赖错误”的问题。我的问题应该是在安装软件的时候,突然中止,导致版本依赖错误,或者使用忽略依赖的方法来强制安装软件包而导致的。
并没有人能给出解决方法,还是建议我重装。但是通过摸索后发现,解决办法并不复杂,比重装方便多了。希望大家遇到问题不要冲动,能找到解决问题的方法。
经过这次的努力,学到了以下指示:
- dpkg可用于安装软件包,且可通过
--force-all
选项来忽略依赖,从而强制删除某个软件,但建议除非像本文中一样,你了解系统需要什么版本的软件包,不然不要用这个选项。 - Linux中的程序是运行在内存中的,就算是系统程序,也可以在它运行时将其卸载并重装,但在重启前,务必要把系统程序恢复正常,不然会出现系统无法运行的情况。
- 在用
apt-get
时出现错误,要往前寻找,寻找到出现错误的原因,不能光看最后的Errors were encountered while processing:
,没有用。