我们运行一个基于 ubuntu 20.04 的应用程序。它是一个名为 magma 的开源 LTE 解决方案(以下是我们部署它的方式:https://magma.github.io/magma/docs/lte/deploy_install)
应用程序依赖项之一是liblsan0
,据我所知,它用于监控泄漏。
最近,liblsan0 从版本升级到10.3.0
,10.5.0
旧版本已从 Ubuntu 存储库中删除。由于无人值守升级默认配置,此操作在我们所有系统中自动执行。
此更改导致了 Magma AGW 中出现严重错误,如下所述:https://github.com/magma/magma/issues/15279
我们仍然不明白应用程序崩溃的根本原因,因此无法修复它,但我们通过安装旧版本的gcc-10-base
和解决了这个问题liblsan0
。这是通过手动下载10.2.1
或10.3.0
版本的这些包,然后将这些包保存在 中来完成的apt-mark hold
。
然而,这种解决方法使我们的系统陷入僵局:
- 由于依赖关系损坏,我们几乎无法进一步升级系统中的任何软件包。我们可能不时想要升级 openvswitch dkms。
- 我们也无法安装新系统,因为新安装附带了版本
10.5.0
,无法工作。安装过程包含apt update / install
强制更新这些核心软件包。
强制降级会将10.3.0
我们的系统锁定在依赖关系中断的状态。如果我使用 20.04 的新 ubuntu 系统,保留 10.3.0 软件包,并尝试安装该应用程序,我会收到如下错误:
# apt install po-debconf gettext intltool-debian libgomp1
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
libgomp1 : Depends: gcc-10-base (= 10.5.0-1ubuntu1~20.04) but 10.3.0-1ubuntu1~20.04 is to be installed
E: Unable to correct problems, you have held broken packages.
我理解最好的解决方案是让应用程序与之一起工作liblsan0=10.5.0
,但目前我们还没有能力调试/修复该问题。
我们正在寻找一种方法来冻结我们的 ubuntu 系统及其版本gcc-10-base
中的相应软件包10.3.0
,同时仍保持其他一切功能(例如 apt update/install)。
冻结系统和存储库还有一个好处,就是让我们网关的所有新部署都相同,这对于网络稳定运行至关重要。我们需要始终完全控制系统软件包,不能依赖删除软件包的上游存储库。
答案1
许多软件包的旧版本都可以从 Ubuntu 镜像中轻松获得。只是 apt 无法看到它们。在 Web 浏览器中打开镜像,查找目录pool
,然后浏览到所需的每个软件包的版本。
您的本地包缓存中也可能有旧版本:/var/cache/apt
然后使用 apt 降级:sudo apt install </path/to/package1>=<version> </path/to/package2>=<version> </path/to/packageN>=version
然后使用 apt-marking 来阻止升级:sudo apt-mark hold package1 package2 packageN
一定要记录你所做的事情,这样有一天你可以安全地撤销它。
要撤消保留并恢复更新的 Ubuntu 系统:
sudo apt-mark unhold package1 package2 packageN
sudo apt upgrade