概述/场景
我已经有一个完全正常工作的自动安装配置,它使用默认的 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.list
来trusted=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
使用自动安装的设置。