在自动安装期间使用私有 Apt 存储库时出错

在自动安装期间使用私有 Apt 存储库时出错

概述/场景

我已经有一个完全正常工作的自动安装配置,它使用默认的 apt 配置(cloud-init 用户数据中没有 apt 配置)。源图像正在使用Ubuntu 20.04 云镜像

我的目标是编辑自动安装配置以使用私有 Apt 存储库(存储库已经存在)。我必须确保安装程序永远不会访问 Ubuntu 服务器以获取 Apt 软件包,并且仅有的点击自定义 Apt 存储库。这些存储库已经建立,并且已经运行了很长时间,我只需要让安装程序指向它们。

我已经评论过了如何使用 Ubuntu 自动安装添加 apt 存储库

以下是我添加到自动安装云初始化中的内容:

笔记:下面提到的/cdrom/apt-key.gpg文件是存在的并且对于 repo 有效(经过彻底测试)。

笔记:存储库使用私有 CA 通过 https 进行。由于在配置 Apt 之前,我还无法ca-certificates在安装过程中安装软件包,因此我只能强制信任它。trusted=yes没有用,我还必须添加如下apt.conf.d/99verify-peer.conf所示才能使其正常工作。这或许导致问题的原因,但它在安装 shell 上手动运行良好。我有证书,可以将它们注入安装媒体,因此如果有更好的方法让安装程序实例信任我的 CA 证书而无需强制信任,我愿意接受这种改变!

  early-commands:
    - 'mkdir -p /etc/apt'
    - 'cp /cdrom/apt-key.gpg /etc/apt/fresh-ubuntu-key.gpg'
    - 'touch /etc/apt/apt.conf.d/99verify-peer.conf'
    - 'echo >>/etc/apt/apt.conf.d/99verify-peer.conf "Acquire { https::Verify-Peer false }"'
  apt:
    preserve_sources_list: false
    sources_list: |
      deb [trusted=yes signed-by=/etc/apt/fresh-ubuntu-key.gpg] https://repo.internal.example.com/aptly/focal focal-ver221 main
      deb [trusted=yes signed-by=/etc/apt/fresh-ubuntu-key.gpg] https://repo.internal.example.com/aptly/focal focal-security-ver221 main
      deb [trusted=yes signed-by=/etc/apt/fresh-ubuntu-key.gpg] https://repo.internal.example.com/aptly/focal focal-updates-ver221 main
      deb [trusted=yes signed-by=/etc/apt/fresh-ubuntu-key.gpg] https://repo.internal.example.com/aptly/focal focal-backports-ver221 main

问题/故障排除

尝试安装时,安装失败,并显示以下信息:

finish: subiquity/Updates/apply_autoinstall_config
start: subiquity/Late/apply_autoinstall_config
finish: subiquity/Late/apply_autoinstall_config
start: subiquity/Shutdown/apply_autoinstall_config
finish: subiquity/Shutdown/apply_autoinstall_config
finish: subiquity/apply_autoinstall_config
start:   subiquity/Install/install/configure_apt: configuring apt
start: subiquity/Meta/status_GET
start: subiquity/Meta/status_GET
start: subiquity/Meta/status_GET
start: subiquity/Meta/status_GET
start: subiquity/Mirror/cmd-apt-config: curtin command apt-config
finish: subiquity/Mirror/cmd-apt-config: curtin command apt-config
start:     subiquity/Install/install/configure_apt/cmd-in-target: curtin command in-target
finish:   subiquity/Install/install/configure_apt: Command '['/snap/subiquity/3119/usr/bin/python3.8', '-m', 'curtin', '--showtrace', '-vvv', '--set', 'json:reporting={"subiquity": {"type": "journald", "identifier": "curtin_event.2752.2"}}', 'in-target', '-t', '/tmp/tmpzyqgk825/mount', '--', 'apt-get', 'update']' returned non-zero exit status 100.
finish: subiquity/Install/install: Command '['/snap/subiquity/3119/usr/bin/python3.8', '-m', 'curtin', '--showtrace', '-vvv', '--set', 'json:reporting={"subiquity": {"type": "journald", "identifier": "curtin_event.2752.2"}}', 'in-target', '-t', '/tmp/tmpzyqgk825/mount', '--', 'apt-get', 'update']' returned non-zero exit status 100.
start:   subiquity/ErrorReporter/1669932701.344982386.install_fail/add_info
finish:     subiquity/Install/install/configure_apt/cmd-in-target: curtin command in-target
finish:   subiquity/ErrorReporter/1669932701.344982386.install_fail/add_info: written to /var/crash/1669932701.344982386.install_fail.crash
An error occurred. Press enter to start a shell

