Ubuntu升级过程如何工作?

在操作系统仍在运行的情况下,Ubuntu如何无缝升级到更新的发行版? 我正在从10.10升级到11.04,之前我已经升级了几次,就像运行update-manager -d并下载和安装它们然后重新启动一样简单。

这究竟是如何工作的? 升级管理器如何在仍在使用时更新操作系统?

根据我的经验,我会假设当包和模块运行时,它们被保存在内存中,并且不会在硬盘驱动器上反复回复它们的副本。 如果你在ubuntu中运行一个程序,然后在运行时删除相关的包,你可以看到这个。 它会继续运行,但如果你关闭它,你就无法重启它。

我认为分发升级会发生同样的情况。 所有与原始版本的ubuntu相关的软件包仍在运行,即使它们已被删除并替换为新版本,因此当它们最终在系统重启时停止时,新软件包将接管。

这里有一个更详细的过程描述。 对不起,文字太长了。

我的经验源于Debian,Ubuntu中使用的整个打包和升级系统最初是为此而发明的。 每日Ubuntu安全升级对应于运行apt-get upgrade ,通常不会删除任何软件。 大版本升级对应于apt-get dist-upgrade在此期间可以完全交换软件包。

实际上,在发布升级期间通常不会交换非常低级别的组件。 升级后,您应立即在/ boot目录中找到两个内核和initrd映像。 这是因为与程序不同,内核组件不能很好地互换。 如果需要在升级期间加载新设备驱动程序,则必须与正在运行的内核兼容。 系统启动后使用新内核,可以删除旧内核。 上次我检查这个事情必须手动完成,我不知道当前更新程序如何处理这个问题。 这是BTW。 主要原因是,为什么内核映像在文件名中包含其版本号 – 因此您可以同时安装不同的内核版本。 模块路径相同(/ lib / modules / …)

软件包逐个升级,从依赖项hirarchy中的最低包开始。 这些通常是程序库,如libc和其他程序库。 但是,更新包的顺序不是硬编码的,而是在解析包依赖性时动态计算。 在大多数情况下,旧程序可以在新库中运行,因此如果首先替换这些库,则不会出现问题。

你必须在这里理解,系统区分手动安装的软件包(即你自己直接请求的软件包,即chrome)和自动安装的软件包,只安装这些软件包以满足手动安装的软件包的依赖关系(以及这些依赖项的依赖关系) )。

对于每个手动安装的程序,更新程序只查找更新的版本。 通常这些程序只是像“ubuntu-desktop”这样的元数据包,它不包含数据,只包含依赖项。 将引入新版本的从属库,因为它们是由直接更新(手动请求)的程序请求的。 更新程序将始终尝试安装任何依赖包的最新可用版本(在任何upgrdade期间,而不仅仅是发布升级)。

在升级库之后以及程序本身升级之前,无法启动无法使用新库版本的程序。 如果这些程序在库升级之前已经运行,则它们将继续运行,因为旧的库版本只要仍在使用中就会保留在内存中。 在升级之前启动的程序也是如此。 在终止并重新启动之前,这些function不会提供新function。

更新后,一些库(或一般的依赖项)将被孤立。 这些是旧程序版本所需的库,但新版本不再需要这些库。 由于这些包被标记为自动安装,并且由于没有手动安装的prgram与它们相关,因此可以容易地定位和移除这些包。 您甚至可以将此视为更新过程的最后一步(更新程序sais“删除过时的软件包”或类似的东西)。

一些软件包将被安装,以前没有安装过,这些软件包只是新的依赖项,标记为自动安装,如果将来需要消失,可以删除。

这种机制甚至允许交换整个用户程序。 例如,从Gnome2切换到Unity。 因为两者都只是ubuntu-desktop的自动依赖,而ubuntu-desktop是为数不多的包之一,实际上首先要求新版本。

程序通常不依赖于OS内核的特定版本,因此它们通常可以正常运行的内核。

除此之外,我怀疑 Ubuntu更新程序会抛出一些特定的修复和变通方法,以避免这种理论破坏的情况。

正如您在更新期间所看到的那样,系统只能在有限的部分使用。 如果在更新期间出现问题,您很可能会遇到系统损坏。 通常甚至是一个不易修复的,因为升级程序也会受到影响。 请记住,具有破坏依赖性的程序可以继续运行,但不能重新启动,只要依赖项被破坏,这也适用于更新程序。

