更新离线的Ubuntu服务器

我们在工作中开发一种设备,将其传送到低到不可接受的互联网位置。 当更新我们的软件时,我们有一整套技术来确保服务器是最新的,如木偶,甚至是脱机。

我们之前没有安装apt-offline,稍后才发现,幸运的是,这是一个小小的下载来安装它,这对我们大多数的设备来说都是可以的。 他们到目前为止都有低networking(56k到256k的互联网),所以1.8mb的下载需要一些时间,但我们得到它的工作。

现在我们要么拥有机器的原始签名,因为我们能够在远处生成一个签名,或者使用我们使用同一个USB安装密钥创build的默认签名,我们可以为这些机器生成一个更新包,并发送它与我们的设备的USB更新磁盘。

我遇到的问题是Puppet也有安装包。 我们列出了需要安装的软件包,但实现得太迟了,apt-offline使用–install-packages在脱机机器上使用该列表生成签名。

我们尝试了

  • 使用Ubuntu的:XENIAL泊坞窗图像,但似乎这个形象可能有差异,并没有包装一切…
  • 使用apt-offline + dselect和dpkg来设置要安装的软件包列表

而且我们没有太多的运气

唯一的解决scheme,但它是一个非常讨厌的是安装基础设备更新前。 安装apt-offline并生成一个新的默认签名,每个人都将使用这些–install-packages,但是,然后再次,问题是当我安装apt-offline,我得到最新的软件包为例。 当我执行“apt-offline get”时,这些软件包将不会被apt-offline打包,因为签名表示它们是最新的。

所以我们正在寻找:

  • 一种使用签名,默认或来自实际设备的方法
  • 指定更多要安装的软件包的方法,前提是我们无法访问设备
  • 即使它们是最新的,也可以打包所有需要的软件包
  • 或者属于这些线的东西

谢谢

所以我们不得不采取一种完全不同的方式,最终做到以下几点:

使用以下命令创build所有已安装软件包的版本

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

使用以下选项获取select:

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

下载所有debs使用:

 cat "$package_list" | xargs apt-get download 

然后,通过使用:

 dpkg-scanpackages 

我们能够创build我们自己的本地软件包仓库,将这个仓库作为源列表中的第一个元素插入,并运行所有固定版本的apt安装。 Et Voila!