在本教程中,我将分享使用 Kickstart 配置 UEFI PXE 引导的分步说明。我已经在CentOS 8 环境中测试了这些步骤。我们将按以下顺序进行设置 

使用 Kickstart 执行 UEFI PXE 引导的顺序

  1. 设置安装库
  2. 安装和配置 TFTP
  3. 安装和配置 DHCP
  4. 安装和配置 HTTP
  5. 准备启动文件
  6. 执行 UEFI PXE 引导 

实验室环境

我有两个支持 UEFI BIOS 的物理硬件。第一个服务器安装了 CentOS 8,而我们计划 UEFI PXE 引导第二个服务器,它也有 UEFI BIOS。这是我的服务器详细信息:

主机名: server.example.com
版本: CentOS Linux release 8.2.2004 (Core)
IP 地址: 192.151.6.151/26
 

先决条件

  • 您必须在服务器上安装 RHEL/CentOS 8 操作系统。现在这个服务器可能有也可能没有 UEFI BIOS。
  • 如果您使用的是 RHEL 8,那么您必须有一个有效的 RHN 订阅
  • 如果您使用的是 CentOS 8,那么您必须具有有效的互联网连接才能下载和安装软件包。如果您的服务器没有活动的互联网连接,您也可以配置离线存储 

使用 Kickstart 配置 UEFI PXE 引导服务器的步骤

步骤 1:设置安装存储

首先,我们必须设置我们的安装仓库,它将用于网络安装。我已经在服务器上安装了 CentOS 8 ISO 映像

# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.

接下来我将这个 ISO 的内容复制到本地目录,这样我就不必依赖 ISO 映像了。我将创建一个本地目录:

# mkdir /image

接下来将所有文件从 ISO 复制到此目录

提示:
您将需要大约 10GB 的存储空间来将所有文件从 ISO 复制到本地目录。
# cp -apr /mnt/* /image/

复制所有文件后:

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

重要提示:
从映像复制.treeinfo.discinfo非常重要,否则您的安装会失败。这些是在使用 PXE 通过网络安装期间参考的,以验证存储库的完整性。  
# 也可以挂载光盘使用,不拷贝光盘文件到硬盘
mkdir /mnt
mount -o exec /dev/sr0  /mnt
mkdir /image
mount --bind /mnt /image

步骤 2:安装和配置 TFTP 服务器

接下来,我们需要一个 TFTP 服务器来传输通过网络安装目标节点所需的 UEFI PXE 引导文件。使用以下命令安装 tftp 包:

# dnf install tftp-server

安装软件包后,您可以使用以下命令检查 systemd 单元文件的路径:

# rpm -ql tftp-server | grep -E "service|socket"

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

接下来可以查看服务单元文件的内容:

# cat /usr/lib/systemd/system/tftp.service

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

在这里您可以看到,默认情况下 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

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

提示:有可能一段时间后服务显示为非活动状态,这是意料之中的,因为它tftp.service是通过tftp.socket. 因此,如果没有活动连接,tftp.service则该服务将变为非活动状态,一旦tftp.socket收到任何 TFTP 请求,它将再次激活该服务。 

步骤 3:配置 UEFI PXE 引导服务器

