我正在制作一个带有自动安装功能的自定义 ISO,以便自动将 Ubuntu Server 安装到我们的机器上。作为自定义的一部分,我们当然需要安装一些 apt 包。问题是,此安装需要完全离线完成,所以我不能只将它们添加到 apt 包列表中,然后让 subiquity magic 处理所有事情。
我在用此方法将用户安装/自动安装文件打包到 iso 中,并且运行良好。
我如何提前下载 apt 包,将它们包含在 iso 中,并让 subiquity 自动查找并安装它们?
答案1
我找到了解决办法这里
答案2
您可以只使用 iso 上的内部 apt 存储库。
Deb 文件位于 pool/main 中。deb 文件的清单为 dists/focal/main/binary-amd64/Packages.gz。SHA256 摘要位于 dists/focal/Release 中。
最后一个问题是安装会检查 Release 文件的签名。通常它由 Ubuntu 签名。有两种可能的方法可以解决它:
设置
deb [trusted=yes] file:///cdrom focal main
它不会检查 gpg 符号。但我不知道它在 ISO 中的什么位置。使用您自己的密钥对其进行签名,并将公钥添加到 ISO 中的受信任密钥。
修改它们后,您可以像使用网络一样使用用户数据中的包部分。签署释放令的完整步骤:
提取 iso。我将提取的目录命名为“iso”。
将包添加到
iso/pool/main/path/to/package.deb
。您可以使用url=$(apt-get download --print-uris "$package" | awk '{print $1}')
这将为您提供源代码,以便您可以按照与原始存储库相同的顺序下载它。
然后通过调用以下命令将它们添加到列出所有可用包的 Packages.gz 文件中
PACKAGES_FILE_PATH="main/binary-amd64/Packages" PACKAGES_GZ_FILE_PATH="main/binary-amd64/Packages.gz" # Create Packages file cd iso dpkg-scanpackages . /dev/null > dists/focal/$PACKAGES_FILE_PATH cd dists/focal # Compress Packages file into Packages.gz gzip -9c $PACKAGES_FILE_PATH > $PACKAGES_GZ_FILE_PATH
更新发布文件:
# Update Release file with new sha256 and size PACKAGES_INFO=$(apt-ftparchive release . | grep --after-context=10 SHA256 | grep "$PACKAGES_FILE_PATH" | head -n 1) PACKAGES_GZ_INFO=$(apt-ftparchive release . | grep --after-context=10 SHA256 | grep "$PACKAGES_GZ_FILE_PATH") # Update the Release file with new values sed -i "\@$PACKAGES_FILE_PATH@ s@.*@$PACKAGES_INFO@" Release sed -i "\@$PACKAGES_GZ_FILE_PATH@ s@.*@$PACKAGES_GZ_INFO@" Release
创建 gpg 密钥并签署 Release 文件:
GPG_KEY_EMAIL="[email protected]" # Replace with your email address # Check if GPG key exists; if not, generate a new one if ! gpg --list-secret-keys --keyid-format LONG "$GPG_KEY_EMAIL" &> /dev/null; then echo "Generating a new GPG key..." gpg --batch --gen-key <<EOF %echo Generating a GPG key Key-Type: RSA Key-Length: 4096 Subkey-Type: RSA Subkey-Length: 4096 Name-Real: Your Name Name-Email: $GPG_KEY_EMAIL Expire-Date: 0 Passphrase: YourPassphrase %commit %echo done EOF fi rm -f iso/dists/focal/Release.gpg # Sign the Release file with GPG gpg --batch --passphrase "ubuntu" --default-key "$GPG_KEY_EMAIL" -abs -o iso/dists/focal/Release.gpg iso/dists/focal/Release
将公钥(gpg)添加到 filesystem.squashfs 中的受信任密钥。
sudo unsquashfs -d filesystem iso/casper/filesystem.squashfs gpg --export $GPG_KEY_EMAIL > autoinstall.gpg sudo mv autoinstall.gpg filesystem/etc/apt/trusted.gpg.d/ sudo rm iso/casper/filesystem.squashfs sudo mksquashfs filesystem/ iso/casper/filesystem.squashfs -comp xz -e boot sudo rm -rf filesystem/