一、Ubuntu20及其更高版本的cloud-init自动应答
由于Ubuntu20.04版本以后已不再发布server版本了,因此要通过UEFI引导安装ubuntu20及其更高版本,若直接使用cobbler则会有很多bug,所以,本文通过另一种方式来实现。
Ubuntu 20.04及其更高版本的系统安装程序支持新的操作模式自动安装(automated installation),与之前的版本有所不同的是:应答文件格式完全不同(Ubuntu20.04及其更高版本可使用cloud-init自动应答机制,自动应答文件格式为yaml。而之前版本都使用的是debconf-set-selections格式,也就是debian的preseed自动应答机制)。当然,Ubuntu20.04也可以使用preseed自动应答机制。
二、配置Ubuntu20及其更高版本的UEFI自动应答
本文以最新的长期支持版【ubuntu-24.04.4-live-server-amd64.iso】为例操作。
2.1、获取Ubuntu20及其更高版本ISO镜像内容到指定目录下
bash
#获取Ubuntu20及其更高版本的ISO镜像到指定目录(Cobbler的【/var/lib/cobbler/loaders/uefi/】)下
cd /var/lib/cobbler/loaders/uefi/
mkdir ubuntu24
cd ./ubuntu24
wget https://releases.ubuntu.com/24.04.4/ubuntu-24.04.4-live-server-amd64.iso

2.2、挂载系统镜像并获取压缩内核与临时根文件系统文件到指定目录
bash
#挂载系统镜像并获取压缩内核与临时根文件系统文件到指定目录(cobbler中的【/var/lib/cobbler/loaders/uefi/ubuntu24】)
#1-将下载好的Ubuntu24.04.4系统ISO镜像挂载到【/data/osimg/ubuntu24】目录下
mkdir -p /data/osimg/ubuntu24
mount -o loop ./ubuntu-24.04.4-live-server-amd64.iso /data/osimg/ubuntu24/
#2-将挂载好的Ubuntu24.04.4系统中的【压缩内核(vmlinuz)】【临时根文件系统(initrd)】文件到制定目录(cobbler中的【/var/lib/cobbler/loaders/uefi/ubuntu24】)
cp /data/osimg/ubuntu24/casper/vmlinuz /data/osimg/ubuntu24/casper/initrd ./

2.3、配置可在线访问Ubuntu20及其更高版本系统ISO镜像
由于cobbler中可在线访问的tftp对应的web服务【http://TFTP服务器IP/cobbler】的真实根路径是【/var/www/cobbler/】因此,可以直接在这个真实路径下创建一个软链接即可实现网络访问Ubuntu对应的内容了。
bash
#配置可在线访问Ubuntu20及其更高版本系统ISO镜像与【压缩内核(vmlinuz)】【临时根文件系统(initrd.img)】
cd /var/www/cobbler/
ln -s /var/lib/cobbler/loaders/uefi/ubuntu24 .


2.4、配置Ubuntu20及其更高版本系统的安装菜单
bash
#配置Ubuntu20及其更高版本系统的安装菜单
cd /var/lib/cobbler/loaders/uefi
vi grub.cfg
#【grub.cfg】文件末尾新增的Ubuntu24安装内容如下:
menuentry "Ubuntu24.04.4 autoinstall" --id=autoinstall {
echo "Loading Kernel..."
linux uefi/ubuntu24/vmlinuz boot=casper ip=dhcp url=http://192.168.1.35/cobbler/ubuntu24/ubuntu-24.04.4-live-server-amd64.iso autoinstall ds=nocloud-net\;s=http://192.168.1.35/cobbler/ubuntu24/ debug
echo "Loading Ram Disk..."
initrd uefi/ubuntu24/initrd
}


