在本教程中,我将分享使用 Kickstart 配置 UEFI PXE 引导的分步说明。我已经在CentOS 8 环境中测试了这些步骤。我们将按以下顺序进行设置
我有两个支持 UEFI BIOS 的物理硬件。第一个服务器安装了 CentOS 8,而我们计划 UEFI PXE 引导第二个服务器,它也有 UEFI BIOS。这是我的服务器详细信息:
主机名: server.example.com
版本: CentOS Linux release 8.2.2004 (Core)
IP 地址: 192.151.6.151/26
首先,我们必须设置我们的安装仓库,它将用于网络安装。我已经在服务器上安装了 CentOS 8 ISO 映像
# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
接下来我将这个 ISO 的内容复制到本地目录,这样我就不必依赖 ISO 映像了。我将创建一个本地目录:
# mkdir /image
接下来将所有文件从 ISO 复制到此目录
# cp -apr /mnt/* /image/
复制所有文件后:
.treeinfo
和.discinfo
非常重要,否则您的安装会失败。这些是在使用 PXE 通过网络安装期间参考的,以验证存储库的完整性。 # 也可以挂载光盘使用,不拷贝光盘文件到硬盘
mkdir /mnt
mount -o exec /dev/sr0 /mnt
mkdir /image
mount --bind /mnt /image
接下来,我们需要一个 TFTP 服务器来传输通过网络安装目标节点所需的 UEFI PXE 引导文件。使用以下命令安装 tftp 包:
# dnf install tftp-server
安装软件包后,您可以使用以下命令检查 systemd 单元文件的路径:
# rpm -ql tftp-server | grep -E "service|socket"
接下来可以查看服务单元文件的内容:
# cat /usr/lib/systemd/system/tftp.service
在这里您可以看到,默认情况下 tftp 服务将搜索 .tftp 文件中的 TFTP 文件/var/lib/tftpboot
。所以我们将把我们所有的 UEFI PXE 引导文件放在这个位置。如果您打算使用不同的路径,那么您可以修改此服务文件并执行以下命令来更新您的更改:
# systemctl daemon-reload
# systemctl restart tftp.service
接下来启用并启动此服务以确保该服务在重新启动后自动启动。
# systemctl enable tftp.service --now
Created symlink /etc/systemd/system/sockets.target.wants/tftp.socket → /usr/lib/systemd/system/tftp.socket.
检查服务的状态以确保它已成功启动
# systemctl status tftp.service
提示:有可能一段时间后服务显示为非活动状态,这是意料之中的,因为它tftp.service
是通过tftp.socket
. 因此,如果没有活动连接,tftp.service
则该服务将变为非活动状态,一旦tftp.socket
收到任何 TFTP 请求,它将再次激活该服务。
接下来执行 UEFI {XE Boot 安装,我们需要 P PXE 引导文件。通常用于传统BIOS的PXE引导我们需要pxelinux.0
和ldlinux.c32
部分syslinux-tftpboot
转。
但是对于 UEFI BIOS,我们需要以下文件:
您可以将提到的 rpm 从映像复制到某个临时位置,例如/tmp
并提取 rpm 以获取所需的文件:
# cp /image/BaseOS/Packages/grub2-efi-x64-2.02-81.el8.x86_64.rpm /tmp/# cp /image/BaseOS/Packages/shim-x64-15-11.el8.x86_64.rpm /tmp/
接下来使用 rpm2cpio 命令提取这些 rpm。
# cd /tmp# rpm2cpio shim-x64-15-11.el8.x86_64.rpm | cpio -idm# rpm2cpio grub2-efi-x64-2.02-81.el8.x86_64.rpm | cpio -idm
我们将所有 PXE 文件存储在/var/lib/tftpboot/pxelinux
. 现在,如果您还记得,默认情况下 TFTP 会查看,/var/lib/tftpboot
因此我们必须pxelinux
在设置 UEFI PXE 引导服务器时处理额外的目录。
# mkdir /var/lib/tftpboot/pxelinux
将 PXE 引导文件从我们解压 rpm 的 /tmp 复制到以下位置:
# cp /tmp/boot/efi/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/pxelinux/# cp /tmp/boot/efi/EFI/centos/grubx64.efi /var/lib/tftpboot/pxelinux/
接下来,我们需要initrd
和vmlinuz
直到检测硬盘等接口文件来加载操作系统。我希望你熟悉Linux 启动过程的步骤。这些文件可以再次从图像中复制,因此我们将它们也复制并放置在里面/var/lib/tftpboot/pxelinux/
# cp /image/isolinux/vmlinuz /var/lib/tftpboot/pxelinux/# cp /image/isolinux/initrd.img /var/lib/tftpboot/pxelinux/
以下是我/var/lib/tftpboot/pxelinux
现阶段的内容:
# ls -l /var/lib/tftpboot/pxelinux/
接下来我们需要安装和配置DHCP来支持UEFI PXE Boot安装。
# dnf -y install dhcp-server
接下来,我们需要配置我们的 dhcp 服务器配置文件,该文件位于/etc/dhcp/dhcpd.conf
. 这是我的示例 DHCP 配置文件:
# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp-server/dhcpd.conf.example
# see dhcpd.conf(5) man page
#
non-authoritative;
allow bootp;
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.151.6.128 netmask 255.255.255.192 {option routers 192.151.6.190;range 192.151.6.170 192.151.6.180;class "pxeclients" {match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";next-server 192.151.6.151;filename "pxelinux/BOOTX64.EFI";}
}
我将无法解释整个配置文件,您可以查看 配置 DHCPV4 SERVER以获取更多信息。虽然让我至少解释这个配置文件的重要部分,即以下subnet
部分:
subnet 192.151.6.128 netmask 255.255.255.192 {option routers 192.151.6.190;range 192.151.6.170 192.151.6.180;class "pxeclients" {match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";next-server 192.151.6.151;filename "pxelinux/BOOTX64.EFI";}
}
在这里,我们已经基本定义了我们的子网和网络掩码值。您可以使用不同的 linux 命令来获得它,例如:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.151.6.190 0.0.0.0 UG 100 0 0 eno49
192.151.6.128 0.0.0.0 255.255.255.192 U 100 0 0 eno49
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
这里 eno49 是我们的主要接口,它具有192.151.6.128
子网和255.255.255.192
网络掩码值。选项路由器包含您的服务器 IP 的网关,我们可以再次使用以下命令获取:
# ip route
default via 192.151.6.190 dev eno49 proto static metric 100
192.151.6.128/26 dev eno49 proto kernel scope link src 192.151.6.151 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
这192.151.6.190
是我们的默认网关,它将充当所有传入 DHCP 请求的路由器。
接下来在类部分下,我们将 next-server 定义为我们的 Kickstart 服务器的 IP 地址,即 localhost,并filename
包含BOOTX64.EFI
将用于通过网络执行 UEFI PXE 引导的路径。
我们已经定义了一个介于192.151.6.170
和之间的范围,192.151.6.180
以将 IP 地址分配给将通过网络安装的目标节点。此范围必须是空闲的,并且不得被任何其他服务器使用。
接下来启用并启动 DHCP 服务器服务:
# systemctl enable dhcpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
检查服务的状态以确保它已成功启动:
接下来,我们将创建我们的 kickstart 文件以进行无人值守的自动安装。现在我已经解释了 kickstart 文件中使用的不同语法和参数,所以我在这里不再重复。
默认情况下,当我们安装 CentOS 或 RHEL 服务器时,我们将有/root/anaconda.cfg
可用的文件,其中包含用于当前安装的参数。您始终可以将此文件作为您的基础,并根据您的要求进一步修改它。
我将创建一个新目录来存储我们用于 UEFI PXE 引导的 kickstart 文件:
# mkdir /ks# cp /root/anaconda-ks.cfg /ks/kickstart.conf# chmod 777 /ks/kickstart.conf
确保所有用户都可以读取 kickstart.conf 文件:
# ls -l /ks/kickstart.conf
-rw-r--r--. 1 root root 1608 Nov 28 15:09 /ks/kickstart.conf
这是我的示例 kickstart 配置文件:
# cat /ks/kickstart.conf
#version=RHEL8
ignoredisk --only-use=sda,sdb
autopart --type=lvm# Partition clearing information
clearpart --all --initlabel --drives=sda,sdb# Use graphical install
graphical# Use CDROM installation media
cdrom# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'# System language
lang en_US.UTF-8# Network information
network --bootproto=dhcp --onboot=off --ipv6=auto
network --hostname=server.example.com# Create AppStream repo
repo --name="AppStream" --baseurl=http:///run/install/repo/AppStream# Root password
rootpw --iscrypted $6$tGzXiAuBPTVcSiLX$4YD9A43gq2QJ7r5TqtL8uCwtQQWRON.CDYNkRkEx2vcsnrA5Jbv44jvZUyhS28VrKr0aU8/E8csTDZcb.VYUY.# X Window System configuration information
xconfig --startxonboot# Run the Setup Agent on first boot
firstboot --enable# System services
services --enabled="chronyd"# System timezone
timezone Asia/Kolkata --isUtc
user --groups=wheel --name=deepak --password=$6$.TNszXKGs9V0flRV$J.1piXFKbXJHHH9dkZdIfWfoUdWkfWAgz5ZNHdoN42VudL.1rehBONmkEZv/nRyyWUDt3puHJIlAhIYRFGB7y. --iscrypted --gecos="deepak"%packages
@^minimal-environment%end%addon com_redhat_kdump --enable --reserve-mb='auto'%end%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'
命令生成加密密码,该密码可以在任何用户的 kickstart 文件中使用。
现在我们还需要一个服务来托管我们的图像存储库,我们可以使用 FTP、HTTP 或 NFS 来托管我们在本教程的第 1 步中创建的图像存储库。在我之前使用 Legacy BIOS 设置 kickstart 服务器的示例中,我使用了 NFS,所以这次我决定使用 HTTP 服务器。
# dnf -y install httpd
接下来我们将配置 Virtual Hosting 来托管我们的镜像仓库路径。我创建了一个新的文件ks-server.conf
下/etc/httpd/conf.d/
,内容如下:
所以在这里我基本上在我的 HTTP 服务器上提供两个不同的 PATH,即我的 kickstart 配置文件和我的图像存储库。我还提供了访问这些路径所需的权限,您可以查看 Apache DirectoryListings以获取更多信息。
接下来启用并启动 httpd 服务:
# systemctl enable httpd --now
确保服务已成功启动:
# systemctl status httpd
我们必须做的下一件重要事情是允许可见 HTTP 服务器中的隐藏文件,正如我之前提到的,通过网络安装需要使用.treeinfo
文件来验证存储库,这基本上是 Linux 中的隐藏文件。所以默认情况下,这个文件在 web 服务器上是不可见的。
所以要解决这个问题,我们必须.??*
从文件的IndexIgnore
参数中删除/etc/httpd/conf.d/autoindex.conf
。
修改
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
为
IndexIgnore *~ *# HEADER* README* RCS CVS *,v *,t
并重新启动 httpd 服务。
# systemctl restart httpd
接下来尝试通过 Web 服务器访问图像存储库路径:
类似地,尝试在 Web 浏览器上访问 kickstart 配置文件:
/etc/httpd/logs/ks-server.example.com-error_log
或ks-server.example.com-access_log
文件。
接下来更新/ks/kickstart.conf
我们在上面创建的 kickstart 文件中的图像存储库位置。由于我们使用的是 HTTP,所以我们需要替换cdrom
为以下行:
# Use CDROM installation media
url --url=http://192.151.6.151/image/AppStream
默认情况下,如果您使用 DVD 媒体安装了服务器,那么您将使用 DVD 媒体cdrom
作为安装媒体。因此,我们将其更改为包含安装图像的 HTTP url。
更新 AppStream repo url,默认使用 CDROMfile://
处理程序,但由于我们使用 HTTP,所以我们必须使用以下路径,另外还要提到 BaseOS 存储库的路径。
# Create AppStream repo
repo --name="AppStream" --baseurl=http://192.151.6.151/image/AppStream
repo --name="BaseOS" --baseurl=http://192.151.6.151/image/BaseOS
对于 UEFI PXE 引导,我们需要一个grub.cfg
文件,其中包含通过网络安装所需的 PXE 引导文件的详细信息。以下是我的grub.cfg
文件中的内容:
# cd /var/lib/tftpboot/pxelinux~]# cat grub.cfg
set timeout=30
menuentry 'Install CentOS 8' {linuxefi pxelinux/vmlinuz inst.ks=http://192.151.6.151/ks/kickstart.conf inst.stage2=http://192.151.6.151/image/ quietinitrdefi pxelinux/initrd.img
}
在这里,我们创建了一个带有 kickstart 配置文件位置的菜单项。在inst.stage2=
启动选项指定安装程序的运行时图像的位置。此选项需要包含有效.treeinfo
文件的目录的路径, 并从文件中读取运行时映像位置 .treeinfo
。
我们在防火墙中必须允许三种服务,即 DHCP、TFTP 和 HTTP。由于我们使用的是 firewalld,我们将使用 firewall-cmd 来启用这些服务/端口:
# firewall-cmd --add-service=http --add-service=tftp --add-service=dhcp --permanent
# firewall-cmd --reload
success
验证规则添加是否正确
# firewall-cmd --list-service
cockpit dhcp dhcpv6-client http ssh tftp
为了本教程,我将 SELinux 保持在 Permissive 模式。
# getenforce
Permissive
您还可以使用以下命令将其设置为许可模式
# setenforce 0
或者您也可以选择完全禁用它。
我们都准备好执行目标刀片的 UEFI PXE 引导,以通过网络安装它们。引导您的客户端节点并执行基于网络的安装。现在通过网络启动的快捷按钮可能因不同的硬件而异,但在大多数情况下,我们希望按 F12 从网络启动:
如果您的 UEFI PXE 启动服务器配置正确,那么 TFTP 文件应该会成功下载,如下所示
在下一个屏幕中,您将看到我们在grub.cfg
文件中配置的启动菜单条目。按 Enter 以使用 kickstart 配置文件开始自动安装:
打回车开始安装。如果您看到以下屏幕,则意味着您现在可以坐下来喝咖啡了!!
在本教程中,我们学习了如何使用 RHEL/CentOS 8 Linux 服务器创建 UEFI PXE 引导服务器。我已经分享了创建和设置您的 kickstart 服务器的分步说明。尽管还有许多其他方法可以实现相同的目标,例如您可以使用 DNSMASQ 代替 DHCP 或使用 FTP 或 NFS 代替 HTTP 来托管您的 kickstart 文件和映像存储库。因此,您可以根据需要自定义安装步骤。尽管本文应该为您提供一个基础来设置您的第一个 PXE 引导服务器。