您可以使用命令行程序apt-mark找出哪些软件包被标记为手动安装,哪些软件包已自动安装。 您也可以使用相同的程序切换这些标记。 这将直接影响更新过程。

在更复杂的软件设置中,Updater有时会要求您手动解决依赖关系。 即,一个手动安装的程序更新并请求新版本的库,而另一个手动安装的程序依赖于同一个库的旧版本,并且无法使用新版本。 然后,您必须做出选择,要么放弃其中一个程序,要么不要同时升级这两个程序。 由于依赖关系通常很复杂,因此非常快速(你可能听说过“依赖地狱”一词)。

现在来具体问题:

  1. 当低级基础结构发生变化时(低级,如内核,驱动程序,库等等,用户不直接与之交互),不推荐使用的二进制文件会发生什么变化?
    • 好的……我已经涵盖了这个
  2. 完全弃用的应用会发生什么? 例如,Unity 2D(或任何其他软件被放弃/没有维护者,其包不在新的回购中)。
    • 如果应用程序曾经手动安装,它将保留在系统中,通常会导致我所描述的依赖性。
  3. ubuntu-desktop是一个元数据包,它将默认的Ubuntu应用程序作为依赖项。 如果我删除了Firefox并安装了Chrome,那么Firefox是否仍会作为升级的一部分进入?
    • 只要它是新版本的标准浏览器,是的。 铬也将升级。 我不确定你是否可以在不删除ubuntu-desktop的情况下删除Firefox。 请注意,除了严格的依赖关系之外,包系统还知道推荐的概念,其中软件通常会像依赖项一样安装,但可以在以后卸载而不会影响除了它自己的唯一依赖项之外的任何其他内容。
  4. 此外,如果单个应用程序过去依赖于package-x而在新版本中不再这样做,会发生什么情况; 尽管是孤儿,package-x是否会与其他软件包一起升级?
    • 不。

请问我是否还有其他问题。

在文件系统级别,与Windows不同,在Unix系统上,您可以删除打开的文件。 删除只删除文件的名称,而不是其内容,因此任何仍然打开文件的程序仍然可以访问它,直到它们关闭文件,然后才释放数据。

因此,升级过程只是删除旧文件,用新文件替换它们,对于某些系统服务,重新启动它们以便新版本运行。

如果没有重新启动整个计算机,有一个或两个组件无法重新启动,因此升级后会提示您重新启动,以便您使用新版本。

Linux如何在仍在使用时自行更新?

主要是因为Linux(以及它,大多数发行版)都是这样设计的。 能够在正在运行的系统上升级软件包是大多数基于Linux的发行版的目标。

对于Linux,没有任何东西可以阻止程序包管理器进程写入磁盘上的文件,即使该文件当前由应用程序打开,或者该文件是当前正在运行的可执行文件或共享代码库。 在非常低级别,有一些锁可以保护在单个写/读操作期间对文件的访问,但是这些锁永远不会被设计为保持超过几毫秒,并且任何其他应用程序都试图写入同一个文件将等待那些毫秒。

您可以在运行时替换可执行文件,它实际上不会对正在运行的进程执行任何操作,因为该进程不再需要磁盘上的文件 – 其所有代码都已加载到内存中。

这就是为什么在Linux上,即使您可以在应用程序运行时升级它,升级也不会实际生效,直到重新启动升级的应用程序。 在升级后台进程(例如系统服务)的情况下,需要重新启动该服务。 在您升级内核的情况下,这意味着重新启动。

在程序运行时是否会更换程序文件?

Linux发行版中的某些软件包将包含安装说明,指示软件包管理器在软件包更新时停止某些系统服务,并在更新完成后重新启动这些服务。 这可以防止例如更新特定服务的配置文件并且服务的运行版本可能无法处理较新版本的配置文件的情况。

通常,常规用户应用程序不需要运行配置文件,除了它自己生成的文件和位置(如用户的主目录)。 因此,更新时包管理器不会触及这些内容。

这与另一个function类似。 希望这有助于理解基本过程。

我指的是在操作系统启动时“切换root”的function。

当操作系统启动时,根文件系统(读取:“/”)最初仅在RAM中可用。 当此引导过程正在运行时,它会从RAM切换到硬盘上的/ filesystem。