服务器无光驱时,通过网络安装系统最通用的做法是使用 pxe(预启动执行环境)配合 dhcp 和 tftp 服务,将操作系统镜像部署到目标机器。具体操作需要在局域网内搭建一个包含 dhcp、tftp 和 http/nfs 服务的引导服务器,配置客户端网卡从网络启动,并指定内核与根文件系统的加载路径。这样可以在开机自检阶段直接通过网络获取引导程序,进而完成整个系统的安装过程。

PXE 引导流程中各组件如何协作
PXE 架构依赖三个核心服务协同工作:DHCP 负责分配 IP 并告知下一步下载位置,TFTP 用于传输轻量级的引导加载程序,而 HTTP 或 NFS 则提供完整的操作系统镜像。当服务器网卡发起请求时,首先通过 UDP 端口 67/68 获取 IP 地址及 TFTP 服务器的地址信息,随后连接 TFTP 端口 69 下载 bootloader,最后由 bootloader 解析配置文件指向实际的软件源进行安装。

#!/bin/bash
# 1. 安装必要服务
yum install -y dhcp tftp-server httpd syslinux-tftpboot
# 2. 配置 DHCP (假设网段为 192.168.1.0/24)
cat > /etc/dhcp/dhcpd.conf <<EOF
domain-name "local";
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.10; # TFTP服务器IP
filename "pxelinux.0"; # 引导文件名
}
EOF
# 3. 准备 TFTP 目录
mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /path/to/isolinux/isolinux.bin /var/lib/tftpboot/
# 4. 挂载 ISO 到 HTTP 目录
mount -o loop,ro CentOS-7-x86_64-DVD.iso /var/www/html/os
# 5. 创建默认引导配置
cat > /var/lib/tftpboot/pxelinux.cfg/default <<EOF
default linux
prompt 1
timeout 600
label linux
kernel vmlinuz
append initrd=initrd.img repo=http://192.168.1.10/os quiet
EOF
# 6. 复制内核和初始化镜像
cp /var/www/html/os/images/pxeboot/vmlinuz /var/lib/tftpboot/
cp /var/www/html/os/images/pxeboot/initrd.img /var/lib/tftpboot/
# 7. 启动服务
systemctl enable --now dhcpd tftp httpd上述脚本展示了基于 CentOS/RHEL 环境的完整配置步骤。执行后,DHCP 服务会响应客户端的广播请求,指引其去 TFTP 服务器下载 pxelinux.0。接着,客户端执行该二进制文件,读取同目录下的 default 配置文件,从中获取 vmlinuz 和 initrd.img 的路径。最后,内核启动并挂载 HTTP 服务器上的 /os 目录作为软件源,开始图形化或文本模式安装。
UEFI 模式下网络安装的差异处理
现代服务器大多默认启用 UEFI 而非 Legacy BIOS,这导致 PXE 引导机制需要适配不同的固件接口。UEFI 环境下通常使用 EFI Shell 或专门的 UEFI PXE 驱动,引导文件不再是 pxelinux.0,而是符合 UEFI 规范的 shimx64.efi 或 grubx64.efi。此外,TFTP 协议在传输大文件时效率较低,因此在 UEFI 场景中常结合 HTTP 或 HTTPS 直接下载较大的内核镜像,或者使用 iPXE 这种支持更丰富协议的二次引导工具。

# 针对 UEFI 环境的额外配置步骤
# 1. 安装 GRUB2 EFI 包
yum install -y grub2-efi-x64-modules
# 2. 复制 EFI 引导文件到 TFTP 根目录
cp /usr/share/grub2/x86_64-efi/shimx64.efi /var/lib/tftpboot/
cp /usr/share/grub2/x86_64-efi/grubx64.efi /var/lib/tftpboot/
# 3. 修改 DHCP 配置以区分 UEFI 客户端
# 注意:需根据客户端的 Vendor Class Identifier 区分
option vendor-class-identifier code 245 = text ;
if exists user-class and index (user-class, 0) = 0 {
if substring (user-class, 0, 9) = "PXEClient" {
# Legacy BIOS
filename "pxelinux.0";
} else if substring (user-class, 0, 14) = "PXEClient:Arch" {
# UEFI 64-bit
filename "grubx64.efi";
}
}
# 4. 配置 GRUB 菜单以加载内核
cat > /var/lib/tftpboot/grub.cfg <<EOF
menuentry "Install OS UEFI" {
set root='(tftp)'
linux /vmlinuz repo=http://192.168.1.10/os quiet
initrd /initrd.img
}
EOF在 UEFI 模式下,关键变化在于引导加载程序的格式和 DHCP 的识别逻辑。代码中通过检查 user-class 选项来区分 Legacy 和 UEFI 客户端,从而返回不同的 filename。对于 UEFI 客户端,它下载 grubx64.efi,该文件是一个标准的 EFI 应用程序,能够被主板固件直接执行。GRUB 配置文件中依然使用 tftp 设备名来定位本地 TFTP 服务器上的资源,但后续的内核加载可以配置为直接从 HTTP 服务器拉取,以规避 TFTP 的单线程瓶颈。这种混合模式既保证了初始引导的兼容性,又提升了大规模部署时的速度。
如何验证网络安装是否成功加载了正确的软件源
在网络安装过程中,最常见的失败原因是软件源路径错误或网络不通。验证这一环节最直接的方法是观察安装程序启动后的日志输出,特别是 repo=http://... 参数是否被正确解析。如果安装界面卡在“Loading installer components”或报错“Cannot resolve host”,说明 DHCP 或 TFTP 阶段正常,但后续的 HTTP 访问受阻。此时应检查防火墙是否放行 80 端口,以及 SELinux 是否阻止了 HTTPD 服务读取挂载的 ISO 内容。
为了快速验证,可以在客户端安装界面按 Ctrl+Alt+F2 切换到终端,手动执行 wget -q http://192.168.1.10/os/repodata/repomd.xml -O -。如果返回 XML 内容,证明软件源可达且权限正确;如果返回连接超时或 404,则需调整 append 行中的 URL 路径或检查 Web 服务器状态。确认无误后切回 Ctrl+Alt-F1 继续安装即可。

















