文档修改日志
日期 | 修改内容 | 修改人 | 备注 |
---|---|---|---|
2022年1月25日 | 创建 | 荣涛 | |
2022年1月26日 | PXE BIOS/UEFI | 荣涛 | |
2022年1月27日 | Kickstart | 荣涛 | |
2022年2月11日 | 补充 | 荣涛 |
引言
PXE(预启动执行环境,在操作系统之前运行)是由Intel公司开发的网络引导技术,工作在Client/Server模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统。
1. 搭建需要满足的条件
- 客户端
- 客户机的网卡要支持PXE协议(集成BOOTROM芯片),且主板支持网络引导。一般大多数服务器主机都支持,只需在BIOS设置中允许从 Network 或 LAN 启动即可。
- 客户端一旦启动,先向服务端DHCP请求IP地址,从TFTP接收启动文件。
- 服务端
- 网络中有一台 DHCP 服务器以便为客户机自动分配地址、指定引导文件位置。
- 服务器要通过 TFTP服务(简单文件传输协议)来提供系统内核和引导镜像文件的下载。
- 通过HTTP(s),FTP,NFS提供镜像安装源服务;
2. PXE装机流程
- 将ISO镜像或者安装树到HTTP(s),FTP,NFS服务器;
- 配置TFTP服务和DHCP服务,并且在PXE服务器上启动TFTP服务;
- 启动客户端开始安装;
GRUB2 boot loader不仅支持TFTP,而且支持HTTP的网络启动。但是使用HTTP发送vmlinuz和initrd启动文件可能失败,推荐使用TFTP服务器。
相关的参考链接:
- Creating installation sources for Kickstart installations
- Configuring a TFTP server for BIOS-based clients
- Configuring a TFTP server for UEFI-based clients
- Configuring a network server for IBM Power systems
搭建 PXE 远程安装服务器
1. 为基于BIOS的客户端配置PXE服务器
- 安装tftp
$ sudo dnf install tftp-server dhcp-server
- 1
- 允许外界访问tftp
$ sudo firewall-cmd --add-service=tftp
success
$ sudo firewall-cmd --reload
- 1
- 2
- 3
- 使用
SYSLINUX
配置DHCP服务,配置文件/etc/dhcp/dhcpd.conf
内容如下:
option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;
subnet 192.168.122.0 netmask 255.255.255.0 {
option routers 192.168.122.1;
range 192.168.122.221 192.168.122.224;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.122.22;
if option architecture-type = 00:07 {
filename "BOOTX64.efi";
} else {
filename "pxelinux/pxelinux.0";
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
我的PXE服务器的IP地址为192.168.122.22/24
,子网掩码255.255.255.0
,网关192.168.122.1
。
注意:如果你已经配置了DHCP服务,那么需要在DHCP服务器配置这一步。
- 访问
SYSLINUX
的pxelinux.0
文件
首先挂载ISO镜像,并重中找到syslinux-tftpboot
数据包(在ISO镜像中的路径可能为./AppStream/Packages/syslinux-tftpboot
,如果没有,使用syslinux-nonlinux
);
- 然后将其解压:
$ rpm2cpio syslinux-tftpboot-6.04-0.19.el9.noarch.rpm | cpio -div
- 1
解压后包含的文件如下:
$ pwd
/home/rongtao/syslinux-tftpboot/tftpboot
$ ls
cat.c32 dir.c32 ifcpu64.c32 libmenu.c32 pcitest.c32 sysdump.c32
chain.c32 disk.c32 ifcpu.c32 libutil.c32 pmload.c32 syslinux.c32
cmd.c32 dmi.c32 ifmemdsk.c32 linux.c32 poweroff.c32 vesa.c32
cmenu.c32 dmitest.c32 ifplop.c32 lpxelinux.0 prdhcp.c32 vesainfo.c32
config.c32 elf.c32 kbdmap.c32 ls.c32 pwd.c32 vesamenu.c32
cptime.c32 ethersel.c32 kontron_wdt.c32 lua.c32 pxechn.c32 vpdtest.c32
cpu.c32 gfxboot.c32 ldlinux.c32 mboot.c32 pxelinux.0 whichsys.c32
cpuid.c32 gpxecmd.c32 lfs.c32 memdisk reboot.c32 zzjson.c32
cpuidtest.c32 hdt.c32 libcom32.c32 meminfo.c32 rosh.c32
debug.c32 hexdump.c32 libgpl.c32 menu.c32 sanboot.c32
dhcp.c32 host.c32 liblua.c32 pci.c32 sdi.c32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 创建
/var/lib/tftpboot/pxelinux/
文件夹,将上面的文件都拷贝到/var/lib/tftpboot/pxelinux
下
$ sudo mkdir -p /var/lib/tftpboot/pxelinux
$ sudo cp /home/rongtao/syslinux-tftpboot/tftpboot/* /var/lib/tftpboot/pxelinux
- 1
- 2
- 创建
/var/lib/tftpboot/pxelinux/pxelinux.cfg/
文件夹
$ sudo mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg
- 1
- 在
/var/lib/tftpboot/pxelinux/pxelinux.cfg/
中创建名为default
的配置文件,内容如下:
default vesamenu.c32
prompt 1
timeout 600
display boot.msg
label linux
menu label ^Install CCLinux 2203 rc1
menu default
kernel images/cclinux-2203-rc1-x86_64/vmlinuz
append initrd=images/cclinux-2203-rc1-x86_64/initrd.img ip=dhcp inst.repo=http://192.168.122.22/CCLinux-2203-x86_64-rc1/
label vesa
menu label Install CCLinux 2203 rc1 with ^basic video driver
kernel images/cclinux-2203-rc1-x86_64/vmlinuz
append initrd=images/cclinux-2203-rc1-x86_64/initrd.img ip=dhcp inst.xdriver=vesa nomodeset inst.repo=http://192.168.122.22/CCLinux-2203-x86_64-rc1/
label rescue
menu label ^Rescue installed CCLinux 2203 rc1
kernel images/cclinux-2203-rc1-x86_64/vmlinuz
append initrd=images/cclinux-2203-rc1-x86_64/initrd.img rescue
label local
menu label Boot from ^local drive
localboot 0xffff
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
注意
- 没有运行时镜像,安装程序将不起作用。使用
inst.stage2
启动选项指定安装镜像的位置;- 安装源位置用
inst.repo
指定,必须包含.treeinfo
文件;- 当你选择一个DVD作为安装源,
.treeinfo
文件指向BaseOS
和AppStream
仓库。- 当使用kickstart时,需要添加
inst.ks=
选项,具体参考Kickstart的配置文档(在/var/lib/tftpboot/pxelinux/pxelinux.cfg/default
配置文件对应位置添加inst.ks=http://192.168.122.174/kickstart/cclinux-2203-x86_64.cfg
选项。)
- 在
/var/lib/tftpboot/
中创建子目录,并拷贝启动镜像文件。例如:
$ sudo mkdir -p /var/lib/tftpboot/pxelinux/images/cclinux-2203-rc1-x86_64/
$ pwd
/var/www/html/CCLinux-2203-x86_64-rc1
$ sudo cp images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/images/cclinux-2203-rc1-x86_64/
- 1
- 2
- 3
- 4
- 在DHCP服务器上,开启使能DHCP服务。
$ sudo systemctl start dhcpd
$ sudo systemctl enable dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
- 1
- 2
- 3
- 开启使能tftp服务
$ sudo systemctl start tftp.service
$ sudo systemctl enable tftp.service
- 1
- 2
并查看tftp服务端口
$ netstat -a | grep tftp
udp6 0 0 [::]:tftp [::]:*
- 1
- 2
PXE启动服务器现在就配置完成了,你可以用PXE方式启动客户端了。
如果说PXE服务器是虚拟机环境,那么可以在组主机上测试使用pxe安装,如下:
#!/bin/bash
OS_NAME=os-1
sudo virt-install \
--virt-type=kvm \
--name $OS_NAME\
--memory 8192 \
--vcpus 8 \
--os-type=linux \
--os-variant=centos-stream9 \
--pxe \
--network=default,model=virtio \
--disk path=/var/lib/libvirt/images/$VM_NAME.qcow2,size=10,format=qcow2 \
--check all=off
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
安装过程中仍旧需要手动配置anaconda流程,这需要kickstart,后文将对kickstart简述。
注意:
- 防火墙导致PXE的下载成功和失败。
- PXE过程可以进行抓包测试
tcpdump -i enp0s8 port 67 or port 68 or port 69 or port 80 -n -e -vv
。
2. 为基于UEFI的客户端配置PXE服务器
重要
- 本章节所有配置文件都为示例。配置详情取决于你的架构和需求;
- 红帽UEFI PXE启动支持基于小写MAC地址格式的grub菜单文件,例如,
grub.cfg-01-aa-bb-cc-dd-ee-ff
步骤
- root用户,安装tftp和dhcp服务(与BIOS章节相同)
- 允许外界访问tftp(与BIOS章节相同)
- 配置DHCP服务器,(与BIOS章节相同)
- 挂载ISO镜像,获取rpm包
shim
和grub2-efi
; - 从
shim
包中提取BOOTX64.efi
文件,从grub2-efi
中提取grubx64.efi
文件(BOOTX64.EFI
文件注意大小写):
$ rpm2cpio shim-x64-15-15.el8_2.x86_64.rpm | cpio -div
$ rpm2cpio grub2-efi-x64-2.06-13.el9.x86_64.rpm | cpio -div
- 1
- 2
于是乎就得到了BOOTX64.EFI
(注意大小写)和grubx64.efi
文件。
- 创建文件夹
mkdir /var/lib/tftpboot/uefi
并拷贝文件
$ pwd
/home/rongtao/grub2-efi/boot/efi/EFI/centos
$ sudo cp grubx64.efi /var/lib/tftpboot/uefi
- 1
- 2
- 3
- 在
/var/lib/tftpboot/
目录中添加一个配置文件grub.cfg
,内容如下:
set timeout=60
menuentry 'CCLinux 2203 rc1' {
linuxefi images/cclinux-2203-rc1-x86_64/vmlinuz ip=dhcp inst.repo=http://192.168.122.22/CCLinux-2203-x86_64-rc1/
initrdefi images/cclinux-2203-rc1-x86_64/initrd.img
}
- 1
- 2
- 3
- 4
- 5
这可以参考上文BIOS配置过程中创建的文件/var/lib/tftpboot/pxelinux/pxelinux.cfg/default
。
注意:参考BIOS配置过程中的注意事项(关于
repo
,.treeinfo
,BaseOS
,AppStream
)
- 在
/var/lib/tftpboot/
中创建子目录,并拷贝启动镜像文件。(与BIOS章节相同) - 启动并使能dhcp;(与BIOS章节相同)
- 启动并使能tftp;(与BIOS章节相同)
TODO:由于我是在虚拟机环境测试的,我的virt-install版本
2.2.1
不支持uefi,所以并没有测试。
3. 为IBM Power系统配置网络服务器
略。
安装过程可能遇到的问题
1. No DEFAULT or UI configuration directive found!
注意在配置文件/var/lib/tftpboot/pxelinux/pxelinux.cfg/default
指定的default vesamenu.c32
在/var/lib/tftpboot/pxelinux/vesamenu.c32
是否存在。
2. DHCP: via enp1s0: unknown lease 192.168.122.34.
2. PXE: No more network device
2. PXE: Nothing to boot: No such file or directory
查看systemctl status dhcpd
显示
2月 11 15:08:14 localhost.localdomain dhcpd[1920]: DHCPDISCOVER from 52:54:00:ee:17:09 via enp1s0
2月 11 15:08:15 localhost.localdomain dhcpd[1920]: DHCPOFFER on 192.168.122.191 to 52:54:00:ee:17:09 via enp1s0
2月 11 15:08:22 localhost.localdomain dhcpd[1920]: DHCPREQUEST for 192.168.122.34 (192.168.122.1) from 52:54:00:ee:17:09 via enp1s0: unknown lease 192.168.122.34.
- 1
- 2
- 3
参考链接
检查
Firewall – Check ufw has rules setup for Port 69
tftpd – Check daemon listening on Port 69
dhcpd – Check Running and no lease issues.
No File – Check the pxelinux.0 file is actually on the server!
TFTP命令
使用tftp命令下载tftp服务上的文件。
查看
[rongtao@localhost ~]$ arp -a| grep 192
? (192.168.122.191) at <incomplete> on enp1s0
? (192.168.122.190) at <incomplete> on enp1s0
? (192.168.122.110) at <incomplete> on enp1s0
? (192.168.122.109) at 52:54:00:0e:41:1e [ether] on enp1s0
? (192.168.122.42) at <incomplete> on enp1s0
? (192.168.122.34) at <incomplete> on enp1s0
_gateway (192.168.122.1) at 52:54:00:28:f6:80 [ether] on enp1s0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
使用命令arp -d 192.168.122.191
删除<incomplete>
IP地址。
=====================================================================================================
搭建 PXE 远程安装服务器-OLD-Fatal
1. 安装并启用 TFTP 服务
1.1. 安装TFTP服务
$ sudo dnf -y install tftp-server xinetd
- 1
1.2. 修改TFTP服务的配置文件并启动
vim /etc/xinetd.d/tftp
protocol = udp #TFTP默认使用UDP协议
wait = no #no表示客户机可以多台一起连接,yes表示客户机只能一台一台连接
server_args = -s /var/lib/tftpboot #指定TFTP根目录(引导文件的存储路径)
disable = no #no表示开启TFTP服务
- 1
- 2
- 3
- 4
- 5
# default: off
# Description: The tftp server serves files using the trivial file transfer
# protocol, Thsi tftp protocol is oftern used to boot diskless
# workstations, download configuration file to network-aware printers,
# and to start the installation process for some operation systemds.
# https://blog.csdn.net/ItookapillinNJ/article/details/114122524
service tftp
{
socket_type = dgram
protocol = udp
wait = no
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
开启服务
systemctl start tftp
systemctl start xinetd
- 1
- 2
2. 安装DHCP服务
$ sudo dnf install dhcp-server
- 1
配置:
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp-server/dhcpd.conf.example
# see dhcpd.conf(5) man page
#
ddns-update-style interim;
ignore client-updates;
filename "grubaa64.efi";
next-server 192.168.122.22;
subnet 192.168.122.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.122.213 192.168.122.215;
default-lease-time 600;
max-lease-time 7200;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
3. 准备 Linux 内核、初始化镜像文件
$ sudo cp vmlinuz /var/lib/tftpboot/
$ sudo cp initrd.img /var/lib/tftpboot/
- 1
- 2
4. 准备 PXE 引导程序
$ sudo dnf install syslinux
$ sudo cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
- 1
- 2
5. 安装FTP服务,准备CentOS 7 安装源
我先使用httpd试试。
6. 配置启动菜单文件
$ sudo mkdir /var/lib/tftpboot/pxelinux.cfg
- 1
7. 关闭防火墙,验证 PXE 网络安装
8. 验证pxe安装
参考PERFORMING AN ADVANCED RHEL INSTALLATION
参考链接
- PERFORMING AN ADVANCED RHEL INSTALLATION
- Chapter 14, Preparing to install from the network using PXE.
- Creating installation sources for Kickstart installations
- Configuring a TFTP server for BIOS-based clients
- Configuring a TFTP server for UEFI-based clients
- Configuring a network server for IBM Power systems
- 搭建PXE装机服务器(实验详解)
- Troubleshoot: PXE boot Server