Ubuntu

更新離線 ubuntu 伺服器

  • October 11, 2017

我們在工作中開發了一種設備,可以傳遞到低到不存在的網際網路位置。在更新我們的軟體時,我們擁有完整的技術棧來確保伺服器是最新的,例如 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 打包,因為簽名表明它們是最新的。

所以我們正在尋找:

  • 一種使用簽名、預設或來自真實設備的方法
  • 一種指定要安裝更多軟體包的方法,前提是我們無權訪問該設備
  • 一種打包所有必需包的方法,即使它們是最新的
  • 或者屬於這些行的東西

謝謝

所以我們不得不採取完全不同的方式,最終做了以下事情:

使用以下命令創建所有已安裝軟體包的版本列表:

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 即可。瞧!

引用自:https://serverfault.com/questions/868159