![Ubuntu 升级过程如何进行?](https://linux22.com/image/1104535/Ubuntu%20%E5%8D%87%E7%BA%A7%E8%BF%87%E7%A8%8B%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%EF%BC%9F.png)
在操作系统仍在运行的情况下,Ubuntu 如何无缝升级到较新的发行版?我正在从 10.10 升级到 11.04,并且我之前已经升级过几次,这就像运行 update-manager -d 并下载和安装它们,然后重新启动一样简单。
但是这究竟是如何工作的呢?升级管理器如何在操作系统仍在使用时更新它?
答案1
以下是该过程的更详细描述。抱歉,文字太长了。
我的经验源自 Debian,Ubuntu 中使用的整个打包和升级系统最初都是为 Debian 发明的。Ubuntu 每日安全升级对应于运行,apt-get upgrade
通常不会删除任何软件。大版本升级对应于apt-get dist-upgrade
软件包可以完全交换的升级。
实际上,在版本升级期间通常不会交换非常低级别的组件。升级后,您应该立即在 /boot 目录中找到两个内核和 initrd 映像。这是因为与程序不同,内核组件不能很好地互换。如果在升级过程中需要加载新的设备驱动程序,则这些驱动程序必须与正在运行的内核兼容。系统使用新内核启动后,可以删除旧内核。上次我检查时,这件事必须手动完成,我不知道当前更新程序如何处理。顺便说一句,这就是内核映像在文件名中带有版本号的主要原因 - 这样您就可以同时安装不同的内核版本。模块路径 (/lib/modules/...) 也是如此
软件包会逐个升级,从依赖关系层次结构中最低的软件包开始。这些软件包通常是 libc 等程序库。但是,软件包的更新顺序不是硬编码的,而是在解决软件包依赖关系时动态计算的。在大多数情况下,旧程序可以使用新库运行,因此如果先替换这些库,问题就不大了。
您必须在这里理解,系统区分手动安装的包(即您自己直接请求安装的包,即 chromium)和自动安装的包,后者仅安装以满足手动安装的包的依赖关系(以及这些依赖关系的依赖关系)。
对于每个手动安装的程序,更新程序只会查找较新的版本。通常这些程序只是元包,如“ubuntu-desktop”,它不包含任何数据,只包含依赖项。直接更新(手动请求)的程序会请求新版本的依赖库,因此会将其引入。更新程序将始终尝试安装最新版本可用的任何依赖包的版本(在任何升级期间,而不仅仅是发布升级)。
无法与新库版本配合使用的程序在库升级后以及程序本身升级之前都无法启动。如果这些程序在库升级之前应该已经在运行,那么它们将继续运行,因为旧库版本只要仍在使用,就会保留在内存中。升级前启动的程序也是如此。这些程序只有在终止并重新启动后才会提供新功能。
更新后,一些库(或一般依赖项)将变得孤立。这些库是旧程序版本所需的,但新版本不再需要。由于这些软件包被标记为自动安装,并且由于不再有手动安装的程序与它们相关,因此可以轻松找到并删除这些软件包。您甚至可以将此视为更新过程的最后一步(更新程序说“删除过时的软件包”或类似的东西)。
一些以前没有安装过的软件包将被安装,这些只是新的依赖项,被标记为自动安装,如果将来对它们的需求消失,则可以被删除。
这种机制甚至允许交换整个用户程序。例如从 Gnome2 切换到 Unity。由于两者都只是 ubuntu-desktop 的自动依赖项,而 ubuntu-desktop 是少数几个实际上首先请求新版本的软件包之一。
程序通常不依赖于特定版本的操作系统内核,因此它们通常可以与正在运行的内核一起正常工作。
除此之外,我怀疑Ubuntu 更新程序加入了一些特定的修复和解决方法,以避免该理论被打破的情况。
正如您所看到的,在更新过程中,系统在某些情况下只能在有限的部分使用。如果在更新过程中出现问题,您将要最有可能留下一个损坏的系统。通常甚至无法轻易修复,因为升级程序也会受到影响。请记住,只要依赖关系被破坏,依赖关系被破坏的程序可以继续运行,但不能重新启动,更新程序也是如此。
您可以使用命令行程序apt-mark
来找出哪些软件包被标记为手动安装,哪些软件包已被自动安装。您还可以使用同一程序切换这些标记。这将直接影响更新过程。
在更复杂的软件设置中,更新程序有时会要求您手动解决依赖关系。例如,当一个手动安装的程序更新并请求库的新版本时,而另一个手动安装的程序依赖于同一库的旧版本并且无法与新版本一起使用。然后您必须做出选择,要么放弃其中一个程序,要么避免同时升级两者。由于依赖关系通常很复杂,这可能会很快变得非常混乱(您可能听说过“依赖地狱”一词)。
现在来谈谈具体问题:
- 当低级基础设施发生变化时(低级如内核、驱动程序、库等用户不直接交互的任何内容),弃用的二进制文件会发生什么?
- 好的...我已经讲过了
- 已完全弃用的应用程序会怎样?例如,Unity 2D(或任何其他已弃用/无人维护的软件,其软件包不在新存储库中)。
- 如果应用程序曾经手动安装,它将保留在系统中,经常导致我所描述的依赖地狱。
- ubuntu-desktop 是一个元软件包,它将默认的 Ubuntu 应用程序作为依赖项拉入。如果我删除了 Firefox 并安装了 Chrome,Firefox 是否仍会在升级过程中被拉入?
- 只要它是新版本的标准浏览器,是的。Chromium 也将升级。我不确定您是否可以在不删除 ubuntu-desktop 的情况下删除 Firefox。请注意,除了严格的依赖关系外,软件包系统还知道推荐的概念,其中软件通常会像依赖项一样安装,但可以在以后卸载而不会影响任何其他内容,只会影响其自己的唯一依赖项。
- 此外,如果单个应用程序曾经依赖于 package-x,而在新版本中不再依赖它,会发生什么情况?尽管 package-x 已变为孤立包,但它是否会与其余包一起升级?
- 没有。
如果您还有其他问题,请直接询问我。
答案2
根据我的经验,我认为程序包和模块在运行时会保留在内存中,并且不会经常引用硬盘上的副本。如果您在 ubuntu 中运行程序,然后在其运行时删除相关程序包,就会看到这一点。它会继续运行,但如果您关闭它,则无法重新启动它。
我认为发行版升级也会发生同样的情况。所有与 ubuntu 原始版本相关的软件包仍在运行,即使它们已被删除并替换为新软件包,因此当它们最终在系统重启时停止时,新软件包将接管。
答案3
在文件系统级别,与 Windows 不同,在 Unix 系统上,您可以删除打开的文件。删除操作只会删除文件的名称,而不会删除其内容,因此任何仍打开该文件的程序仍可访问该文件,直到它们关闭该文件,然后数据才会被释放。
因此,升级过程只是删除旧文件,用新文件替换它们,并且对于某些系统服务,重新启动它们以便新版本运行。
有一个或两个组件如果不重新启动整个计算机就无法重新启动,因此升级这些组件后,系统会提示您重新启动,以便您使用新版本。
答案4
这与另一个功能类似。希望这有助于理解基本流程。
我指的是操作系统启动时“切换根”的功能。
当操作系统启动时,根文件系统(读作:“/”)最初仅在 RAM 中可用。在此启动过程运行时,它会将 / 从 RAM 切换到硬盘上的 / 文件系统。