将软件包添加到基于 subiquity 的安装中

将软件包添加到基于 subiquity 的安装中

我通过添加 ubuntu-minimal-desktop 为服务器和台式机构建了一个安装,到目前为止它可以工作,但只有在连接到有线网络时才有效

所以我想将 wpasupplicant 和 ubuntu-minimal-desktop 以及一些其他包添加到 iso 中,这样根本不需要网络有没有一种优雅的添加方式?

答案1

我也一直在研究这个问题,但针对的是 ubuntu live server 20.04。我不知道它是否适用于 Ubuntu Desktop。

这个想法是在修改 casper/filesystem.squashfs 并设置 subiquity/autoinstall 后重建 iso。但有时,预先安装某些软件包似乎会破坏安装程序(如 ifenslave 软件包),因此我在自动安装的后期阶段安装这些软件包。

因此,要在 iso 上预安装一些软件包,有两种方法:

修改 capser/filesystem.squashfs

总体思路是:

  1. 安装原始 live iso
  2. 挂载 casper/filesystem.squashfs
  3. chroot 并安装你的软件包
  4. 重新打包新的 casper/filesystem.squashfs
  5. 更新 iso 上的一些其他文件
  6. 重建 iso

我使用过的一些参考资料:

[1]https://medium.com/100-days-of-linux/chroot-a-linux-wonder-fc36ed08087e:使用 subiquity/autoinstall 进行自动安装,nocloud 风格

[2]https://github.com/ljfranklin/ubuntu-img-builder/blob/master/build.sh:演示 capser/filesystem.squashfs 修改的脚本

[3]https://github.com/canonical/subiquity/blob/main/scripts/inject-subiquity-snap.sh#L194:来自 canonical subiquity 的优秀脚本,展示了 overlayfs 的实用性以及简化的 xorriso 用法

在自动安装的后期安装软件包

这里的想法是使用 apt 下载软件包和缺少的依赖项,然后在自动安装后期命令阶段安装它们。这意味着以下步骤:

  1. 安装原始 live iso。
  2. 挂载 casper/filesystem.squashfs。
  3. chroot 并使用apt-get install --download-only -y -o Dir::Cache="/yourcache" -o Dir::Cache::archives="archives/" ${listOfPackages}。这将下载 filesystem.squashfs 中缺少的目标包及其依赖项。
  4. 设置 subiquity autoinstall 在 autoinstall 过程结束时安装这些包,如下所示:我尝试通过指定缓存目录来使用 apt install,但不适用于 curtin。所以我改用 dpkg --unpack *.deb; apt-get install --no-download -yf。它不像使用 apt 那么干净,但对我来说它完成了工作
#cloud-config
autoinstall:
version: 1
interactive-sections:
# ...
late-commands:
    - curtin in-target --target=/target -- bash -c 'cd /yourcache/archives; dpkg --unpack *.deb; apt-get install --no-download -yf'
    # - curtin in-target --target=/target -- bash -c 'apt-get install --print-uris --no-download -y -f -o Dir::Cache="/awrepo" -o Dir::Cache::archives="archives/" __PARAM_PACKAGES_POST__' # doesn't work. use dpkg --unpack instead
    - curtin in-target --target=/target -- apt-get --purge -y --quiet=2 autoremove
    - curtin in-target --target=/target -- apt-get clean

以下是所有这些内容的要点:https://gist.github.com/creatldd1/eec887f3f8a0bf48e0e9dec1598b8614

注意:本地 apt 缓存的替代方法是在 iso 上构建本地 apt 存储库并配置 apt 以使用它。问题是存储库的大小可能很大。这是我的第一个方法,但我放弃了。

配置简单 repo 的出色链接:https://unix.stackexchange.com/a/595448/402499

递归下载包及其依赖项的代码:

listPkg=$(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks ${theListofPackages} | grep "^\w" | sort --unique )
for pkg in ${listPkg}
do
    if ! apt-get download ${pkg}; then
        echo >&2 " WARNING : problem fetching package ${pkg}. Keeping on"
    fi
done

更多详细信息,请查看https://stackoverflow.com/questions/22008193/how-to-list-download-the-recursive-dependencies-of-a-debian-package

相关内容