Debootstrap

如何離線執行 debootstrap?

  • May 24, 2020

我想為同一個目標多次執行 debootstrap。

我經常在沒有網際網路訪問的情況下執行它,並且想離線執行它。

如何通過網際網路訪問執行該過程,然後在沒有網際網路訪問的情況下執行多次?

我願意使用包裝器/替代品,如 multistrap 和記憶體選項,如 apt-cacher-ng 或 squid。

關鍵要求是我可以完全離線執行它。

您可以按原樣使用 squid-deb-proxy 離線執行(甚至是InRelease文件),但您需要稍微修改它以離線執行 debootstrap,即使您線上時也是如此。

您需要修改 squid-deb-proxy.conf 文件,以便將其複制並放入您的項目中。

conf 文件中有絕對路徑,/etc因此/var如果要將其與系統分開,則需要將其修改為相對路徑。

為了在您線上時仍然使用代理,您需要將其添加到 conf 文件中。

#Use cached values when offline
offline_mode on

然後你可以像這樣啟動它:

mkdir -p squid/var/log/squid-deb-proxy
mkdir -p squid/var/run/

echo "Starting an instance of squid using the working dir for caches and logs instead of the system dirs"
squid -Nf squid/squid-deb-proxy.conf

然後在你開始之前debootstrap

#Use a caching proxy to save bandwidth
export http_proxy=http://127.0.0.1:8000

如果您想多次使用相同的配置安裝 Linux,請--foreign在安裝時先使用該選項啟動系統。例如,以下引導 Ubuntu zesty 進入目錄“deboot”

sudo debootstrap --foreign zesty deboot

然後,您可以保留 deboot 目錄作為參考,並在每次要重用它並使用該second-stage選項時將其複製到新的工作目錄。

mkdir work
cd work
sudo cp -r ../deboot .
sudo DEBOOTSTRAP_DIR=deboot/debootstrap/ debootstrap --second-stage --second-stage-target $(readlink -f deboot)

這裡要注意的兩件事是腳本使用的DEBOOTSTRAP_DIR環境變數debootstrap(但記錄得不是很好)以及該second-stage-target選項需要完整路徑。

另一種選擇是使用--make-tarball=[file]允許您下載包的參數,然後用於--unpack-tarball=[file]將這些包放在目標目錄中。

如果您想重用來自其他源或共享文件夾的記憶體,請使用 apt-proxy 或 cp -a packages /var/cache/apt/archives/,但是,這不是完全離線的,因為debootstrap仍會嘗試連接到網際網路InRelease從遠端倉庫獲取文件。

注意:此解決方案僅適用於 debootstrap v1.0.105 (2018-07-01) 及更早版本。因為它覆蓋了一個內部環境變數,所以它會阻止 debootstrap 獲取“/usr/share/debootstrap/functions”庫(這是一組函式定義,自 2007 年初始導入送出以來一直是 debootstrap 的一部分)。自 v1.0.106 (2018-07-05) 以來,呼叫了恰好在該庫中定義的“detect_container”函式。這會導致 debootstrap 失敗並顯示:“/usr/sbin/debootstrap: 54: /usr/sbin/debootstrap: detect_container: not found”。

引用自:https://unix.stackexchange.com/questions/397862