如何在 22.04 上使用 di 和 preseeding 实现自动安装

如何在 22.04 上使用 di 和 preseeding 实现自动安装

我正在尝试为 ubuntu 22.04 设置一个自动安装环境。多年来,我们已经在 20.04 和之前的 LTS 版本中使用它。我们使用 pxe/isolinux 和 tftp 和 dhcp 服务器来执行网络和 cd 启动。还有一些技巧可以让 uefi 正常工作。

我无法找到可用的 vmlinuz 和 initrd 映像,它们允许我使用预置和 debian 安装程序 (di) 启动自动 ubuntu 22.04 安装。

我使用以下命令安装 20.04,但这在 22.04 上不起作用:

linuxefi /path/to/2004/amd64/linux auto=true priority=critical url=http://example.com/ubuntu/2004/amd64/seed_ub_uefi.cfg console-setup/layoutcode=us interface=auto
initrdefi /path/to/2004/amd64/initrd.gz

我尝试从 22.04 ubuntu CD iso 映像中提取 vmlinuz 和 initrd.gz 映像。但是无论我怎么尝试,它都找不到根文件系统。我猜这些映像不再具有内置的 di 和 preseed 功能?

如果不存在这样的映像,我该如何创建自己的映像?我不太愿意迁移到 Canonical 想要强制执行的任何自动安装方法。我们的整个基础设施都基于前面提到的方法,我们以类似的方式安装多个操作系统。

我在 serverfault 上问过这个问题,但至今没有得到回复,所以我想这是一个更合适的提问地方。

答案1

我在 22.04“从头构建”的 ISO 中预置了几乎可以正常工作。在我的 ISO 构建 chroot 中,我仍然安装了

ubiquity 
ubiquity-casper 
ubiquity-frontend-gtk
ubiquity-slideshow-ubuntu ubiquity-ubuntu-artwork

apt 软件包和预置几乎可以与我 20.04 版的预置文件配合使用。出于某种原因,我必须在“安装 Ubuntu 时下载更新”屏幕上按“继续”,而在 20.04 版中则不需要这样做。

编辑:我可以通过添加到我的预置文件来实现完全自动化

ubiquity ubiquity/download_updates boolean false
ubiquity ubiquity/use_nonfree boolean false

答案2

根据此信息,Ubuntu 已于 20.04 版停止预置https://discourse.ubuntu.com/t/server-installer-plans-for-20-04-lts/13631

(我非常肯定,Canonical 正试图跟上苹果的步伐,以进步的名义打破一切常规,而不顾用户和客户。)

这是我刚刚开始的解决方法......

  1. 我创建了一个包含所有内容的 preseed.cfg 文件。在我的例子中,这个 preseed.cfg 文件是作为 JINJA 模板生成的,用于从机密存储中提取机密。

  2. 然后我创建了一个docker容器来提供我的preseed.cfg文件。它看起来有点像这样:

FROM REDACTED_INTERNAL_PATH/base:latest as runtime
USER root
RUN apt-get install nginx sudo -y && \
    rm /var/www/html/index.nginx-debian.html && \
    rm -rf /etc/update-motd.d/* && \
    echo "%service   ALL=NOPASSWD: /etc/init.d/nginx" > /etc/sudoers.d/service
COPY preseed.d/entrypoint.sh /opt/
COPY preseed.d/html/*.cfg /var/www/html/
USER service
ENTRYPOINT [ "/opt/entrypoint.sh" ]

3.我有一个 makefile,它构建并运行这个 docker 容器来提供我的 preseed.cfg 文件。4.然后我在 packer 中使用类似下面的内容来启动 22.04 虚拟机:

variable iso_url {
  type    = string
  default = "https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso"
}
variable iso_checksum {
  type    = string
  default = "84aeaf7823c8c61baa0ae862d0a06b03409394800000b3235854a6b38eb4856f"
}
variable cpus {
  type    = number
  default = 2
}
variable memory_size {
  type    = number
  default = 4096
}
variable disk_size {
  type    = number
  default = 61440
}
variable ssh_username {
  type    = string
  default = "<redacted>"
}
variable ssh_password {
  type    = string
  default = "<redacted>"
}

packer {
  required_plugins {
    parallels = {
      version = ">= 1.0.1"
      source  = "github.com/hashicorp/parallels"
    }
  }
}

source "parallels-iso" "ubuntu" {
  boot_command = [
    "<esc><esc><enter><wait>",
    "/install/vmlinuz noapic ",
    "preseed/url=http://{{ .HTTPIP }}:8080/preseed.cfg <wait>",
    "debian-installer=en_US ",
    "auto locale=en_US",
    "kbd-chooser/method=us <wait>",
    "hostname={{ .Name }} <wait>",
    "fb=false",
    "debconf/frontend=noninteractive <wait>",
    "keyboard-configuration/modelcode=SKIP ",
    "keyboard-configuration/layout=USA ",
    "keyboard-configuration/variant=USA ",
    "console-setup/ask_detect=false <wait>",
    "initrd=/install/initrd.gz -- <enter><wait>",
  ]
  boot_wait              = "10s"
  guest_os_type          = "ubuntu"
  vm_name                = "ubuntu_base"
  iso_checksum           = var.iso_checksum
  iso_url                = var.iso_url
  parallels_tools_flavor = "lin"
  shutdown_command       = "echo 'shutdown -P now' > shutdown.sh; echo 'vagrant'|sudo -S sh 'shutdown.sh'"
  ssh_username           = var.ssh_username
  ssh_password           = var.ssh_password
  ssh_timeout            = "30s"
  ssh_wait_timeout       = "10000s"
  prlctl                 = [
    ["set", "{{.Name}}", "--3d-accelerate", "off"],
    ["set", "{{.Name}}", "--adaptive-hypervisor", "on"],
    ["set", "{{.Name}}", "--memsize", var.memory_size],
    ["set", "{{.Name}}", "--cpus", var.cpus],
    ["set", "{{.Name}}", "--efi-boot", "off"],
  ]
}

build {
  sources = ["source.parallels-iso.ubuntu"]

  provisioner "shell" {
    scripts = [ ### REDACTED ###]
  }

  post-processor "vagrant" {
  }
}

相关内容