我尝试在其中找到任何有意义的东西/var/crash/1669932701.344982386.install_fail.crash,但文件太大,难以解析。似乎没有我能看到的其他任何失败信息。

重要的提示: 失败后,我可以进入 shell,手动更新 /etc/apt/sources.list,apt update一切正常。所以我知道安装程序实例可以与我的私有存储库正确通信。因此,问题似乎出在 autoinstall/cloud-init 期间的特定问题上。

如果您有任何想法,请帮忙,谢谢!!

答案1

总结

你可以尝试类似

#cloud-config
autoinstall:
  apt:
    preserve_sources_list: false
    sources_list: |
      deb [trusted=yes] https://repo.internal.example.com/aptly/focal focal-ver221 main
      deb [trusted=yes] https://repo.internal.example.com/aptly/focal focal-security-ver221 main
      deb [trusted=yes] https://repo.internal.example.com/aptly/focal focal-updates-ver221 main
      deb [trusted=yes] https://repo.internal.example.com/aptly/focal focal-backports-ver221 main
     conf: |
      Acquire::https::repo.internal.example.com::Verify-Peer "false";
      Acquire::https::repo.internal.example.com::Verify-Host "false";
   

推理

首先,early-commands自动安装配置中的 并没有按照您的想法执行。这些命令在安装程序环境中配置 apt。但是,安装过程中的 apt 命令通常发生在不同的chroot环境中。您共享的日志显示了这一点。失败的命令部分是in-target -t /tmp/tmpzyqgk825/mount apt-get update

第二个问题是存储库有一个自定义 gpg 密钥。据我所知,提供自定义密钥的唯一方法是使用以下语法另一个答案您引用过。当然,您也可以添加选项sources.listtrusted=yes避免因缺少 gpg 密钥而导致失败,但从长远来看,这可能不是一个好的配置。

第三个问题是私有 CA 签署了 https 证书。没有提供信任此私有 CA 的方法。看起来已提交错误请求这个。它也看起来像有一个合适的配置选项可用于忽略证书问题。同样,从长远来看,这可能不是一个好的配置。

late-commands安装自定义 gpg 密钥和私有 CA,然后重新配置 apt可能是最简单的方法。

更新

正如评论中所述,此解决方案无效。我在这里分享我的发现。我使用 Ubuntu 22.04 ( subiquity 22.04.2) 测试了安装过程。

  • 下位性 创建 /var/log/installer/subiquity-curtin-apt.conf。它基本上包含自动安装apt部分(以及潜在的代理信息)。
  • 下位性运行科廷配置 apt/var/log/installer/subiquity-curtin-apt.conf在覆盖文件系统中使用/tmp/tmpXXX。如果使用上面的自动安装代码片段,那么科廷将创建/tmp/tmpXXX/etc/apt/apt.conf.d/94curtin-config
  • 下位性创建/var/log/installer/subiquity-curtin-install.conf。这确实不是包含apt 部分。大概是因为 apt 已经配置好了。
  • 下位性运行科廷执行安装使用/var/log/installer/subiquity-curtin-install.conf。这将复制/tmp/tmpXXX/target。这将创建/target/etc/apt/apt.conf.d/94curtin-config
  • 在安装的后期阶段,科廷 配置 apt。因为安装配置不包含 apt 部分科廷实际上删除 94curtin-config
  • 后续需要 apt 配置的 apt 命令94curtin-config将会失败,导致安装失败。
  • 如果安装没有因为缺少94curtin-config文件而失败,则下位性 将复制 /tmp/tmpXXX/etc/apt并且/target/etc/apt最终的安装将包含94curtin-config

简而言之,不要依赖apt conf使用自动安装的设置。

相关内容