Ubuntu 22.04/20.04 批量装机:Cloud-init 自动化部署
与传统的 CentOS Kickstart 不同,新版 Ubuntu Server (20.04+) 采用了基于 Cloud-init 的 Autoinstall 机制。本文档详细介绍如何搭建支持 UEFI 和 Legacy 双模式引导的 Ubuntu 自动化装机服务器。
1. 环境准备 (Server端)
假设 PXE Server IP 为 192.168.243.128。
1.1 安装基础服务
apt update && apt install -y tftpd-hpa apache2 isc-dhcp-server syslinux pxelinux1.2 配置 HTTP 与 TFTP
我们使用 Apache2 来托管 ISO 镜像和 Cloud-init 配置文件(user-data)。
配置 Apache2 映射 TFTP 目录:
cat > /etc/apache2/conf-available/tftp.conf <<EOF
<Directory /var/lib/tftpboot>
Options +FollowSymLinks +Indexes
Require all granted
</Directory>
Alias /tftp /var/lib/tftpboot
EOF
# 启用配置并重启
a2enconf tftp
systemctl reload apache2配置 TFTP 服务: 编辑 /etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"重启服务:systemctl restart tftpd-hpa
1.3 准备内核与镜像
将 Ubuntu Server ISO 挂载,并提取内核文件。
# 1. 挂载镜像
mount -o loop ubuntu-22.04.4-live-server-amd64.iso /mnt
# 2. 复制内核 (vmlinuz) 和初始内存盘 (initrd)
cp /mnt/casper/vmlinuz /var/lib/tftpboot/
cp /mnt/casper/initrd /var/lib/tftpboot/
# 3. 将完整 ISO 放入 HTTP 目录供客户端下载
cp ubuntu-22.04.4-live-server-amd64.iso /var/lib/tftpboot/1.4 配置 DHCP 服务
编辑 /etc/dhcp/dhcpd.conf:
subnet 192.168.243.0 netmask 255.255.255.0 {
range 192.168.243.11 192.168.243.100;
option routers 192.168.243.1;
next-server 192.168.243.128; # PXE Server IP
# 简单判断架构 (不够严谨,生产环境建议使用 option arch)
filename "pxelinux.0";
# 注:若需同时支持 UEFI/Legacy,建议在 DHCP 中配置 class 判断
}2. 准备 Autoinstall 配置文件 (User-Data)
这是自动化的核心。你可以直接复用现有 Ubuntu 系统安装后生成的 /var/log/installer/autoinstall-user-data。
cp /var/log/installer/autoinstall-user-data /var/lib/tftpboot/user-data关键修改:为了适应不同磁盘大小,将根分区大小设置为 -1 (自动扩容)。
# user-data 示例片段
storage:
config:
- type: partition
id: partition-2
size: -1 # 修改此处,表示占用剩余所有空间3. UEFI 引导配置
UEFI 引导需要专门的 grubnetx64.efi.signed 文件。
3.1 获取引导文件
wget http://archive.ubuntu.com/ubuntu/dists/focal/main/uefi/grub2-amd64/current/grubnetx64.efi.signed -O /var/lib/tftpboot/pxelinux.0
# 注意:在纯 UEFI 环境下通常重命名为 BOOTX64.EFI,此处为了兼容 DHCP filename 配置覆盖了 pxelinux.0,生产环境建议区分。3.2 配置 GRUB 菜单
创建 /var/lib/tftpboot/grub/grub.cfg:
default=autoinstall
timeout=30
menuentry "Ubuntu 22.04 Autoinstall (UEFI)" {
set gfxpayload=keep
linux /vmlinuz ip=dhcp url=http://192.168.243.128/tftp/ubuntu-22.04.4-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://192.168.243.128/tftp/
initrd /initrd
}参数说明:ds=nocloud-net;s=... 指定了 user-data 文件所在的 HTTP 目录(注意 URL 结尾必须有斜杠 /)。
4. Legacy BIOS 引导配置
4.1 准备 Syslinux 组件
# 复制 Syslinux 依赖库
cp /usr/lib/syslinux/modules/bios/{libcom32.c32,ldlinux.c32,libutil.c32,menu.c32,vesamenu.c32} /var/lib/tftpboot/
cp /usr/lib/PXELINUX/lpxelinux.0 /var/lib/tftpboot/4.2 配置启动菜单
创建 /var/lib/tftpboot/pxelinux.cfg/default:
default vesamenu.c32
timeout 60
label autoinstall
menu label ^Autoinstall Ubuntu 22.04 (Legacy)
kernel /vmlinuz
append initrd=/initrd ip=dhcp url=http://192.168.243.128/tftp/ubuntu-22.04.4-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://192.168.243.128/tftp/5. 离线环境软件包获取技巧
如果服务器处于纯内网环境,缺少依赖包(如 tftpd-hpa),可在一台有网的虚拟机上进行下载。
5.1 仅下载不安装
# 下载指定包及其依赖到当前目录
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances tftpd-hpa | grep "^\w")5.2 批量安装
将下载的 .deb 文件拷贝到内网服务器:
dpkg -i *.deb总结
Ubuntu 的自动化安装依赖 Cloud-init,相比 Kickstart 更加灵活但也更依赖网络(需要 HTTP 下载完整 ISO)。在配置时,务必保证 user-data 文件的语法(YAML)正确,否则安装程序会报错并停止。