接下来执行 UEFI {XE Boot 安装,我们需要 P PXE 引导文件。通常用于传统BIOS的PXE引导我们需要pxelinux.0ldlinux.c32部分syslinux-tftpboot转。

但是对于 UEFI BIOS,我们需要以下文件:

  • grubx64.efi由 grub2-efi-x64 rpm 提供
  • BOOTX64.EFI由 shim-x64 rpm 提供

您可以将提到的 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/

接下来,我们需要initrdvmlinuz直到检测硬盘等接口文件来加载操作系统。我希望你熟悉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/

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

 

步骤 4:为 UEFI PXE 引导配置 DHCP

接下来我们需要安装和配置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 [RHEL/CentOS 8] 配置 UEFI PXE 启动

 

步骤 5:配置 Kickstart 文件以进行自动安装

接下来,我们将创建我们的 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 文件中使用。

 

步骤 5:配置 HTTP 服务器

现在我们还需要一个服务来托管我们的图像存储库,我们可以使用 FTP、HTTP 或 NFS 来托管我们在本教程的第 1 步中创建的图像存储库。在我之前使用 Legacy BIOS 设置 kickstart 服务器的示例中,我使用了 NFS,所以这次我决定使用 HTTP 服务器。

# dnf -y install httpd

接下来我们将配置 Virtual Hosting 来托管我们的镜像仓库路径。我创建了一个新的文件ks-server.conf/etc/httpd/conf.d/,内容如下:

<VirtualHost 192.151.6.151:80>
    ServerAdmin root@server1.example.com
    DocumentRoot /
    ServerName server.example.com
    ErrorLog logs/ks-server.example.com-error_log
    CustomLog logs/ks-server.example.com-access_log common
    <Directory /ks>
        AllowOverride All
        Require all granted
    </Directory>
    <Directory /image>
        Options Indexes MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

所以在这里我基本上在我的 HTTP 服务器上提供两个不同的 PATH,即我的 kickstart 配置文件和我的图像存储库。我还提供了访问这些路径所需的权限,您可以查看 Apache DirectoryListings以获取更多信息。

接下来启用并启动 httpd 服务:

# systemctl enable httpd --now

确保服务已成功启动:

# systemctl status httpd

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

我们必须做的下一件重要事情是允许可见 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 服务器访问图像存储库路径:

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

类似地,尝试在 Web 浏览器上访问 kickstart 配置文件:

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

笔记:
如果您在访问这些位置时遇到任何问题,那么您可以参考我们在我们的虚拟主机配置文件中提到的/etc/httpd/logs/ks-server.example.com-error_logks-server.example.com-access_log文件。

 

步骤 6:更新 kickstart 配置文件

接下来更新/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

 

第 7 步:创建 grub.cfg 文件

对于 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/ quiet
    initrdefi pxelinux/initrd.img
}

在这里,我们创建了一个带有 kickstart 配置文件位置的菜单项。在inst.stage2= 启动选项指定安装程序的运行时图像的位置。此选项需要包含有效.treeinfo 文件的目录的路径, 并从文件中读取运行时映像位置 .treeinfo 。

 

步骤 8:配置防火墙

我们在防火墙中必须允许三种服务,即 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

 

步骤 9:配置 SELinux

为了本教程,我将 SELinux 保持在 Permissive 模式。

# getenforce
Permissive

您还可以使用以下命令将其设置为许可模式

# setenforce 0

或者您也可以选择完全禁用它

 

步骤 10:执行 PXE 引导

我们都准备好执行目标刀片的 UEFI PXE 引导,以通过网络安装它们。引导您的客户端节点并执行基于网络的安装。现在通过网络启动的快捷按钮可能因不同的硬件而异,但在大多数情况下,我们希望按 F12 从网络启动:

如果您的 UEFI PXE 启动服务器配置正确,那么 TFTP 文件应该会成功下载,如下所示

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

 

在下一个屏幕中,您将看到我们在grub.cfg文件中配置的启动菜单条目。按 Enter 以使用 kickstart 配置文件开始自动安装:

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

 

回车开始安装。如果您看到以下屏幕,则意味着您现在可以坐下来喝咖啡了!!

使用 Kickstart [RHEL/CentOS 8] 配置 UEFI PXE 启动

 

 

概括

在本教程中,我们学习了如何使用 RHEL/CentOS 8 Linux 服务器创建 UEFI PXE 引导服务器。我已经分享了创建和设置您的 kickstart 服务器的分步说明。尽管还有许多其他方法可以实现相同的目标,例如您可以使用 DNSMASQ 代替 DHCP 或使用 FTP 或 NFS 代替 HTTP 来托管您的 kickstart 文件和映像存储库。因此,您可以根据需要自定义安装步骤。尽管本文应该为您提供一个基础来设置您的第一个 PXE 引导服务器。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