2.5、编写自动应答文件并在系统安装完成后执行脚本优化
在Ubuntu系统ISO所在路径下编写自动应答文件【meta-data】和【user-data】(user-data文件内容比较复杂,建议先手动安装一次ubuntu24.04.4系统,然后在系统的【/var/log/installer/】目录下会生成一个【autoinstall-user-data】 文件,该文件就是基于当前的系统的应答文件,可以将此文件作为基础,根据实际情况进行修改。);
bash
#编写自动应答文件
#1-在Ubuntu系统ISO镜像所在位置创建【meta-data】文件
vi meta-data
#2-【meta-data】文件的内容如下:
instance-id: ubuntu-autoinstall
local-hostname: ck-ubuntu24
bash
#2-在Ubuntu系统ISO镜像所在位置创建【user-data】文件
vi user-data
#【user-data】文件的完整自动应答内容如下:
#cloud-config
# See the autoinstall documentation at:
# https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html
autoinstall:
version: 1
# 完全无人值守,无交互步骤
interactive-sections: []
# 基础系统配置
timezone: Asia/Shanghai
locale: en_US.UTF-8
keyboard:
layout: us
# 安装阶段临时网络配置(DHCP自动匹配所有以太网卡)
network:
version: 2
renderer: networkd
ethernets:
all-eth:
match:
name: en*
dhcp4: true
optional: false
# 网卡启动自动获取IP
early-commands:
- ["/usr/bin/systemctl", "restart", "systemd-networkd"]
# 用户配置(用户名/密码(可用【openssl passwd -6 '你需要设置为的明文密码'】命令生成)/主机名)
identity:
hostname: ck-ubuntu24
username: ck
realname: ck-ubuntu24
password: $6$d6KDi1QWAAFyVYtu$8sdsHVFoG43JPz3oGRHgDjHBwBIrApRbPKewgHafhvXO21qTwKMusLxrSlXBH3/o91vs3k6TNWUZNFNrX.78L.
# SSH服务配置
ssh:
install-server: true
allow-pw: true
permit-root-login: false
# 内核版本
kernel:
package: linux-generic
# APT源优化(关闭geoip,提升国内安装速度)
apt:
# 在线环境可将updates后的值设置为security(仅安装安全更新);all(安装所有更新);false(完全不安装更新,离线环境专用)
updates: security
fallback: offline-install
geoip: false
preserve_sources_list: false
primary:
- arches: [amd64, i386]
uri: http://mirrors.aliyun.com/ubuntu/
- arches: [arm64, armhf]
uri: http://mirrors.aliyun.com/ubuntu-ports
# 彻底关闭了系统安装完成后的自动更新过程,因为在无网络环境中,会导致安装失败(在线环境可注释如下禁用的这一行)
disable_suites: [security, updates, backports]
# 不安装第三方驱动
drivers:
install: false
source:
id: ubuntu-server
# ===================== GPT+EFI 分区表(修复SWAP激活+规范分区配置) =====================
storage:
version: 1
config:
# 1. 物理磁盘 /dev/sda GPT分区表
- type: disk
id: disk-sda
path: /dev/sda
ptable: gpt
wipe: superblock-recursive
preserve: false
grub_device: false
# 2. EFI系统分区(512MB FAT32,引导分区)
- type: partition
id: part-efi
device: disk-sda
size: 512MB
flags: [esp]
number: 1
wipe: superblock
grub_device: true
- type: format
id: fmt-efi
volume: part-efi
fstype: fat32
- type: mount
id: mnt-efi
device: fmt-efi
path: /boot/efi
# 3. /boot 分区(1GB ext4)
- type: partition
id: part-boot
device: disk-sda
size: 1GB
number: 2
- type: format
id: fmt-boot
volume: part-boot
fstype: ext4
- type: mount
id: mnt-boot
device: fmt-boot
path: /boot
# 4. SWAP交换分区(8GB,修复原配置未激活SWAP问题)
- type: partition
id: part-swap
device: disk-sda
size: 8GB
flags: [swap]
number: 3
- type: format
id: fmt-swap
volume: part-swap
fstype: swap
- type: mount
id: mnt-swap
device: fmt-swap
path: none
# 5. /usr 分区(20GB ext4)
- type: partition
id: part-usr
device: disk-sda
size: 20GB
number: 4
- type: format
id: fmt-usr
volume: part-usr
fstype: ext4
- type: mount
id: mnt-usr
device: fmt-usr
path: /usr
# 6. /var 分区(20GB ext4)
- type: partition
id: part-var
device: disk-sda
size: 20GB
number: 5
- type: format
id: fmt-var
volume: part-var
fstype: ext4
- type: mount
id: mnt-var
device: fmt-var
path: /var
# 7. 根分区 /(20GB ext4)
- type: partition
id: part-root
device: disk-sda
size: 20GB
number: 6
- type: format
id: fmt-root
volume: part-root
fstype: ext4
- type: mount
id: mnt-root
device: fmt-root
path: /
# 8. /data 数据分区(剩余所有空间)
- type: partition
id: part-data
device: disk-sda
size: -1
number: 7
- type: format
id: fmt-data
volume: part-data
fstype: ext4
- type: mount
id: mnt-data
device: fmt-data
path: /data
# ===================== 安装后收尾脚本(优化容错+规范执行) =====================
late-commands:
# 启用SSH服务
- curtin in-target --target=/target -- systemctl enable ssh
# 替换APT国内源(增加超时+重试,避免安装失败)
- curtin in-target --target=/target -- wget -q --timeout=10 --tries=2 -O /etc/apt/sources.list http://192.168.1.35/cobbler/ubuntu24/bash/sources.list
# 下载初始化脚本
- curtin in-target --target=/target -- wget -q --timeout=10 --tries=2 -P /root/ http://192.168.1.35/cobbler/ubuntu24/bash/init.sh
# 执行初始化脚本
- curtin in-target --target=/target -- chmod +x /root/init.sh
- curtin in-target --target=/target -- /bin/bash /root/init.sh
# 设置root密码(可用【openssl passwd -6 '你需要设置为的明文密码'】生成)
- curtin in-target --target=/target -- usermod -p '$6$d6KDi1QWAAFyVYtu$8sdsHVFoG43JPz3oGRHgDjHBwBIrApRbPKewgHafhvXO21qTwKMusLxrSlXBH3/o91vs3k6TNWUZNFNrX.78L.' root

