背景
由于监管原因(例如:服务器不允许通过互联网获取软件包),我们目前使用 Aptly 快照设置了本地 deb 镜像。所有这些对于正常升级都很好用。当我们需要进行版本升级(从 Ubuntu 18.04 到 20.04)时,我们通常只需替换 VM,但有些服务器要求我们使用镜像进行就地版本升级。
当前状态
我们已经配置/etc/update-manager/meta-release在我们的节点上指向我们的镜像,但当然没有meta-release 和 meta-release-lts在我们的 Aptly 中。如果我们复制官方元发布无法从我们的 Aptly 提供文件,因为它引用了一堆不同的外部 URL、安装程序、文档等。即使我们将 URL 更改为指向我们的 Aptly,所有这些文件也不会存在。所以我们也需要复制并提供这些文件。
解决方案?
我们需要解析元发布文件,下载所有安装程序等。为他们提供服务并生成我们自己的元发布文件?一定有更简单的方法可以做到这一点!我们必须从头开始构建它还是有可用的工具?
附言:由于 Aptly 似乎已被部分放弃,因此我们正在考虑切换到 Pulp 3,但我们不知道这是否有助于解决版本升级问题。
答案1
我们所做的是同步我们的本地镜像,下载元发布&元发布版本文件以及所需的更新程序(包括签名和发布信息(bionic.tar.gz bionic.tar.gz.gpg 等等) 来自默认的 Ubuntu 存储库。
archive.ubuntu.com/ubuntu/dists/bionic/main/dist-upgrader-all/current/
然后,我们从镜像中提供这些内容,并修改了与我们的镜像 URL 匹配的元发布文件的内容。
[元发布片段]
[METARELEASE]
URI = http://$YOUR_MIRROR_HERE/ubuntu_1604/meta-release
URI_LTS = http://$YOUR_MIRROR_HERE/ubuntu_1604/meta-release-lts
[meta-release-lts 片段]
[...]
Release-File: http://$YOUR_MIRROR_HERE/ubuntu/dists/bionic/Release
ReleaseNotes: http://$YOUR_MIRROR_HERE/ubuntu/dists/bionic-updates/main/dist-upgrader-all/current/ReleaseAnnouncement
ReleaseNotesHtml: http://$YOUR_MIRROR_HERE/ubuntu/dists/bionic-updates/main/dist-upgrader-all/current/ReleaseAnnouncement.html
UpgradeTool: http://$YOUR_MIRROR_HERE/ubuntu/dists/bionic-updates/main/dist-upgrader-all/current/bionic.tar.gz
UpgradeToolSignature: http://$YOUR_MIRROR_HERE/ubuntu/dists/bionic-updates/main/dist-upgrader-all/current/bionic.tar.gz.gpg
我们用了 ”apt dist-upgrade -dy“首先将所有软件包下载/获取到本地 PACKAGECACHE。您可以使用 apt/dpkg 标志覆盖 PACKAGECACHE 和自定义 sources.list 文件,如果不需要完全离线升级,则可以跳过此操作。
/etc/apt/apt.conf.d/10upgrade
dir::etc::sourcelist /srv/apt/custom_sources.list;
dir::cache::archives /srv/apt/packages;"
通过此设置,您可以仅使用本地包/配置进行完全升级,并防止升级期间与 ubuntu.com 存储库的通信。
一个警告是在 /etc/environment 中使用系统范围的 http 代理服务器 - 只需通过使用自定义环境调用升级程序来覆盖它:
$ export HTTP_PROXY=""
$ export http_proxy=""
$ export DEBUG_UPDATE_MANAGER=true
更新程序不会读取 /etc/apt/apt.conf.d/10proxy,因为这仅用于传输。
如果没有这些步骤,升级程序仍会尝试使用您配置的代理访问 archive.ubuntu.com,从而导致升级失败。
最后使用子 shell 调用它来捕获除 /var/log/dist-upgrade/main.log 中的信息之外的所有日志输出
$ (do-release-upgrade -f DistUpgradeViewNonInteractive) &>> $somelog
希望这会有所帮助(我们确实是从头开始构建的)