`do-release-upgrade`是一个在Ubuntu操作系统中常用的命令。它的作用是升级Ubuntu系统到最新的稳定版本。当你运行这个命令时,系统会检查是否有新版本可用,并且会自动下载并安装所有必要的软件包和依赖项。这个命令非常方便,因为它可以帮助你保持系统的最新状态,并享受新功能和修复的好处。所以,如果你想让你的Ubuntu系统保持更新,只需运行`do-release-upgrade`命令即可。

我们知道do-release-upgrade“进行发布升级”。但在稍低的层面上,它到底做了什么呢?

我打算进行更多手动升级,例如按照Debian的方式:设置源后执行aptitude updateaptitude full-upgrade。实际上,我计划完全使用aptitude进行交互操作。但这让我对do-release-upgrade除了搞乱我的sources.list之外还做了什么感到好奇。

1个回答

do-release-upgrade是“update-manager-core”软件包的一部分。该脚本似乎确定您要升级到哪个版本,并尝试查找是否支持该版本,如果不支持则会进行投诉。- 如果它确信可以工作,它会下载特定于该版本的UpgradeTool并运行它。

“update-manager-core”软件包的一部分是文件/etc/update-manager/meta-release,您可以在其中找到URL http://changelogs.ubuntu.com/meta-release,然后在那里找到UpgradeTool的下载链接。

下载的UpgradeTool tarball是从源代码软件包“ubuntu-release-upgrader”打包而来的(之前是“update-manager”)。该版本对应于目标版本的最新更新。

该源代码有一个来自warty和hoary发布时间的旧README。它讨论了在升级过程中应该做什么。它还提到了一个更详细的UpgradeTool建议的链接。

我在这里列出了其中提到的操作,并检查它们是否实际实现:

  • 与仓库相关
    • 切换到新的sources.list条目
    • 删除未知的第三方仓库
    • 可能交换镜像(尚未实现)
  • 与软件包相关
    • 在升级之前检查是否有损坏的软件包
    • 在升级之前更新当前版本(仅使用apt-get update命令)
    • 删除和安装特定的软件包
    • 检查是否安装了{ubuntu,kubuntu,edubuntu}-desktop
    • 清除旧内核
    • 设置移除黑名单和白名单
    • 删除或替换在早期版本中存在的过时软件包
  • 与配置相关(在quirks中可能存在)
    • 将默认用户添加到新组(我检查的版本中尚未完成)
    • 检查一些配置文件

升级工具通过以下文件进行每个版本的配置(打开它们以查看!):

DistUpgrade.cfg
  • 与升级工具相关的配置
  • 与发行版相关的配置
  • 软件源(例如 [Sources] ValidMirrors)
  • 自定义更改([Distro] PostInstallScript)
  • 特殊软件包;仅由 DistUpgradeController.py 处理:
    • [Distro] RemoveObsoletes, ForcedObsoletes, BaseMetaPkgs, MetaPkgs
    • [meta_package_name] ForcedObsoletes
  • ...以及由 DistUpgradeCache.py 处理:
    • [Distro] MetaPkgs, RemovalBlacklist, RemoveEssentialOk, BadVersions, BaseMetaPkgs, PurgeObsoletes, Demotions, KeyDependencies
    • [Distro 和 meta_package_name] KeepInstalledPkgs, KeepInstalledSection, PostUpgrade*
    • [KernelRemoval] *
  • DistUpgradeQuirks.py
    • 运行(发行版)特定的函数(同一文件)和插件(plugins 目录)
    • 函数必须具有特定的名称(例如 from_nattyPreCacheOpen()),插件必须具有特殊的 condition 属性(例如 *PostInitialUpdate
    • 其中一个函数 StartUpgrade() 本身就是一个杂糅物:其中之一是调用 _applyPatches(),该函数遍历 patches 目录中的文件
    • 在我的安装中,所有这些几乎没有任何作用(i386,软件包不旧于 natty-updates)
  • DistUpgradeCache.py 的更多内容
    • 运行 get_kernel_list.sh(在 trusty 中不存在),并确保安装了一个内核
    • 一些关于 Nvidia 驱动程序的处理
  • 已核对版本:

    • natty → oneiric
    • oneiric → precise
    • precise → trusty(截至2014年4月18日的最终版本)
    • trusty → utopic(在2014年10月23日发布前几小时)

    5每次我使用do-release-upgrade,最后都会得到一个无法启动的系统 :) - user205301
    do-release-upgrade 处理的一些示例包括:nvidia 二进制驱动程序、multiarch 更改、ndiswrapper、添加/删除架构和内核类型(例如,弃用服务器内核)。 - NGRhodes
    @NGRhodes,你的评论对我来说太模糊了:ndiswrapper在Feisty时期是一个特例,现在不是了。没有添加或删除任何架构(除了amd64,它将i386作为外部添加,我想你已经涵盖了“multiarch changes”)。- 没有任何东西被“弃用”:软件包要么被删除,要么不被删除。 - Robert Siemer