bash
#系统安装完成后需执行的命令
#1-进入Ubuntu系统ISO镜像所在路径
cd /var/www/cobbler/ubuntu24/
#2-创建系统安装完成后需执行的内容
mkdir bash
cd bash
#3-更改Ubuntu系统的源(使用阿里云的源)
vi sources.list
#【sources.list】完整内容如下:
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#4-Ubuntu系统安装完成后需执行的脚本操作
vi init.sh
#【init.sh】脚本的完整内容如下(启用root可ssh连接、禁用ufw防火墙、设置NTP时钟、优化参数):
#!/bin/bash
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart sshd
systemctl stop ufw.service
systemctl disable ufw.service
echo -e "NTP=ntp1.aliyun.com\nFallbackNTP=ntp.ubuntu.com" >> /etc/systemd/timesyncd.conf
systemctl restart systemd-timesyncd
cat >> /etc/security/limits.conf << EOF
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
root soft nofile 655350
root hard nofile 655350
root soft nproc 655350
root hard nproc 655350
EOF
rm -rf /root/init.sh



2.6、同步cobbler的所有配置
只要cobbler中的任何配置内容有变动,都需要执行【cobbler sync】命令将【/var/lib/cobbler/loaders】目录下的内容都同步到【/var/lib/tftpboot/】目录下。


三、客户端测试UEFI网络引导全自动安装系统
找一台全新的服务器或者新建一个虚拟机与我们这里搭建好的TFTP+DHCP(Cobbler)服务器在同一个网段内(如:我这里是192.168.1网段);然后设置该设备从网络引导是否可以显示【Ubuntu24.04.4 autoinstall】并选择该系统后,耐心等待全自动安装我们部署好的Ubuntu24.04.4系统即可(注意:在安装之前:可以先在TFTP服务器上执行【tail -f /var/log/messages】命令查看系统安装的流程或报错内容)详细操作如下所示:








注意1:若运行到这里如下图所示显示【Out memory】字样,则表示当前客户端的内存不够(建议在虚拟机设置11g内存),增加内存后重试(否则就不会自动安装系统,需要手动安装配置了)。



注意2:若在安装时报错找不到/dev/sda磁盘,则需要确认当前服务器的磁盘类型,在user-data中修改为自己磁盘对应的类型即可【详情请查看如下的《磁盘命名解析》】:

|------------------------|-------------------|-----------------------|
| 硬件 / 虚拟化类型 | 系统盘默认名称 | 说明 |
| NVMe SSD 物理机 | /dev/nvme0n1 | 现在服务器标配 NVMe,几乎不用 sda |
| KVM/Proxmox/VMware 虚拟机 | /dev/vda | 半虚拟化磁盘,不是 sda |
| 多磁盘物理机 | /dev/sdb /dev/sdc | sda 可能被其他盘占用 |
| 传统 SATA/SAS 盘 | /dev/sda | 仅老硬件保留 |
[磁盘命名解析]
最后等待系统安装完成后进入系统界面,如下图所示:




bash
#登录系统后检查内容
#1-检查磁盘分区情况是否与user-data自动安装系统文件中的配置相符
df -hT
#2-查看主机名称
hostname
#3-查看当前的系统的源
cat /etc/apt/sources.list
#4-查看user-data自动创建的用户(如:ck)
id ck

到这里,恭喜你,使用基于Cobbler服务实现UEFI网络引导全自动安装Ubuntu20及其更高版本系统成功!