1. PXE与UEFI启动的基础概念解析
在开始搭建PXE服务器之前,我们需要先理解几个核心概念。PXE(Preboot eXecution Environment)是一种让计算机通过网络启动的技术,它允许客户端在没有本地存储设备的情况下从网络加载操作系统。而UEFI(Unified Extensible Firmware Interface)则是取代传统BIOS的现代固件接口标准。
1.1 PXE的工作原理
PXE启动过程大致分为以下几个步骤:
- 客户端开机后,网卡发送DHCP请求
- DHCP服务器回应,提供IP地址和PXE引导文件位置
- 客户端通过TFTP下载引导文件
- 执行引导文件,加载操作系统安装程序
这个过程中,最关键的是DHCP和TFTP两个服务的配合。DHCP负责告诉客户端去哪里找引导文件,而TFTP则负责实际传输这些文件。
1.2 UEFI与传统BIOS启动的区别
UEFI启动与传统的BIOS启动有几个关键区别:
- 分区表:UEFI使用GPT分区表,而传统BIOS使用MBR
- 引导文件位置:UEFI需要特定的引导文件路径(/EFI/BOOT/BOOTX64.EFI)
- 文件系统:UEFI可以直接读取FAT32分区,而传统BIOS需要特殊处理
理解这些区别对于正确配置PXE服务器至关重要,因为UEFI环境下的PXE配置与传统BIOS环境有很大不同。
2. 环境准备与软件安装
2.1 硬件与操作系统选择
对于PXE服务器,我推荐使用CentOS 7作为基础系统,原因如下:
- CentOS 7对UEFI支持良好
- 软件包管理方便(yum)
- 社区支持广泛,遇到问题容易找到解决方案
硬件方面,建议:
- 至少4GB内存
- 100GB以上存储空间(用于存放安装镜像)
- 千兆网卡(最好是两个,一个用于管理,一个用于PXE服务)
2.2 必要软件包安装
首先更新系统并安装必要软件包:
bash复制yum update -y
yum install -y dhcp tftp-server syslinux httpd
这里我们选择了以下几个关键组件:
- dhcp:提供IP地址分配和PXE引导信息
- tftp-server:传输引导文件
- syslinux:提供PXE引导所需的文件
- httpd:用于提供安装镜像(也可以用NFS或FTP)
2.3 防火墙与SELinux配置
为了确保服务能正常工作,需要调整防火墙和SELinux设置:
bash复制# 防火墙设置
firewall-cmd --add-service=dhcp --permanent
firewall-cmd --add-service=tftp --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# SELinux设置
setsebool -P httpd_read_user_content 1
setsebool -P tftp_home_dir 1
注意:在生产环境中,应该根据实际安全需求更精细地配置这些权限。
3. DHCP服务器配置
3.1 基础DHCP配置
编辑/etc/dhcp/dhcpd.conf文件,添加以下内容:
bash复制subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option domain-name-servers 8.8.8.8;
filename "grubx64.efi";
next-server 192.168.1.10; # PXE服务器的IP地址
}
关键参数说明:
- filename:指定UEFI环境下的引导文件名
- next-server:告诉客户端从哪里获取引导文件
3.2 UEFI特定的DHCP配置
为了让PXE同时支持传统BIOS和UEFI客户端,我们需要更复杂的配置:
bash复制# 传统BIOS客户端
if option arch = 00:00 {
filename "pxelinux.0";
}
# UEFI客户端
elsif option arch = 00:07 or option arch = 00:09 {
filename "grubx64.efi";
}
这个配置会根据客户端的架构类型提供不同的引导文件。
4. TFTP服务器配置
4.1 基础TFTP配置
编辑/etc/xinetd.d/tftp文件,确保配置如下:
bash复制service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot -v
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
然后启动服务:
bash复制systemctl enable xinetd
systemctl start xinetd
4.2 准备引导文件
将必要的文件复制到TFTP目录:
bash复制# 创建目录结构
mkdir -p /var/lib/tftpboot/uefi
mkdir -p /var/lib/tftpboot/pxelinux.cfg
# 复制syslinux文件
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/
# 准备UEFI引导文件
cp /boot/efi/EFI/centos/grubx64.efi /var/lib/tftpboot/uefi/
5. HTTP服务器配置
5.1 基础HTTP配置
我们将使用Apache来提供安装镜像。首先创建目录结构:
bash复制mkdir -p /var/www/html/centos7
然后挂载CentOS 7 ISO镜像:
bash复制mount -o loop CentOS-7-x86_64-Everything-2009.iso /var/www/html/centos7
为了让挂载在重启后依然有效,可以添加到/etc/fstab:
bash复制/path/to/CentOS-7-x86_64-Everything-2009.iso /var/www/html/centos7 iso9660 loop 0 0
5.2 配置自动安装
创建kickstart文件实现无人值守安装:
bash复制vi /var/www/html/ks.cfg
示例内容:
bash复制# 系统语言
lang en_US.UTF-8
# 键盘布局
keyboard us
# 网络配置
network --onboot yes --device eth0 --bootproto dhcp --noipv6
# 根密码
rootpw --plaintext yourpassword
# 认证配置
auth --useshadow --passalgo=sha512
# 时区
timezone Asia/Shanghai --isUtc
# 安装源
url --url="http://192.168.1.10/centos7"
# 系统引导装载程序
bootloader --location=mbr --boot-drive=sda
# 分区方案
clearpart --all --initlabel
autopart --type=lvm
# 软件包选择
%packages
@^minimal
@core
%end
# 安装后脚本
%post
# 禁用防火墙(根据需求调整)
systemctl disable firewalld
%end
6. GRUB2配置(UEFI专用)
6.1 创建GRUB2配置文件
在TFTP目录中创建GRUB2配置文件:
bash复制vi /var/lib/tftpboot/uefi/grub.cfg
内容如下:
bash复制set timeout=5
menuentry 'Install CentOS 7' {
linuxefi http://192.168.1.10/centos7/images/pxeboot/vmlinuz inst.repo=http://192.168.1.10/centos7 ks=http://192.168.1.10/ks.cfg
initrdefi http://192.168.1.10/centos7/images/pxeboot/initrd.img
}
6.2 关键参数说明
- linuxefi:指定内核文件位置(注意是http而不是tftp)
- inst.repo:指定安装源位置
- ks:指定kickstart文件位置
这种配置方式比传统PXE更灵活,因为我们可以直接从HTTP加载内核和initrd,而不受TFTP的大小限制。
7. 传统BIOS支持配置
虽然本文重点是UEFI,但为了兼容性,我们也应该配置传统BIOS支持。
7.1 创建PXELINUX配置文件
bash复制vi /var/lib/tftpboot/pxelinux.cfg/default
内容如下:
bash复制DEFAULT menu.c32
PROMPT 0
TIMEOUT 50
LABEL Install CentOS 7
KERNEL centos7/images/pxeboot/vmlinuz
APPEND initrd=centos7/images/pxeboot/initrd.img inst.repo=http://192.168.1.10/centos7 ks=http://192.168.1.10/ks.cfg
7.2 创建符号链接
为了让传统PXE能找到安装文件:
bash复制ln -s /var/www/html/centos7 /var/lib/tftpboot/centos7
8. 测试与排错
8.1 服务启动与验证
启动所有服务:
bash复制systemctl start dhcpd
systemctl start httpd
systemctl start xinetd
systemctl enable dhcpd
systemctl enable httpd
systemctl enable xinetd
验证服务状态:
bash复制netstat -tulnp | egrep 'dhcpd|httpd|xinetd'
8.2 常见问题排查
-
客户端获取不到IP地址:
- 检查dhcpd服务是否运行
- 检查防火墙是否阻止了DHCP请求
- 确认网线连接正常
-
客户端卡在TFTP传输:
- 检查tftp-server是否运行
- 检查/var/lib/tftpboot目录权限
- 使用tcpdump抓包分析
-
UEFI客户端无法引导:
- 确认提供了正确的grubx64.efi文件
- 检查DHCP配置中的filename参数
- 确认客户端设置为UEFI模式(非Legacy)
8.3 日志分析
关键日志位置:
- DHCP日志:/var/log/messages
- HTTP访问日志:/var/log/httpd/access_log
- TFTP日志:/var/log/messages(需要配置xinetd日志级别)
9. 高级配置与优化
9.1 多系统支持
可以在同一个PXE服务器上提供多个操作系统安装选项。只需:
- 为每个系统创建单独的目录
- 添加对应的GRUB2和PXELINUX菜单项
- 准备各自的kickstart文件
9.2 磁盘缓存优化
对于大规模部署,可以考虑:
- 使用NFS代替HTTP
- 配置squid缓存代理
- 使用本地镜像仓库
9.3 安全加固
生产环境中应该:
- 使用HTTPS代替HTTP
- 加密kickstart文件中的密码
- 限制DHCP范围
- 配置MAC地址白名单
10. 实际部署经验分享
在多年的PXE服务器部署中,我总结了以下几点经验:
-
网络隔离很重要:PXE网络最好与生产网络隔离,避免DHCP冲突。
-
镜像更新策略:定期检查并更新安装镜像,但不要频繁更改kickstart文件,保持一致性。
-
测试环境:始终先在测试环境验证配置,再应用到生产环境。
-
文档记录:详细记录每个配置项的作用,方便后续维护和排错。
-
性能监控:监控网络带宽和服务器负载,确保大规模部署时不会成为瓶颈。
对于UEFI环境,特别注意:
- 确保所有客户端固件更新到最新版本
- 不同厂商的UEFI实现可能有细微差异
- Secure Boot可能会影响PXE启动,必要时可以禁用它
