如何使用 Ubuntu 22.04 Server Autoinstall 离线安装软件包

如何使用 Ubuntu 22.04 Server Autoinstall 离线安装软件包

我正在制作一个带有自动安装功能的自定义 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 签名。有两种可能的方法可以解决它:

  1. 设置deb [trusted=yes] file:///cdrom focal main它不会检查 gpg 符号。但我不知道它在 ISO 中的什么位置。

  2. 使用您自己的密钥对其进行签名,并将公钥添加到 ISO 中的受信任密钥。
    修改它们后,您可以像使用网络一样使用用户数据中的包部分。

    签署释放令的完整步骤:

    1. 提取 iso。我将提取的目录命名为“iso”。

    2. 将包添加到iso/pool/main/path/to/package.deb。您可以使用

      url=$(apt-get download --print-uris "$package" | awk '{print $1}')
      

      这将为您提供源代码,以便您可以按照与原始存储库相同的顺序下载它。

  3. 然后通过调用以下命令将它们添加到列出所有可用包的 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
    
  4. 更新发布文件:

    # 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
    
  5. 创建 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
    
  6. 将公钥(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/
    

相关内容