创建自定义user-data文件

创建自定义user-data文件

我继续努力研究 cloud-init 及其文档。我目前面临的挑战之一是将内核的 cgroups 标志放入 grub 配置中。

最终目标是获取 GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0" 以便在 22.04 上安装 k3s (v1.24)

我尝试了各种选项 - write_files、在 runcmd 中使用 echo,甚至尝试在 runcmd 阶段复制 grub.cfg。到目前为止,对我来说都不起作用。我每次都使用 LXD,而不是构建 ISO。看起来 cloud-init 的工作方式有点不同,但目前认为没有太大区别。所以有时 cloud-init 会崩溃。当它不崩溃时,它会忽略我来自用户数据的内容并采用默认值。有什么想法让它工作,或者至少找出如何正确调试 cloud-init 吗?到目前为止,日志对我来说相当神秘。

答案1

使用自动安装对于 22.04,我的建议也是使用late-commands。这是我要使用的代码片段。它避免修改主文件并将内核参数附加到任何其他GRUB_CMDLINE_LINUX_DEFAULT参数。

#cloud-config
autoinstall:
  late-commands:
    - |
      cat <<'EOF' > /target/etc/default/grub.d/40my.cfg
      GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0"
      EOF
      curtin in-target --target=/target -- update-grub


另一种可能有效的方法是debconf-selections。我还没有测试过,但我认为自动安装文件应该看起来像这个片段。

#cloud-config
autoinstall:
  debconf-selections: |
    grub-pc grub2/linux_cmdline_default string cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0


另一种可能的方法是使用内核参数启动安装程序

--- cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0

三破折号参数具有特殊含义并且它后面的参数将被添加到GRUB_CMDLINE_LINUX_DEFAULTin 中/etc/default/grub

答案2

如果您尝试创建包含user-data允许在裸机或虚拟机上自动安装的文件的自定义 ISO,则无法使用 LXD 进行测试。简而言之,LXD 容器从 .img 文件而不是 ISO 启动。因此,无法使用 Subiquity、Casper 和 Curtin 安装生成的文件系统。这就是为什么使用 LXD 进行测试时看不到预期结果的原因。

此外,由于 Subiquity 未运行以安装操作系统,因此文件autoinstall中的配置键user-data将被忽略。配置键也是如此late-commands

最后,如果你创建一个 LXD 容器,并查看/etc/default/目录的内容,你会发现该/etc/default/grub文件丢失了。这是因为它不是真正必要的,并且所有默认值都被使用。


如果您想继续使用 Cubic 的自定义 ISO 来包含文件user-data以便在裸机或 VM 上进行自动安装,那么这相当简单。

必要步骤:

  • 创建自定义user-data文件
  • 运行立方
    • 添加您的user-data文件和一个空白meta-data文件。
    • 编辑grub.cfg
    • 生成 ISO
  • 在裸机或虚拟机上安装自定义 ISO

创建自定义user-data文件

GRUB_CMDLINE_LINUX_DEFAULT要向您的 grub 文件添加自定义,您可以late-commands在文件中使用配置键user-data

  late-commands:
  - curtin in-target --target=/target -- sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=""/GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0"/' /etc/default/grub
  - curtin in-target --target=/target -- update-grub

这告诉 Curtin 在安装过程的最后阶段运行两个命令:

  1. sed

    • 编辑/etc/default/grub它简单地替换GRUB_CMDLINE_LINUX_DEFAULT=""GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0"
  2. update-grub

    • 更新你的 grub 配置

以下user-data文件是我将在下一步使用 Cubic 时使用的功能文件。此自动安装将创建一个默认用户,其ubuntu密码为ubuntu。请进行相应更改。

#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: ubuntu-server
    password: $6$5lpwCLsKLEzMkSJc$keOAhA6aO/5RocGThmhVA7LSNuW911Rx5HHXFEa75oGK20cEdAAgn14H5f5nGeq6QgcSyLPrWcg1.JvjXbhrN/
    realname: Ubuntu User
    username: ubuntu
  late-commands:
  - curtin in-target --target=/target -- sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=""/GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0"/' /etc/default/grub
  - curtin in-target --target=/target -- update-grub

运行立方

  1. 选择您的工作目录 在此处输入图片描述

  2. 选择你的 ISO。我使用ubuntu-22.04.3-live-服务器-amd64.iso 在此处输入图片描述

  3. 点击下一个接着说 在此处输入图片描述

  4. 在下一页上,选择预播种选项卡并将您的自定义user-data文件和空白meta-data文件上传到预播种目录 在此处输入图片描述

  5. 选择引导选项卡并编辑grub.cfg文件如下: 在此处输入图片描述

    user-data您专门将第 10 行更改为以下内容。记下我们放置和文件的目录名称meta-data。它是/cdrom/预置/,这是已经在 Cubic 中创建的内容。

     linux   /casper/vmlinuz  autoinstall ds=nocloud\;s=/cdrom/preseed/ ---
    

    以下是整个grub.cfg文件:

     set timeout=30
    
     loadfont unicode
    
     set menu_color_normal=white/black
     set menu_color_highlight=black/light-gray
    
     menuentry "Try or Install Ubuntu Server" {
         set gfxpayload=keep
         linux   /casper/vmlinuz  autoinstall ds=nocloud\;s=/cdrom/preseed/ ---
         initrd  /casper/initrd.gz
     }
     menuentry "Ubuntu Server with the HWE kernel" {
         set gfxpayload=keep
         linux   /casper/vmlinuz  ---
         initrd  /casper/initrd.gz
     }
     grub_platform
     if [ "$grub_platform" = "efi" ]; then
     menuentry 'Boot from next volume' {
         exit 1
     }
     menuentry 'UEFI Firmware Settings' {
         fwsetup
     }
     else
     menuentry 'Test memory' {
         linux16 /boot/memtest86+.bin
     }
     fi
    
  6. 点击下一个进入以下页面。点击产生创建您的自定义 ISO。 在此处输入图片描述

  7. 完成后,您将看到此页面 在此处输入图片描述

在 VirtualBox 中安装

在 VirtualBox 中将此自定义 ISO 安装到 VM 非常简单,我不会在这里概述步骤。但是一旦安装完成,您可以检查内容/etc/default/grub,您将看到文件已正确更新:

$ cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=0"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

相关内容