我想知道为什么upgrade有时不想要升级系统的某些部分,而dist-upgrade却想要。这是运行apt-get upgrade之后的示例:

apt-get upgrade

rimmer@rimmer-Lenovo-IdeaPad-S10-2:~$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.


apt-get dist-upgrade

rimmer@rimmer-Lenovo-IdeaPad-S10-2:~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-3.0.0-13 linux-headers-3.0.0-13-generic
  linux-image-3.0.0-13-generic
The following packages will be upgraded:
  linux-generic linux-headers-generic linux-image-generic
3 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 48.5 MB of archives.
After this operation, 215 MB of additional disk space will be used.
Do you want to continue [Y/n]?


换句话说,为什么upgrade无法执行此操作?

#1 楼

apt-get手册开始:

upgrade
   upgrade is used to install the newest versions of all packages
   currently installed on the system from the sources enumerated in
   /etc/apt/sources.list. Packages currently installed with new
   versions available are retrieved and upgraded; under no
   circumstances are currently installed packages removed, or packages
   not already installed retrieved and installed. New versions of
   currently installed packages that cannot be upgraded without
   changing the install status of another package will be left at
   their current version. An update must be performed first so that
   apt-get knows that new versions of packages are available.

dist-upgrade
   dist-upgrade in addition to performing the function of upgrade,
   also intelligently handles changing dependencies with new versions
   of packages; apt-get has a "smart" conflict resolution system, and
   it will attempt to upgrade the most important packages at the
   expense of less important ones if necessary. So, dist-upgrade
   command may remove some packages. The /etc/apt/sources.list file
   contains a list of locations from which to retrieve desired package
   files. See also apt_preferences(5) for a mechanism for overriding
   the general settings for individual packages.


以及从14.04开始可用的新型apt工具:

full-upgrade
   full-upgrade performs the function of upgrade but may also remove
   installed packages if that is required in order to resolve a
   package conflict.


在您的特定情况,例如,我看到linux-headers是由linux-headers-3.0.0-12linux-headers-3.0.0-13提供的虚拟软件包,听起来像是由dist-upgrade处理的软件包安装和删除,但不是upgrade处理的软件包。

评论


在14.04.1。下,我认为完全升级不是apt-get的选择。

– nobar
15年5月16日在2:34

我也不了解apt,但根据他链接的手册页,这似乎是完全不同的命令

– BlueWizard
2015年10月20日在20:37

@nobar您看不到,因为它是apt的选项,而不是apt-get ...的选项... :-)试试man apt。

–Hastur
2015年10月29日在9:47

好的,我进行了搜索,发现的最早链接是针对Ubuntu 15.10(该版本于2014年底发布,通过Jessie测试是合理的)manpages.ubuntu.com/manpages/wily/en/man8/apt.8.html

–Z玻色子
17年1月24日15:09



@Zboson是的,14.04并不是在2011年问世,而是在2014年4月问世了。

–tgies
17年5月18日在21:25

#2 楼

apt-get upgrade仅限于要用较新版本替换软件包的情况,而无需添加或删除软件包。例如,应该使用apt-get upgrade安装新版本的Firefox。

但是,如果更新版本需要添加或删除,apt-get upgrade将无法工作。例如,当您安装了内核linux-image-3.2.0-10-generic并出现linux-image-3.2.0-11-generic时,linux-image-generic软件包将更新为依赖于较新的版本。为了安装新内核,您需要运行apt-get dist-upgrade

注意apt-get upgrade会说内核软件包是held back。这就是使用apt-get dist-upgrade的提示。

评论


完善! :D还有两个问题... Ubuntu中的图形更新管理器使用了什么?推荐什么?

– THpubs
2012年1月29日在1:46

图形实用程序update-manager不直接使用apt-get;相反,它与称为aptdaemon的后端一起工作。 update-manager的标准功能是apt-get的升级和dist-upgrade模式的组合:它可以添加但不能删除软件包-需要删除时,它将调用“部分升级”工具。使用命令行时,请使用apt-get upgrade。如果您看到它报告软件包已被“保留”,请运行apt-get dist-upgrade来获取其余更新。

– pablomme
2012年1月29日,2:10

#3 楼

基本上,升级只会将现有软件包从一个版本升级到另一个版本。即使升级其他软件包,也不会安装或删除软件包。对于内核更新,升级linux-generic软件包需要安装新的linux-3.0.0-13-generic软件包,并且由于upgrade拒绝安装或删除软件包,因此它拒绝升级linux-generic。

有时,程序包之间的各种不兼容性要求删除某些程序包以升级其他程序包,并且还需要进行dist-upgrade。内核更新由于其处理方式而始终需要dist-upgrade。每次都会创建一个全新的内核包,而不是更新内核包,并且将内核元包更新为依赖于新的内核包而不是旧的内核包。这样做是为了保留旧的内核版本,以防万一启动新内核时出现问题,可以从启动菜单中选择旧内核并进行恢复。

评论


最好的要点。不过,如何保留一定的包装?

– 0xC0000022L
13年15月15日在17:06

#4 楼

apt-get upgrade命令通常只会将更新(或修复)安装到当前安装的软件包。例如,通常会使用此命令安装Mozilla Firefox的新版本。

apt-get upgrade通常不会在需要进行重大更改(包括删除软件包或更新GRUB)的情况下安装新版本。例如,当有新的Linux内核(linux-image-3.xx-xx-generic等)可用时,将不会安装该软件包。

要安装新内核,您将需要运行apt-get dist-upgrade。当您运行apt-get upgrade时,系统会通知您,因为它表示某些软件包已被保留。那是您使用的提示:apt-get dist-upgrade

评论


这是误导。除非对sources.list进行了相应的修改(即使那样,在Ubuntu中也不支持这种升级方式),否则dist-upgrade不会升级到新版本。当使用dist-upgrade安装新内核时,这不是Ubuntu的新版本。这只是一个新包装。此外,“或需要GRUB更新”的声明是错误的。 sudo apt-get upgrade非常有能力在必须更新GRUB的情况下升级软件包,只要不删除任何软件包并安装新软件包即可。与往常一样,update-grub会自动运行。

– Eliah Kagan
13年4月13日在2:11

您应该编写自己的答案,因为这没有使我更加清楚。

– david6
13年4月13日在6:13



除了Eliah提到的内容外,最重要的一点是apt-get升级不会删除或添加软件包。如果某个程序包的修复程序需要一个新程序包,则更新将被保留。您修改了pablomme的答案后,准确性降低了,但效果更好,我建议读者继续阅读。

– Suhan-Ho Suh
13年5月24日在3:19



更正:apt-get upgrade将永远不会安装或删除任何软件包。内核升级被打包为新软件包,因此,apt-get升级将永远不会升级内核。内核升级确实进行了“重大”更改(例如GRUB配置),这一事实并不是导致升级与dist-upgrade之间存在差异的原因。

– Mikko Rantalainen
16-09-19在6:07



#5 楼

最好的选择是:

apt full-upgrade

-在升级软件包时,它会自动处理依赖项;相反:

apt upgrade


-升级软件包时不会自动处理依赖项。

-duBtrotterS