更新离线 Ubuntu 服务器

更新离线 Ubuntu 服务器

我们在工作中开发了一种设备,可将其发送到互联网普及率较低甚至没有互联网的地方。在更新软件时,我们拥有全套技术来确保服务器保持最新状态,例如 puppet 甚至 apt-offline。

我们一开始没有安装 apt-offline,后来才发现,幸运的是,安装它只需要下载很小的文件,这对于我们的大多数设备来说都没问题。到目前为止,它们所有的互联网速度都很低(56k 到 256k 互联网),因此 1.8mb 的下载需要一些时间,但我们让它正常工作了。

现在,我们要么拥有机器的原始签名(因为我们能够在远处生成一个签名),要么使用从同一个 USB 安装密钥创建的默认签名,我们就能够为这些机器生成一个更新包并将其与 USB 更新磁盘一起发送至我们的设备。

我遇到的问题是 Puppet 也有需要安装的软件包。我们制作了需要安装的软件包列表,但后来才意识到 apt-offline 会使用该列表在离线机器上使用 --install-packages 生成签名。

我们尝试了

  • 使用 ubuntu:xenial docker 镜像,但似乎这个镜像可能有差异并且没有打包所有内容......
  • 使用 apt-offline + dselect 和 dpkg 设置要安装的软件包列表

但我们的运气不太好……

剩下的唯一解决方案是安装基本设备预更新,但这非常烦人。安装 apt-offline 并生成一个新的默认签名,每个人都会使用这些 --install-packages,但问题是,当我安装 apt-offline 时,我会获得最新的 python 软件包。当我执行“apt-offline get”时,这些软件包不会被 apt-offline 打包,因为签名表明它们是最新的。

因此,我们正在寻找:

  • 使用签名的方法,默认或来自真实设备
  • 如果我们无权访问设备,可以指定安装更多软件包的方法
  • 将所有必需的软件包(即使它们是最新的)打包的方法
  • 或者属于这些类别的东西

谢谢

答案1

因此,我们最终不得不采取一条完全不同的道路,并最终采取了以下措施:

使用以下命令创建所有已安装软件包的版本列表:

dpkg-query -W -f '${status} ${package} ${version}\n' | sed -n 's/^install ok installed //p' | sed 's/ /=/' | sort | tr -d '\15\32'

使用以下方式获取选择:

debconf-get-selections | sed '/^#,*/d'

使用以下方式下载所有 deb:

cat "$package_list" | xargs apt-get download

然后,通过使用:

dpkg-scanpackages

我们可以创建自己的本地软件包存储库,将该存储库作为源列表中的第一个元素插入,然后只需运行 apt install 即可安装所有修复版本。瞧!

相关内容