假设存在服务器A、B、C
其中A为待装系统的服务器,DHCP(IP池:192.168.0.150~192.168.0.160),假设需要安装的系统为Ubuntu 22.04 Desktop
其中B为PXE服务端服务器,IP: 192.168.0.100,这里将以CentOS系统进行说明
其中C为NFS所在服务器,IP: 192.168.1.101
PXE的基本原理
PXE 基本原理与启动流程
一、PXE 启动流程
1. 网卡准备:
设备 A 网卡的 PXE 功能模块就绪,这是启动的初始状态,为后续网络引导操作做好准备。
2. IP 申请:
设备 A 网卡通过 DHCP Client 向本网段广播,请求分配 IP 地址。此步骤确保设备 A 能接入网络,获得通信基础。
3. 配置下发:
DHCP Server 响应请求,为设备 A 下发 IP 地址,同时在 DHCP 报文中包含关键配置。其中 Option 66 用于指定引导文件名称,Option 67 用于指定引导文件所在设备 B 的 IP,为设备 A 指明引导资源位置。
4. 引导文件获取:
设备 A 获得 IP 及引导指向信息后,使用 TFTP 协议连接设备 B,读取并加载指定引导文件。例如常见的引导文件有 netboot 中的 pxelinux.0,加载该文件后,还会同时加载 pxelinux.0/default 的菜单配置文件,此配置文件将决定后续加载走向。
5. 内核与初始化磁盘加载:
依据菜单配置文件设定,设备 A 从 TFTP 服务器加载内核(vmlinuz)与初始化磁盘(intrd),为系统启动提供核心支撑。
6. 后续引导执行:
加载的内核依据不同参数执行不同操作。
- 可通过 http 协议加载引导指定 URL中的 ISO 文件,实现基于网络的系统镜像引导。
- 还能通过 NFS 协议加载引导指定的 NFS 目录(形式为设备 C 的 IP:/<NFS 共享路径>,这里的目录 要求是 ISO 文件通过 mount -o loop 在 NFS Server 上挂载后的映射目录),以适配不同网络存储的引导需求。
二、启动过程控制权移交过程
- 启动之初,系统控制权在 BIOS,它负责硬件初始化等基础操作。
- 随着 PXE 启动流程推进,控制权移交给 PXE ROM,PXE ROM 开始介入网络引导相关操作。
- 接着控制权转移至 pxelinux.0,由它进一步协调引导文件加载、配置读取等工作。
- 之后控制权到相对于 pxelinux.0 的 vmlinuz 与 intrd,此时开始为内核启动做准备,加载必要的内核与初始化磁盘。
- 最后控制权进入 ISO 中的 vmlinuz 与 intrd 或者 ISO 中指定的其他引导过程,完成系统的深度引导,直至系统启动完成。
配置过程
1. 修改DHCP Server配置
为DHCP服务端添加Option 66与Option 67配置项,66请设定为“pexlinux.0”(不含引号);67请设定为服务器B的IP地址
2. 搭建用于PXE启动的TFTP服务器(服务器B配置)
netboot.tar.gz下载地址:ubuntu.com/ubuntu/dists/focal/main/installer-amd64/current/legacy-images/netboot/netboot.tar.gz" rel="nofollow">netboot.tar.gz
以下是在 CentOS 7.9 系统下,PXE 所在服务器的基本配置步骤:
a. 安装相关服务:
通过命令 yum install xinetd tftp-server -y 安装 xinetd 和 tftp-server。xinetd 是一种超级服务器,用于管理多种网络服务,TFTP 服务常用于 PXE 启动过程中的文件传输,安装这两个服务为后续 PXE 功能实现提供基础。
b. 配置 TFTP 服务:
使用 vim /etc/xinetd.d/tftp 编辑 tftp 服务配置文件,将 disable = yes 改为 disable = no,这一步是启用 TFTP 服务,使其能正常响应客户端的文件传输请求。
c. 服务管理操作:
依次执行以下命令:
systemctl daemon-reload # 重新加载 systemd 守护进程配置,确保新的服务配置生效。
systemctl reload xinetd # 重新加载 xinetd 服务,应用对其配置的更改,如 TFTP 服务的启用设置。
systemctl reload tftp # 同样重新加载 tftp 服务,保证服务状态更新。
systemctl -s enable xinetd # 作用是设置 xinetd 服务开机自启,确保服务器重启后 PXE 相关服务依然可用。
systemctl -s enable tftp # 设置 tftp 服务开机自启。
systemctl restart xinetd # 重启 xinetd 服务,让配置完全生效,启动相关网络服务监听。
systemctl restart tftp # 重启 tftp 服务,确保其以正确配置运行,准备好传输文件。
d. 准备引导文件:
将 netboot.tar.gz 放入 /var/lib/tftpboot 中,并解压缩:tar zxvf netboot.tar.gz。这些引导文件是 PXE 启动过程中客户端所需的基础文件,解压缩到指定目录以供后续访问。
e. 放置内核及初始化文件:
执行 mkdir /var/lib/tftpboot/ubuntu,创建用于存放 ubuntu 相关文件的目录,然后将 ubuntu 安装光盘镜像中的 casper/initrd 与 casper/vmlinuz 放入 /var/lib/tftpboot/ubuntu 中,文件名不变。这些内核与初始化文件是启动 ubuntu 系统的关键组件,放在指定位置供客户端加载。
f. 修改启动配置:
修改 /var/lib/tftpboot/ubuntu-installer/amd64/boot-screens/txt.cfg,将 Install 选项的内容改为:
kernel ubuntu/vmlinuzappend vga=768 initrd=ubuntu/initrd boot=casper root=/dev/ram0 ramdisk_size=1500000 netboot=nfs ro nfsroot=192.168.1.101:/mnt/iso ip=dhcp
这一步是定制启动参数,指定内核、初始化文件路径,设置网络启动方式(如通过 NFS)、根文件系统挂载点等,确保客户端能按预期启动系统。
其中192.168.1.101 为服务器C的IP地址。
g. 防火墙配置:
针对于服务器A:
- 放行UDP 69出站用于主动连接访问TFTP服务端
- 放行UDP 入站,用于被动接收TFTP服务端发来的文件数据流
针对与服务器B:
- 放行UDP 69入站,用于接受TFTP客户端的访问
- 放行UDP 出站,用于主动向TFTP客户端发送文件数据流
3. 搭建用于Ubuntu安装过程中的NFS共享并提供光盘镜像(服务器C配置)
搭建过程以CentOS 7.9环境进行举例
请自行准备好安装光盘ISO文件,这里假设文件名为ubuntu22.04.iso,所在路径为:/opt/media/ubuntu22.04.iso
a. 创建挂载目录:
通过命令 mkdir /mnt/iso 创建用于挂载目标目录。这个目录将作为后续挂载 iso 文件的挂载点,为共享资源提供存储位置。
b. 挂载 iso 文件:
执行 mount -o loop /opt/media/ubuntu22.04.iso /mnt/iso,将 iso 文件挂载到 /mnt/iso 路径下。这样操作后,iso 文件中的内容就可以像本地目录一样被访问,方便后续通过 NFS 进行共享。
c. 安装 NFS 组件:
使用 yum install nfs-common nfs-server nfs-utils -y 安装 NFS 服务端所需的各类组件。其中 nfs-common 提供了一些通用的 NFS 功能支持,nfs-server 是 NFS 服务的核心组件,负责提供共享服务,nfs-utils 包含了一些实用工具,它们协同工作,确保 NFS 服务能够正常运行。
d. 配置 NFS 共享:
用 vim /etc/exportfs 编辑配置文件,并插入一行:/mnt/iso (ro, all_squash)。这行配置表示将 /mnt/iso 目录以只读(ro)方式共享给所有客户端(),并且使用 all_squash 选项将所有用户的访问权限都压缩为匿名用户权限,这在一些安全要求较高或者统一权限管理的场景下较为常用,确保共享资源的访问可控。
e. 重载 NFS 共享配置:
执行 exportfs -rv,此命令用于重新加载 NFS 共享配置,使之前在 /etc/exportfs 中所做的配置更改生效,让客户端能够按照新配置访问共享资源。
f. 防火墙配置:
针对于服务器C:
- 放行TCP 协议与 UDP 协议的 2049 端口的入站
- 放行 rpcbind 相关的端口的入站
针对于服务器A:
- 放行TCP协议与UDP协议的2049端口的出站
- 放行rpcbind相关端口的出站