我继续努力研究 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_DEFAULT
in 中/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 在安装过程的最后阶段运行两个命令:
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"
- 编辑
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
运行立方
-
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
在 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"