目录
一、PXE 原理概述
1.1 基本概念
PXE 是一种基于 TCP/IP 协议的网络启动技术,它允许计算机在没有本地存储设备(如硬盘)或者操作系统的情况下,通过网络接口从远程服务器获取启动信息和操作系统镜像。PXE 主要依赖于 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)、TFTP(Trivial File Transfer Protocol,简单文件传输协议)和 HTTP/FTP/NFS 等协议来实现。
1.2 工作流程
- DHCP 发现阶段
客户端计算机(需要安装系统的机器)在开机时会向网络中广播 DHCP 发现请求(DHCPDISCOVER),寻找可用的 DHCP 服务器。DHCP 服务器接收到请求后,会为客户端分配一个 IP 地址,并通过 DHCP 提供(DHCPOFFER)消息返回给客户端。同时,DHCP 服务器还会在消息中包含 TFTP 服务器的地址和启动文件的名称。 - TFTP 下载阶段
客户端接收到 DHCP 提供消息后,会根据其中的 TFTP 服务器地址和启动文件名称,向 TFTP 服务器发送请求,下载启动文件(如 pxelinux.0 或 bootx64.efi)。启动文件是一个小型的引导程序,它会引导客户端进一步加载内核和初始化镜像。 - 内核和初始化镜像加载阶段
客户端下载并执行启动文件后,会通过启动文件从 TFTP 服务器或其他文件服务器(如 HTTP、FTP、NFS 服务器)下载内核(vmlinuz)和初始化镜像(initrd.img)。内核是操作系统的核心部分,初始化镜像则包含了启动系统所需的基本文件和驱动程序。 - 系统安装阶段
客户端加载内核和初始化镜像后,会根据预先配置的安装脚本(如 Kickstart 脚本)从文件服务器获取操作系统镜像,并开始自动安装操作系统。安装过程中,客户端会根据脚本中的配置信息进行分区、格式化、软件包安装等操作,最终完成系统的安装。
二、PXE 服务器搭建
2.1 环境准备
在搭建 PXE 服务器之前,需要准备以下环境:
- 硬件要求
- 一台服务器,建议配置至少 2GB 内存、50GB 硬盘空间和支持 PXE 功能的网卡。
- 网络连接稳定,建议使用千兆以太网。
- 软件要求
- 操作系统:建议使用 Linux 发行版,如 CentOS、Ubuntu 等。本文以 CentOS 7 为例进行介绍。
- 安装必要的软件包:DHCP 服务器、TFTP 服务器、HTTP 服务器、Syslinux 工具等。
2.2 安装和配置 DHCP 服务器
- 安装 DHCP 服务器
在 CentOS 7 中,可以使用以下命令安装 DHCP 服务器:
yum install -y dhcp
- 配置 DHCP 服务器
编辑 DHCP 服务器的配置文件/etc/dhcp/dhcpd.conf
,示例配置如下:
# 定义全局参数
option domain-name "example.com";
option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
# 定义子网
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;
next-server 192.168.1.20; # TFTP 服务器地址
filename "pxelinux.0"; # 启动文件名称
}
上述配置中,定义了一个子网 192.168.1.0/24
,并为客户端分配 IP 地址范围为 192.168.1.100 - 192.168.1.200
。同时,指定了 TFTP 服务器的地址和启动文件的名称。
3. 启动 DHCP 服务器
使用以下命令启动 DHCP 服务器并设置为开机自启:
systemctl start dhcpd
systemctl enable dhcpd
2.3 安装和配置 TFTP 服务器
- 安装 TFTP 服务器
在 CentOS 7 中,可以使用以下命令安装 TFTP 服务器和相关工具:
yum install -y tftp-server xinetd
- 配置 TFTP 服务器
编辑 TFTP 服务器的配置文件/etc/xinetd.d/tftp
,将disable
参数的值改为no
,示例如下:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
上述配置中,指定了 TFTP 服务器的根目录为 /var/lib/tftpboot
。
3. 启动 TFTP 服务器
使用以下命令启动 TFTP 服务器和 xinetd 服务并设置为开机自启:
systemctl start xinetd
systemctl enable xinetd
2.4 安装和配置 HTTP 服务器
- 安装 HTTP 服务器
在 CentOS 7 中,可以使用以下命令安装 HTTP 服务器(Apache):yum install -y httpd
- 配置 HTTP 服务器
编辑 HTTP 服务器的配置文件 /etc/httpd/conf/httpd.conf,可以根据需要进行一些基本配置,如修改监听端口、文档根目录等。 - 启动 HTTP 服务器
使用以下命令启动 HTTP 服务器并设置为开机自启
systemctl start httpd
systemctl enable httpd
2.5 准备启动文件和操作系统镜像
- 复制启动文件
将 Syslinux 工具提供的启动文件复制到 TFTP 服务器的根目录:cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
- 创建 PXELinux 配置目录和文件
在 TFTP 服务器的根目录下创建 PXELinux 配置目录和默认配置文件:
mkdir /var/lib/tftpboot/pxelinux.cfg
touch /var/lib/tftpboot/pxelinux.cfg/default
编辑 default
文件,示例配置如下:
default menu.c32
prompt 0
timeout 300
menu title PXE Boot Menu
label centos7
menu label ^Install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.1.20/centos7 ks=http://192.168.1.20/ks.cfg
上述配置中,定义了一个启动菜单,包含一个选项 Install CentOS 7
。当客户端选择该选项时,会加载内核 vmlinuz
和初始化镜像 initrd.img
,并从 HTTP 服务器获取 CentOS 7 的安装源和 Kickstart 脚本。
3. 复制内核和初始化镜像
将 CentOS 7 的内核和初始化镜像复制到 TFTP 服务器的根目录:
cp /path/to/centos7/images/pxeboot/vmlinuz /var/lib/tftpboot/
cp /path/to/centos7/images/pxeboot/initrd.img /var/lib/tftpboot/
4.挂载并复制操作系统镜像
将 CentOS 7 的安装光盘或 ISO 镜像挂载到一个临时目录,并将其中的文件复制到 HTTP 服务器的文档根目录:
mkdir /mnt/centos7
mount /dev/cdrom /mnt/centos7
cp -r /mnt/centos7 /var/www/html/
2.6 创建 Kickstart 脚本
Kickstart 脚本是一个自动化安装脚本,用于指定操作系统安装过程中的各种配置选项,如分区、软件包安装、网络配置等。创建一个 Kickstart 脚本文件 ks.cfg
,示例内容如下:
# 基本配置
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
# 安装方法
install
url --url=http://192.168.1.20/centos7
# 分区设置
clearpart --all --initlabel
part /boot --fstype=xfs --size=500
part swap --size=4096
part / --fstype=xfs --grow
# 网络配置
network --bootproto=dhcp --device=eth0
# 防火墙和 SELinux 配置
firewall --disabled
selinux --disabled
# 软件包选择
%packages
@^minimal
%end
# 安装后脚本
%post
# 可以在这里添加一些安装后需要执行的命令
%end
将 Kickstart 脚本文件复制到 HTTP 服务器的文档根目录:
cp ks.cfg /var/www/html/
三、客户端配置和测试
3.1 客户端 BIOS 设置
确保客户端计算机的 BIOS 中启用了 PXE 网络启动选项,并将其设置为第一启动项。不同品牌和型号的计算机 BIOS 设置方法可能有所不同,一般可以在开机时按特定的按键(如 F1、F2、Del 等)进入 BIOS 设置界面进行设置。
3.2 客户端测试
将客户端计算机连接到与 PXE 服务器相同的网络,开机后客户端会自动发送 DHCP 请求,从 DHCP 服务器获取 IP 地址和启动文件信息,然后从 TFTP 服务器下载启动文件、内核和初始化镜像,最后根据 Kickstart 脚本从 HTTP 服务器获取操作系统镜像并开始安装。
在安装过程中,可以通过客户端的显示器查看安装进度和日志信息。如果安装过程中出现问题,可以根据日志信息进行排查和解决。
四、高级配置和优化
4.1 多系统支持
如果需要支持多种操作系统的批量安装,可以在 PXELinux 配置文件 default
中添加更多的启动选项。例如,添加一个安装 Ubuntu 的选项:
label ubuntu
menu label ^Install Ubuntu
kernel ubuntu/vmlinuz
append initrd=ubuntu/initrd.img inst.repo=http://192.168.1.20/ubuntu ks=http://192.168.1.20/ubuntu-ks.cfg
同时,需要将 Ubuntu 的内核、初始化镜像和安装源文件复制到相应的目录,并创建对应的 Kickstart 脚本。
4.2 安全配置
为了提高 PXE 服务器的安全性,可以采取以下措施:
- 防火墙配置:配置防火墙规则,只允许客户端访问必要的端口(如 DHCP 端口 67、TFTP 端口 69、HTTP 端口 80 等)。
firewall-cmd --add-service=dhcp --permanent firewall-cmd --add-service=tftp --permanent firewall-cmd --add-service=http --permanent firewall-cmd --reload
- SELinux 配置:可以根据实际情况调整 SELinux 的策略,或者暂时禁用 SELinux。
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
4.3 性能优化
为了提高 PXE 网络装机的性能,可以采取以下措施:
- 网络优化:确保网络带宽足够,避免网络拥塞。可以使用交换机的 QoS 功能对 PXE 流量进行优先级设置。
- 存储优化:使用高速存储设备(如 SSD)作为 TFTP 服务器和 HTTP 服务器的存储介质,提高文件传输速度。
五、故障排除
5.1 DHCP 问题
如果客户端无法获取 IP 地址,可能是 DHCP 服务器配置有误或出现故障。可以通过以下方法进行排查:
- 检查 DHCP 服务器的日志文件
/var/log/dhcpd.log
,查看是否有错误信息。 - 使用
dhcping
工具测试 DHCP 服务器是否正常工作:dhcping -s 192.168.1.20
- 检查 DHCP 服务器的配置文件 /etc/dhcp/dhcpd.conf,确保配置正确。
5.2 TFTP 问题
如果客户端无法下载启动文件,可能是 TFTP 服务器配置有误或出现故障。可以通过以下方法进行排查:
- 检查 TFTP 服务器的日志文件
/var/log/messages
,查看是否有错误信息。 - 使用
tftp
工具测试 TFTP 服务器是否正常工作:tftp 192.168.1.20 tftp> get pxelinux.0
- 检查 TFTP 服务器的配置文件
/etc/xinetd.d/tftp
,确保配置正确。
5.3 HTTP 问题
如果客户端无法获取操作系统镜像或 Kickstart 脚本,可能是 HTTP 服务器配置有误或出现故障。可以通过以下方法进行排查:
- 检查 HTTP 服务器的日志文件
/var/log/httpd/access_log
和/var/log/httpd/error_log
,查看是否有错误信息。 - 使用
curl
工具测试 HTTP 服务器是否正常工作:curl http://192.168.1.20/centos7
- 检查 HTTP 服务器的配置文件
/etc/httpd/conf/httpd.conf
,确保配置正确