如何在Linux(CentOS/RHEL 7)中配置PXE引导服务器

时间:2020-01-09 10:37:46  来源:igfitidea点击:

在本文中,我将分享在CentOS 7节点上使用HTTP,Kickstart和DHCP/DNSMASQ服务配置PXE引导服务器的步骤。
同样的步骤列表也可以在RHEL 7上使用。
但是要在RHEL上配置PXE引导服务器,我们需要一个有效的订阅才能下载所需的rpm,或者我们也可以通过使用RHEL vanilla DVD镜像创建本地存储库来下载这些rpm。

不必仅使用本文中的服务在Linux中配置PXE引导服务器。
我们也可以使用其他服务(例如NFS,FTP等)来达到目的。

什么是PXE引导服务器?

通过PXE或者Preboot eXecution Environment,可以指示计算机使用网络资源进行引导。
这样,我们就可以控制一个源来安装服务器,而无需实际插入一些DVD或者U盘。

PXE网络启动的设计

  • 当一台机器使用" PXE"(预执行环境)直接从网络引导时,它需要从DHCP服务器获取IP地址。

  • DHCP服务器还可以为它提供TFTP服务器的详细信息,从该服务器中可以检索可执行文件。
    通常对于Linux客户端,此文件称为pxelinux.0

注意:如果使用DNSMASQ,则它将通过在dnsmasq配置文件中提供enable-tftp选项来将引导系统指向tftp服务器,并且不需要单独的DHCP服务器。

  • 客户端检索并执行" pxelinux.0"后,就对其进行了硬编码以从" pxelinux.cfg /"子目录中查找与找到" pxelinux.0"相对的文件。

  • 其中我们有一个PXE文件,它将包含PXE引导菜单和用于安装的存储库的位置。

创建kickstart文件

当我们安装Red Hat系统时,将在根用户的主目录中创建一个名为" anaconda-ks.cfg"的文件。
该文件包含安装计算机时使用的大多数设置。
如果我们想尝试自动的Kickstart安装,这是一个很好的起点。

我们也可以在GUI上使用" system-config-kickstart"工具来创建自己的kickstart文件。
请遵循CentOS官方页面以获取此工具的各种选项。

由于我们计划使用kickstart和网络启动PXE服务器来自动化安装,因此我们需要一个有效的kickstart文件。
我写了另一篇文章,其中包含一个示例kickstart配置文件,我们可以将其用作参考。

对于本文,我将使用具有以下内容的kickstart文件/root/kickstart.conf

# System authorization information
auth --enableshadow --passalgo=sha512
# Use Network installation media
url –url="http://10.0.2.20/rhel/"
# Use textual install
text
# Run the Setup Agent on first boot
firstboot --disable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=enp0s8 --onboot=off --noipv6 --activate
network --hostname=node2.example.com
# Root password
rootpw --iscrypted $CXxBapbzNlScWzBUc4bxK9/pDVls/aJcaT/9kENR0OFxMhohBf7k8RrBWtzTs42ljw4SER0AqYTDEdWHlDWE4BTTnQX8vkMWJ6l1
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Kolkata --isUtc
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel
autopart --type=plain --fstype=ext4
%packages
@^infrastructure-server-environment
@base
@core
chrony
kexec-tools
%end

配置HTTP

在安装过程中从内核行通过网络加载kickstart文件仅支持NFS,HTTP和FTP。
在本食谱中,我选择HTTP,因为它是内部的通用技术并且易于保护。

如果尚未安装Apache服务器rpm,请安装

说明:

在RHEL系统上,我们必须具有RHN的活动订阅,或者我们可以配置本地脱机存储库," yum"程序包管理器可以使用该本地存储库安装所提供的rpm及其依赖项。

# yum -y install http

通过运行以下命令,创建一个包含kickstart文件的目录:

# mkdir /var/www/html/kickstart
# cp /root/kickstart.conf /var/www/html/kickstart

给予适当的许可

# chown -R apache:apache /var/www/html/

启用并启动httpd守护程序,如下所示:

# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
# systemctl start httpd

接下来,尝试下载kickstart文件,以确保可从apache服务器访问该文件

[root@node1 # wget http://10.0.2.20/kickstart/kickstart.conf
--2016-11-05 21:14:32-- http://10.0.2.20/kickstart/kickstart.conf
Connecting to 10.0.2.20:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1491 (1.5K) [text/plain]
Saving to: ‘kickstart.conf’
100%[======================================>] 1,491 --.-K/s in 0s
2016-11-05 21:14:32 (319 MB/s) - ‘kickstart.conf’ saved [1491/1491]

设置源存储库以进行网络安装

设置安装服务器的下一步是将网络服务器配置为安装服务器。

这归结为将整个安装DVD复制到网络服务器上的共享,这使安装服务器成为联机存储库。
完成此操作后,我们可以使用客户端计算机访问安装文件。

我有一张普通的Red Hat DVD,它将用作通过网络进行安装的存储库,但是我将复制而不是复制它的镜像。

# mount /root/rhel-server-7.4-x86_64-dvd.iso /var/www/html/rhel/
mount: /dev/loop0 is write-protected, mounting read-only

由于我们将通过HTTP服务器使用存储库,因此我将在/var/www/html中使用安装分区。

配置TFTP服务

现在,我们已经设置了网络安装服务器,是时候配置PXE引导了。
这使我们可以从服务器的网卡引导要安装的服务器。
(通常,我们必须更改默认的引导顺序,或者在引导时按一个键来激活PXE引导(通常为F12)。
PXE服务器接下来将分发一个我们要安装的服务器用来启动初始阶段的引导镜像。
靴子。

安装RPM

首先,我们需要安装配置PXE引导服务器所需的所有rpm。

[root@node1 # yum -y install syslinux tftp-server xinetd

说明:

xinetd服务也称为Internet超级服务。
它来自内存资源有限的时代,为了尽可能高效地使用内存,xinetd可以配置为侦听许多端口,从而可以访问许多不同的服务。
使用xinetd仍然会有所帮助,特别是对于很少访问的服务。
xinetd服务将确保在某些进程访问其端口时该服务已启动,并且在特定的不活动时间后也将其关闭。

启用tftp服务器的xinetd守护进程,如下所示:

# sed -i '/disable/s/yes/no/' /etc/xinetd.d/tftp

现在,通过运行以下命令启用并启动xinetd守护进程:

# systemctl enable xinetd
# systemctl start xinetd

通过执行以下命令,将syslinux引导加载程序复制到tftp服务器的引导目录中:

# cp -r /usr/share/syslinux/* /var/lib/tftpboot

从RHEL 7安装介质复制initrdkernel/var/lib/tftpboot/rhel7 /,然后运行以下命令:

# mkdir /var/lib/tftpboot/rhel7

由于我们的DVD已经安装在/var/www/html/rhel上,因此我们可以从同一位置复制所需的文件

# cp /var/www/html/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/rhel7/

接下来,使用以下命令创建PXE配置目录:

# mkdir /var/lib/tftpboot/pxelinux.cfg

然后,创建PXE配置文件,如下所示:/var/lib/tftpboot/pxelinux.cfg/default

default menu.c32
prompt 0
timeout 300
ontimeout 2
menu title PXE Boot Menu
label 1
  menu label ^1 - Install RHEL 7 x64 with Local http Repo
  kernel rhel7/vmlinuz
  append initrd=rhel7/initrd.img showopts  method=http://10.0.2.20/rhel/devfs=nomount ks=http://10.0.2.20/kickstart/kickstart.conf 
label 2
  menu label ^2 - Boot from local media
  localboot 0x80

这里我们使用menu.c32来获得启动画面菜单,并定义一个300的超时值,如果没有用户输入,则在超时值之内,然后将调用第二个标签,即从本地磁盘启动。
在此文件中,确保菜单标签的标题以^开头,将其标识为菜单标签标题。
还要确保追加行仅是一行,以追加开始,并以Kickstart文件的URL结尾。

"接下来,我们可以使用DNSMASQ或者DHCP服务器,我已经共享了配置两者的步骤,但是我们可以根据自己的需求选择一个。
"

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

如果我们打算使用DNSMASQ代替DHCP,则可以使用以下步骤配置DNSMASQ服务

安装RPM

首先,我们需要安装配置PXE引导服务器所需的所有rpm。

说明:

在RHEL系统上,我们必须具有RHN的活动订阅,或者我们可以配置本地脱机存储库," yum"程序包管理器可以使用该本地存储库安装所提供的rpm及其依赖项。

[root@node1 # yum -y install dnsmasq

配置DNSMASQ

接下来,通过编辑/etc/dnsmasq.conf来配置DNSMASQ服务器,如下所示:

# interfaces to bind to
interface=eth0,lo
# the domain for this DNS server
domain=example.com
# DHCP lease range
dhcp-range=eth0,10.0.2.200,10.0.2.220,10h
# PXE – the address of the PXE server
dhcp-boot=pxelinux.0,pxeserver,10.0.2.20
# Gateway
dhcp-option=3,10.0.2.2
pxe-prompt="Press F8 for menu.", 60
enable-tftp
tftp-root=/var/lib/tftpboot

使用以下命令启用并启动dnsmasq:

# systemctl enable dnsmasq
# systemctl start dnsmasq

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

如果我们打算使用DHCP代替DNSMASQ,则可以使用以下步骤配置DHCP服务

配置DHCP服务器

在安装服务器上,没有DHCP服务器就无法存在TFTP服务器。
在进行PXE引导时,DHCP服务器首先回答所有必需的IP相关配置以及将要使用的DHCP服务器信息。

安装RPM

首先,我们需要安装配置PXE引导服务器所需的所有rpm。

[root@node1 # yum -y install dhcp

接下来配置/etc/dhcp/dhcpd.conf
以下是我的示例配置文件。
其中我们需要为每个主机MAC地址(如突出显示)添加单独的条目,以使用PXE服务器进行netboot。

## DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#allow bootp;
allow booting;
max-lease-time 1200;
default-lease-time 900;
log-facility local7;
option ip-forwarding    false;
option mask-supplier    false;
   subnet 10.0.2.0 netmask 255.255.255.0 {
       option  routers   10.0.2.2;
       option  domain-name-servers  127.0.0.1;
       range 10.0.2.30 10.0.2.40;
       next-server 10.0.2.20;
       filename "pxelinux.0";
   }

在DHCP配置文件中,指定了一个"子网"。
这是PXE服务器应其中提供其服务的子网。
在大多数配置中,这将是一个专用网络,这是个好主意,因为我们不希望偶然地将执行PXE引导的工作站与Red Hat Enterprise Linux一起安装。
如果要在还使用依赖于PXE引导的客户端的网络上提供基于PXE的安装服务,"建议定义一个类语句,以定义应允许哪些计算机使用PXE引导,哪些不应该使用" 。

在"子网"定义中,"下一个服务器"语句给出使用TFTP配置的服务器的IP地址。
即使它在提供DHCP的同一服务器上,我们仍应指定"下一个服务器" IP地址。
" filename"语句定义应提供给进行PXE引导的工作站的文件。
注意,该"文件名"是相对于TFTP配置文件中定义的TFTP服务器根目录的。

使用以下命令打开服务器上的防火墙(但是,这可能不是必需的):

# firewall-cmd --add-service=dns --permanent
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --add-service=tftp --permanent
# firewall-cmd --reload

说明:

如果在POC阶段遇到任何问题,则可以禁用和停止防火墙服务,并验证配置以找出失败原因。
一旦发现问题,强烈建议保持防火墙服务处于启用状态并处于活动状态。

流程将如何工作?

  • 现在我们已经完成了我们的配置。
    现在该通过NIC卡引导目标节点了。

  • 一旦目标节点从NIC卡启动,它将搜索可用的DHCP服务器。

  • DNSMASQ/DHCPD守护程序通过在" dnsmasq"配置中提供" enable-tftp"选项或者在" dhcpd.conf"文件中提供" next-server"选项,将引导系统指向tftp服务器。

  • 需要syslinux提供必要的二进制文件以从网络引导。

  • tftp服务器本身提供对syslinux文件,RHEL 7内核和initrd的访问,以使系统从中引导。

  • PXE配置文件提供了引导系统所需的配置,包括自动安装系统的kickstart文件。

在服务器端的/var/log/messages中,我们可以监视PXE引导的进度

使用DHCP时

Nov 6 00:26:01 node1 dhcpd: DHCPDISCOVER from 08:00:27:88:0b:f3 via eth0
Nov 6 00:26:02 node1 dhcpd: DHCPOFFER on 10.0.2.30 to 08:00:27:88:0b:f3 via eth0
Nov 6 00:26:04 node1 dhcpd: DHCPREQUEST for 10.0.2.30 (10.0.2.20) from 08:00:27:88:0b:f3 via eth0
Nov 6 00:26:04 node1 dhcpd: DHCPACK on 10.0.2.30 to 08:00:27:88:0b:f3 via eth0
Nov 6 00:26:04 node1 xinetd[1018]: START: tftp pid=8021 from=10.0.2.30
Nov 6 00:26:04 node1 in.tftpd[8022]: Client 10.0.2.30 finished pxelinux.0
Nov 6 00:26:04 node1 in.tftpd[8033]: Client 10.0.2.30 finished pxelinux.cfg/default
Nov 6 00:26:04 node1 in.tftpd[8034]: Client 10.0.2.30 finished menu.c32
Nov 6 00:26:04 node1 in.tftpd[8035]: Client 10.0.2.30 finished pxelinux.cfg/default

当使用DNSMASQ

Nov 5 23:48:15 node1 dnsmasq-dhcp[7036]: DHCPDISCOVER(eth0) 08:00:27:88:0b:f3
Nov 5 23:48:15 node1 dnsmasq-dhcp[7036]: DHCPOFFER(eth0) 10.0.2.217 08:00:27:88:0b:f3
Nov 5 23:48:15 node1 dnsmasq-dhcp[7036]: DHCPREQUEST(eth0) 10.0.2.217 08:00:27:88:0b:f3
Nov 5 23:48:15 node1 dnsmasq-dhcp[7036]: DHCPACK(eth0) 10.0.2.217 08:00:27:88:0b:f3
Nov 5 23:48:21 node1 dnsmasq-dhcp[7036]: PXE(eth0) 10.0.2.217 08:00:27:88:0b:f3 pxelinux.0
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: sent /var/lib/tftpboot/pxelinux.0 to 10.0.2.217
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/01-08-00-27-88-0b-f3 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A0002D9 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A0002D not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A0002 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A000 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A00 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A0 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0A not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: file /var/lib/tftpboot/pxelinux.cfg/0 not found
Nov 5 23:48:21 node1 dnsmasq-tftp[7036]: sent /var/lib/tftpboot/pxelinux.cfg/default to 10.0.2.217
Nov 5 23:48:22 node1 dnsmasq-tftp[7036]: sent /var/lib/tftpboot/menu.c32 to 10.0.2.217
Nov 5 23:48:22 node1 dnsmasq-tftp[7036]: sent /var/lib/tftpboot/pxelinux.cfg/default to 10.0.2.217

说明:

在消息中,我们会看到多条带有"未找到"的消息。
客户端检索并执行pxelinux.0后,将对其进行硬编码以从pxelinux.cfg /子目录中查找相对于找到pxelinux.0的位置的文件。

首先,它将查找以MAC地址命名的文件,格式为01-xx-xx-xx-xx-xx-xx;然后,它将查找由DHCP服务器提供的IP地址命名的文件。
IP地址以十六进制格式查找。
即十六进制的10是0x0A,0是0x00,2是0x02,217是0xD9,所以10.0.2.217是0x0A0002D9.

我们也可以使用以下格式的printf获取此值

# printf "%02x%02x%02x%02xn" 10 0 2 217
0a0002d9