我正在尝试为 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 正试图跟上苹果的步伐,以进步的名义打破一切常规,而不顾用户和客户。)
这是我刚刚开始的解决方法......
我创建了一个包含所有内容的 preseed.cfg 文件。在我的例子中,这个 preseed.cfg 文件是作为 JINJA 模板生成的,用于从机密存储中提取机密。
然后我创建了一个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" {
}
}