从 10.04 升级到 12.04 后,我尝试安装不同的软件包。例如 ia32-libs 和 Skype (4.0)。
尝试安装这些时,我收到“无法纠正问题,您保存了损坏的软件包”错误消息。
命令的输出:
sudo apt-get install -f
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Run Code Online (Sandbox Code Playgroud)
运行后:
sudo dpkg --configure -a
foo@foo:~$ sudo apt-get install -f
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Run Code Online (Sandbox Code Playgroud)
tho*_*ter 327
该特定错误消息可能表明您持有包裹,但也可能表明存在不同的问题。
您可以通过以下方式获取实际持有的包裹列表:
dpkg --get-selections | grep hold
Run Code Online (Sandbox Code Playgroud)
如果没有,或者看起来都不相关,那么它可能是别的东西。当您收到错误消息时,仔细检查您正在尝试的命令的输出,因为除了错误消息之外,该命令的完整输出中可能还有其他线索。
另一种故障排除方法可能是使用 aptitude 而不是 apt-get 来尝试安装您的软件包:
sudo aptitude install <packagename>
Run Code Online (Sandbox Code Playgroud)
Aptitude 不会轻易放弃,并且会尝试寻找可能涉及修改其他软件包的解决方案。它可能会给你更多关于问题的解释和修复它的选项。
有时 aptitude 会急于删除或降级大量软件包以满足您的要求,在这种情况下,重试-f更改其优先级并帮助它提出涉及删除/降级较少软件包的解决方案,即使这意味着并非您要求的所有更改可以继续:
sudo aptitude -f install <packagename>
Run Code Online (Sandbox Code Playgroud)
编辑:这是一个旧答案,因为它是一个较新的 APT 前端,简称为apt,已成为最终用户首选的命令行 APT 界面。它仍然不是瑞士军刀aptitude,但它比apt-get. 我没有花时间研究它在上述场景中的作用,但值得使用。
小智 43
这也发生在我身上。我所做的就是sudo apt-get update解决了我的问题。祝你好运。
Sta*_*eck 36
我在 14.04 的全新安装中遇到了类似的情况,dpkg --get-selections | grep hold在sudo apt-get update.
什么做修复这对我来说是一个简单的
sudo apt-get autoremove
Run Code Online (Sandbox Code Playgroud)
当我尝试重新安装失败的软件包时,它运行良好。好极了!
kar*_*rel 20
这些是修复you have held broken packages错误的一些快速简便的方法。
打开您的sources.list 文件/etc/apt/sources.list并检查是否有任何软件源用于与您当前使用的Ubuntu 版本不同的Ubuntu 版本。如果在sources.list 中发现任何不正确的发布行,请打开sources.list 文件sudoedit /etc/apt/sources.list,在sources.list 中添加一个#字符注释掉不正确的行,保存sources.list 文件,然后运行sudo apt update更新列表可用的软件包。
在 Synaptic 包管理器中选择修复损坏的包选项。运行以下命令来安装 Synaptic。
sudo apt update
sudo apt upgrade
sudo apt install synaptic
Run Code Online (Sandbox Code Playgroud)
打开 Synaptic 并在 Synaptic 中选择Edit -> Fix Broken Packages,然后再次重复Edit -> Fix Broken Packages。
在左侧窗格的 Synaptic 中,单击下方屏幕截图中鼠标光标标记的自定义过滤器按钮。从左上角的列表中选择Broken。在中心窗格中将列出仍然需要修复的任何损坏的包。
一次选择一个破损的包裹。选择一个损坏的包,然后打开终端并运行。此命令的结果将告诉您该损坏的软件包是从默认的 Ubuntu 存储库还是从其他来源安装的。如果损坏的软件包是从其他来源安装的,也许该软件包可以与其软件源一起删除,并替换为默认 Ubuntu 存储库中相同软件包的不同版本。通常这意味着通过将软件包降级到旧版本来修复损坏的软件包。apt policy <package-name>
如果您收到此错误消息:
Try 'apt-get -f install' with no packages (or specify a solution)
Run Code Online (Sandbox Code Playgroud)
运行以下命令:
sudo apt update
sudo apt upgrade
sudo apt-get -f install
Run Code Online (Sandbox Code Playgroud)手动移除损坏的包。
找到您的包裹 /var/lib/dpkg/info
ls -l /var/lib/dpkg/info | grep <package>
Run Code Online (Sandbox Code Playgroud)将包文件夹移动到另一个位置。
cd /tmp && sudo mkdir new-package-location
sudo mv /var/lib/dpkg/info/<package>.* /tmp/new-package-location/
Run Code Online (Sandbox Code Playgroud)运行以下命令:
sudo dpkg --remove --force-remove-reinstreq <package>
Run Code Online (Sandbox Code Playgroud)如果所有这些方法都不起作用,则损坏的软件包可能是由深深嵌入操作系统中的某些东西引起的,以至于这些方法都不会对其产生任何影响。寻找这种深层嵌入的“东西”的第一个明显位置是/etc/apt/sources.list. 检查sources.list 文件以查看它是否包含任何可能导致损坏包错误的非标准行。一个标准的 Ubuntu sources.list 文件看起来像这个答案中的 sources.list 文件。
从 sources.list 中删除可疑行的正确方法是通过在它前面加上一个#字符来注释掉它。然后运行sudo apt update以刷新可用软件列表。
小智 13
我遇到了关于缺少依赖项的类似情况。就我而言,我试图在 ubuntu saucy salamander 13.10 上安装 curl ...
该错误指出依赖项需要较早版本的 curl3 库。
通过尝试使用 aptitude 安装 curl,我能够降级到早期版本。
当它注意到了丢失的依赖,而原因(所需要的库文件的早期版本),它给了我几个选项中如何应对?y// n/q
Y会中止安装,N会寻找另一个选项,并且Q会简单地退出并且什么也不做,留下一个损坏的包。
我选择了N,它让我可以选择将库文件降级到早期版本。这就是我所做的,curl 完成安装,没有更多错误。
小智 7
遇到了同样的问题,我从另一个答案 ( dpkg --get-selections | grep hold)运行了那个包检查命令并看到
tomcat7 deinstall
tomcat7-common install
Run Code Online (Sandbox Code Playgroud)
所以我用了“ apt-get remove tomcat7-common”
然后我可以安装 Tomcat 6(我正在删除 Tomcat 7 并像你一样安装 Tomcat 6)。
我已经尝试了本页提到的所有方法。不知何故,它对我不起作用。
我是这样修复它的:跟踪损坏的包并重新安装它。
下面是一个例子:
我正在尝试安装aptitude.
sudo apt 安装能力
它无法安装 libcwidget3v5
sudo apt 安装 libcwidget3v5
尝试安装 libncursesw5
sudo apt 安装 libncursesw5
尝试安装 libtinfo5
sudo apt 安装 libtinfo5
宾果游戏,这家伙是罪魁祸首libtinfo5,它已经存在,删除并重新安装。
删除或清除libtinfo5。
apt purge libtinof5 会更好,因为它也删除了配置文件。
sudo apt 删除 libtinfo5
重新安装libtinfo5一次
sudo apt 安装 libtinfo5
现在尝试安装 aptitude
sudo apt 安装能力
该错误消息具有误导性。
它说“您持有包裹”,但通常您不会持有包裹:
$ apt-mark showhold
Run Code Online (Sandbox Code Playgroud)
不会打印任何内容。
实际发生的情况是,在运行依赖性分析时,包由其apt自身保存。例如,您可以看到如下输出:
$ apt-get install gcc:i386
<...skip...>
The following packages have unmet dependencies:
gcc:i386 : Depends: cpp:i386 (= 4:9.3.0-1ubuntu2) but it is not going to be installed
Depends: gcc-9:i386 (>= 9.3.0-3~) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
Run Code Online (Sandbox Code Playgroud)
显然这不是很有帮助......
因此,要进一步调试,请apt使用标志运行-o Debug::pkgProblemResolver=yes
$ apt-get -o Debug::pkgProblemResolver=yes install gcc:i386
Run Code Online (Sandbox Code Playgroud)
现在会打印一堆像这样的行
$ apt-mark showhold
Run Code Online (Sandbox Code Playgroud)
底线是gcc:i386不能与gcc:amd64. 真的只能apt说这么多了。
让我们通过一个例子来理解这个错误:
假设这是错误消息:
The following packages have unmet dependencies:
nginx-module-brotli : Depends: nginx (= 1.17.3-2-ppa7~bionic)
E: Unable to correct problems, you have held broken packages.
Run Code Online (Sandbox Code Playgroud)
让我们将其分解为变量:
X=nginx-module-brotli
Y=nginx
Z=1.17.3-2-ppa7~bionic
Run Code Online (Sandbox Code Playgroud)
这X是您尝试安装的软件包。Y是导致依赖性问题的包(可能有多个Y),并且Z是所需的版本。
所以总结一下:
XY需要具有该版本的包Z才能工作。
然而,在apt寻找Z.Y
因此,让我们检查一下Z该包的版本是否可用Y。我们可以用来apt-cache policy <package_name>查找包的可用版本。例如:
$ apt-cache policy nginx
libasound2:
Installed: nginx_1.20.2-1~bionic
Candidate: 1.2.2-2.1ubuntu2
Version table:
*** nginx_1.20.2-1~bionic 100
100 /var/lib/dpkg/status
1.17.3-2-ppa7~bionic 500
500 http://br.archive.ubuntu.com/ubuntu focal/main amd64 Packages
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到该软件包nginx有两个版本可用。所需的版本X是Z. 根据版本表,Z该包的版本Y可用。但apt始终安装最新版本。所以有两种方法可以解决这个问题:
apt。要安装正确的软件包版本,请使用:
sudo apt update
sudo apt install <Y>=<Z>
Run Code Online (Sandbox Code Playgroud)
造成依赖问题的包在哪里?X需要的版本是多少。现在,安装应该成功了。
要提高包管理器的能力:
sudo apt update
sudo apt install aptitude
sudo aptitude -f install <Z>
Run Code Online (Sandbox Code Playgroud)
您尝试安装的软件包在哪里。一些关于 aptitude 的有用提示:
-f选项将进行高级故障排除。非常有用!
选择n解决方案将使 aptitude 提出更多解决方案!
运行man aptitude会显示 aptitude 的详细使用手册。在线手册。
首先,尝试运行sudo apt update来更新存储库列表。然后尝试再次安装该软件包。
仍然不可用?
您有两个选择:
在https://packages.ubuntu.com/中搜索包并恢复默认存储库。
添加自定义 PPA 以满足依赖关系。
搜索包并恢复默认存储库:-
向下滚动到搜索部分。
在“关键字”列中,输入包的名称。
在“发行版”列中,选择您的 Ubuntu 版本的代号 ( lsb_release -c)。
检查所需版本和可用版本是否匹配。如果是,请参阅如何恢复默认存储库?
添加自定义 PPA。
为此,您必须寻求 Google 的帮助。只需在 google 上搜索软件包和版本,希望您能找到 PPA。
sudo apt -f install <package>强制安装包。sudo aptitude -f install <package>强制安装包。sudo add-apt-repository whatever/ppa添加 PPA。sudo apt purge <package>删除一个包。信息例如:
lsb_release -d.sudo apt install <package>apt policy <package>和的输出apt policy <package's dependency>其他详细信息应在询问时提供。
| 归档时间: |
|
| 查看次数: |
1025184 次 |
| 最近记录: |