1. PXE自动装机环境概述
PXE(Preboot eXecution Environment)是一种通过网络引导操作系统的技术标准,它允许计算机在没有本地存储设备(如硬盘、U盘)的情况下,直接从网络启动并安装操作系统。在企业IT运维中,PXE技术常用于批量部署服务器操作系统,大幅提升运维效率。
基于Ubuntu Server搭建PXE自动装机环境主要包括以下核心组件:
- DHCP服务器:为客户端分配IP地址并告知PXE服务器位置
- TFTP服务器:传输引导加载程序和内核文件
- HTTP服务器:提供操作系统镜像和安装文件
- 自动应答文件:实现无人值守安装
2. 环境准备与系统配置
2.1 硬件与网络要求
推荐使用以下配置作为PXE服务器:
- CPU:至少2核
- 内存:4GB以上
- 存储:50GB以上可用空间
- 网络:双网卡(一个用于外网访问,一个用于内网PXE服务)
网络拓扑建议:
[外网] | [PXE服务器] | (内网) [交换机] | [待装机客户端]2.2 Ubuntu Server系统安装
- 下载Ubuntu Server 22.04 LTS镜像
- 使用U盘或IPMI方式安装基础系统
- 配置静态IP地址(示例配置):
# /etc/netplan/00-installer-config.yaml network: version: 2 ethernets: ens33: dhcp4: false addresses: [192.168.1.10/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]应用网络配置:
sudo netplan apply3. 核心服务安装与配置
3.1 安装必要软件包
更新系统并安装所需软件:
sudo apt update && sudo apt upgrade -y sudo apt install -y tftpd-hpa apache2 isc-dhcp-server syslinux-common pxelinux3.2 配置TFTP服务
- 修改TFTP配置:
sudo sed -i 's/TFTP_DIRECTORY="\/srv\/tftp"/TFTP_DIRECTORY="\/var\/lib\/tftpboot"/g' /etc/default/tftpd-hpa sudo sed -i 's/TFTP_ADDRESS=":69"/TFTP_ADDRESS="0.0.0.0:69"/g' /etc/default/tftpd-hpa- 创建TFTP目录结构:
sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg sudo cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/ sudo cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libcom32.c32,libutil.c32,vesamenu.c32} /var/lib/tftpboot/- 重启TFTP服务:
sudo systemctl restart tftpd-hpa3.3 配置Apache HTTP服务
- 创建镜像存储目录:
sudo mkdir -p /var/www/html/ubuntu- 设置目录权限:
sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html3.4 配置DHCP服务
- 备份原始配置:
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak- 编辑DHCP配置:
sudo nano /etc/dhcp/dhcpd.conf添加以下内容(根据实际网络调整):
subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option domain-name-servers 8.8.8.8, 8.8.4.4; option routers 192.168.1.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; default-lease-time 600; max-lease-time 7200; next-server 192.168.1.10; filename "pxelinux.0"; }- 启用并启动DHCP服务:
sudo systemctl enable isc-dhcp-server sudo systemctl start isc-dhcp-server4. 操作系统镜像准备
4.1 下载Ubuntu Server镜像
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.2-live-server-amd64.iso -P /tmp4.2 挂载并提取镜像文件
- 创建挂载点并挂载ISO:
sudo mkdir /mnt/iso sudo mount -o loop /tmp/ubuntu-22.04.2-live-server-amd64.iso /mnt/iso- 复制内核和initrd:
sudo cp /mnt/iso/casper/vmlinuz /var/lib/tftpboot/ sudo cp /mnt/iso/casper/initrd /var/lib/tftpboot/- 复制完整ISO到HTTP目录:
sudo cp /tmp/ubuntu-22.04.2-live-server-amd64.iso /var/www/html/ubuntu/- 卸载ISO:
sudo umount /mnt/iso4.3 配置PXE引导菜单
创建PXE配置文件:
sudo nano /var/lib/tftpboot/pxelinux.cfg/default添加以下内容:
DEFAULT vesamenu.c32 PROMPT 0 TIMEOUT 50 MENU TITLE PXE Boot Menu LABEL Ubuntu 22.04 Auto Install MENU LABEL Ubuntu 22.04 Auto Install KERNEL vmlinuz INITRD initrd APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.1.10/ubuntu/ubuntu-22.04.2-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://192.168.1.10/ubuntu/5. 自动应答文件配置
5.1 创建cloud-init配置
- 创建meta-data文件:
sudo nano /var/www/html/ubuntu/meta-data内容:
instance-id: ubuntu-autoinstall local-hostname: ubuntu-server- 创建user-data文件:
sudo nano /var/www/html/ubuntu/user-data内容:
#cloud-config autoinstall: version: 1 identity: hostname: ubuntu-server password: "$6$exDY1mhS4KUYCE/2$zmn9ToZwTKLhCw.b4/b.ZRTIZM30JZ4QrOQ2aOXJ8yk96xpcCof0kxKwuX1kqLG/ygbJ1f8wxED22bTL4FAcP0" username: ubuntu ssh: install-server: true allow-pw: true packages: - openssh-server - qemu-guest-agent storage: layout: name: lvm user-data: disable_root: false late-commands: - sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /target/etc/ssh/sshd_config - echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/90-ubuntu注意:密码哈希可以使用以下命令生成:
openssl passwd -6然后输入密码
6. 客户端网络引导测试
- 确保客户端网卡支持PXE引导
- 在BIOS中启用网络引导
- 选择从网络启动后,应该能看到PXE引导菜单
- 选择"Ubuntu 22.04 Auto Install"开始自动安装
7. 常见问题排查
7.1 客户端无法获取IP地址
检查步骤:
- 确认PXE服务器和客户端在同一网络
- 检查DHCP服务状态:
sudo systemctl status isc-dhcp-server - 查看DHCP日志:
journalctl -u isc-dhcp-server -f
7.2 TFTP超时错误
解决方法:
- 检查TFTP服务是否运行:
sudo systemctl status tftpd-hpa - 验证防火墙设置:
sudo ufw allow 69/udp sudo ufw reload7.3 自动安装失败
排查方法:
- 检查HTTP服务是否能访问镜像文件
- 查看客户端启动参数是否正确
- 检查user-data和meta-data文件格式
8. 高级配置技巧
8.1 多系统支持
可以扩展PXE菜单支持多个操作系统:
LABEL CentOS 7 MENU LABEL CentOS 7 KERNEL centos7/vmlinuz INITRD centos7/initrd.img APPEND inst.repo=http://192.168.1.10/centos7 ks=http://192.168.1.10/centos7/ks.cfg8.2 磁盘分区定制
在user-data中自定义存储配置示例:
storage: config: - type: disk id: disk0 ptable: gpt wipe: superblock grub_device: true - type: partition id: boot-partition device: disk0 size: 1G flag: boot - type: partition id: root-partition device: disk0 size: 20G - type: format id: boot-format volume: boot-partition fstype: ext4 - type: format id: root-format volume: root-partition fstype: ext4 - type: mount id: boot-mount device: boot-format path: /boot - type: mount id: root-mount device: root-format path: /8.3 安全加固建议
- 限制DHCP范围避免与现有网络冲突
- 使用VLAN隔离PXE网络
- 定期清理TFTP目录中的临时文件
- 为PXE服务配置专用账户而非root
在实际部署中,我曾遇到一个典型问题:当同时有UEFI和Legacy BIOS客户端时,需要准备两套引导文件。解决方案是在TFTP根目录创建不同子目录分别存放BIOS和UEFI所需的引导文件,并在DHCP配置中根据客户端架构动态返回正确的文件名。