设置KVM PXE服务器以执行网络启动RHEL CentOS 8

时间:2020-02-23 14:40:27  来源:igfitidea点击:

在本文中,将介绍设置KVM PXE服务器的步骤,可用于执行基于网络的虚拟机安装。

我们可以使用传统的PXE服务器执行基于网络的安装。

但是为qemu netwoot设置KVM PXE服务器的步骤是不同的。

我们不会使用单独的DHCP服务器来通过网络安装KVM,而是将使用默认的NAT网络,它将用作QEMU netboot的DHCP服务器。

服务器设置

我在RHEL 8.1上安装了具有以下网络连接的物理Linux服务器

[root@rhel-8 ~]# nmcli con show
NAME    UUID                                  TYPE      DEVICE
br0     4a38747e-49f4-4213-83cb-a946d3dffefb  bridge    nm-bridge
virbr0  63200e70-21fb-4e89-b9f2-031d9eb71ab3  bridge    virbr0
slave1  eb862842-ba6a-47fe-994c-733977a8275b  ethernet  eno49
slave2  631e5c3e-bf2f-46d3-b9dd-dca2001f586b  ethernet  eno50
vnet0   3960b1c1-6453-40af-8d3f-aa0d15eeb0f5  tun       vnet0
vnet1   409837ab-9814-4041-8071-8631ba323cce  tun       vnet1

我已经为我的KVM虚拟机使用nmcli手动创建了br0桥接连接。

当我们安装KVM和与虚拟化相关的rpm时,默认情况下,在RHEL/CentOS中,将在Linux服务器上创建具有网桥连接" virbr0"的NAT网络。

列出virbr0和我的自定义nm-bridge接口的IP地址详细信息

[root@rhel-8 ~]# ip address show dev virbr0
98: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:5d:42:fc brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
	   
[root@rhel-8 ~]# ip address show dev nm-bridge
85: nm-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:17:a4:77:00:44 brd ff:ff:ff:ff:ff:ff
    inet 10.43.138.12/27 brd 10.43.138.31 scope global noprefixroute nm-bridge
       valid_lft forever preferred_lft forever

这是我们之前讨论的"默认"网络,它是安装KVM和其他虚拟化rpm后创建的NAT网络。

[root@rhel-8 ~]# virsh net-list
 Name                 State      Autostart     Persistent
---------------------------------------------------------
 default              active     yes           yes

安装程序安装库

我们必须将RHEL/CentOS ISO DVD的内容复制到某个目录以设置安装库,我们将CentOS 8 DVD的内容保留在/images /下。

[root@rhel-8 ~]# mkdir /images

我已经在虚拟机上虚拟安装了RHEL 8 ISO,要访问该ISO,我会将镜像安装到/mnt

提示:

RHEL和CentOS 8具有相同的目录结构和配置kickstart服务器的要求,因此我们可以使用其中任何一个。

我们知道如何识别和访问U盘,连接到Linux服务器的ISO镜像吗?

[root@rhel-8 ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.

将所有文件从CentOS 8 ISO镜像复制到/images目录

[root@rhel-8 ~]# cp -apr /mnt/* /images/

注意,这里隐藏文件的复制将被忽略,有效安装源所必需的treeinfo文件,因此请手动复制这些隐藏文件。

提示:

我们将需要~8GB的可用空间来复制完整的RHEL 8 ISO镜像

[root@rhel-8 ~]# cp -apr /mnt/.discinfo /mnt/.treeinfo /images/

验证存储库内容

[root@rhel-8 ~]# ls -al /images
dr-xr-xr-x.  7 root root 4096 Jan  4 20:09 .
dr-xr-xr-x. 22 root root 4096 Jan  1 03:30 ..
dr-xr-xr-x.  4 root root 4096 Jan  4 03:12 AppStream
dr-xr-xr-x.  4 root root 4096 Jan  4 03:12 BaseOS
-r--r--r--.  1 root root   44 Jan  4 03:11 .discinfo
dr-xr-xr-x.  3 root root 4096 Jan  4 03:12 EFI
dr-xr-xr-x.  3 root root 4096 Jan  4 03:12 images
dr-xr-xr-x.  2 root root 4096 Jan  4 03:12 isolinux
-r--r--r--.  1 root root   87 Jan  4 03:11 media.repo
-r--r--r--.  1 root root  664 Jan  4 03:12 TRANS.TBL
-r--r--r--.  1 root root 1520 Apr 30 00:08 .treeinfo

安装和配置TFTP服务器

我们将需要TFTP服务器在我们的KVM PXE服务器上共享安装文件,例如initrdvmlinuz和其他相关文件。

在KVM主机上使用dnf安装tftp-server。
希望我们知道RHEL/CentOS 8中YUM的替代DNF工具

说明:

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

[root@rhel-8 ~]# dnf install tftp-server -y

在早期的RHEL/CentOS 7中,tftp服务由xinetd管理。
尽管即使使用RHEL/CentOS 7,我们也可以选择禁用xinetd并使用systemd分叉TFTP进程。

说明:

我们可以通过xinetd或者systemd来分叉TFTP进程,但不能同时使用两者。
有关更多详细信息,请检查:TFTP服务在RHEL7中自动变为非活动状态

在这个例子中,我们将使用systemd来分叉TFTP进程。
tftp-server rpm安装将创建/usr/lib/systemd/system/tftp.service文件

接下来启动tftp服务,并使其在重启后自动启动

[root@rhel-8 ~]# systemctl enable tftp.socket --now
  • TFTP服务用于tftp.socket服务TFTP请求

  • 因此,如果没有传入的TFTP请求,则tftp服务本身将变为不活动状态

  • 但是,一旦TFTP请求到达tftp.socket,套接字将启动tftp.service并处理请求

  • 检查tftp.socket的状态

[root@rhel-8 ~]# systemctl status tftp.socket
● tftp.socket - Tftp Server Activation Socket
   Loaded: loaded (/usr/lib/systemd/system/tftp.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Wed 2017-04-29 21:44:24 IST; 5h 41min ago
   Listen: [::]:69 (Datagram)
   CGroup: /system.slice/tftp.socket
Apr 29 21:44:24 rhel-8.example.com systemd[1]: Listening on Tftp Server Activation Socket.

为了执行qemu netboot,我们将配置NAT网络以提供IP和TFTP目录位置。

将"默认" NAT网络设置为DHCP服务器

要编辑默认的网络,请使用virsh命令。

提示:

如果得到"未找到virsh-命令",则必须首先通过使用" yum -y install libvirt-client"在RHEL/CentOS 8上安装" libvirt-client"来安装" virsh"工具。

[root@rhel-8 ~]# virsh net-edit default
<network>
  <name>default</name>
  <uuid>836520d9-fb0a-46f0-8745-033353151e93</uuid>
  <forward mode='nat'
  <bridge name='virbr0' stp='on' delay='0'
  <mac address='52:54:00:5d:42:fc'
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <tftp root='/var/lib/tftpboot/pxelinux'
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'
      <bootp file='pxelinux.0'
    </dhcp>
  </ip>
</network>

其中突出显示,我添加了TFTP目录位置和在我们的KVM PXE服务器上执行qemu netboot所需的pxelinux.0文件。
按" Esc + wq!"保存并退出此文件。

要刷新更改,首先我们需要销毁默认网络。
不用担心,这不会删除默认网络。

[root@rhel-8 ~]# virsh net-destroy default
Network default destroyed

下一步启动默认网络

[root@rhel-8 ~]# virsh net-start default
Network default started

设定KVM PXE伺服器

  • 要在我们的KVM虚拟虚拟机上执行QEMU netboot,我们必须在安装了KVM的主机上使用必需的安装文件设置KVM PXE服务器

  • 我们将需要Linux引导镜像以最少的配置引导RHEL 8 OS

  • 这是通过initrdvmlinuz执行的。
    我希望我们熟悉涵盖这部分的Linux引导过程。

  • 在实际内核加载之前,initrdvmlinuz将从内存中加载必要的驱动程序以启动服务器。

.1:解压缩syslinux-tftpboot

在RHEL/CentOS 8中,pxelinux文件是syslinux-tftpboot rpm的一部分,因此我们会将文件从CentOS 8 ISO复制到一个临时位置。

[root@rhel-8 ~]# cp /mnt/BaseOS/Packages/syslinux-tftpboot-6.04-4.el8.noarch.rpm /tmp/

接下来解压缩syslinux-tftpboot rpm。
我们不会使用此rpm的所有内容,而只会使用必需的文件

[root@rhel-8 ~]# cd /tmp/
[root@rhel-8 tmp]# rpm2cpio syslinux-tftpboot-6.04-4.el8.noarch.rpm | cpio -idm

上面的命令将在/tmp下提取syslinux-tftpboot

接下来,我们将pxelinux.0和ldlinux.c32复制到设置PXE引导服务器所需的/var/lib/tftpboot/pxelinux /中。

提示:

如果我们希望在引导菜单中使用图形用户界面,那么我建议我们将此rpm的所有内容复制到/var/lib/tftpboot/pxelinux /中。

[root@rhel-8 tmp]# cp /tmp/tftpboot/ldlinux.c32 /var/lib/tftpboot/pxelinux/
[root@rhel-8 tmp]# cp /tmp/tftpboot/pxelinux.0 /var/lib/tftpboot/pxelinux/

.2:复制initrd和vmlinuz

  • 我们还需要其他PXE引导镜像,这些镜像将位于RHEL/CentOS 8镜像的" isolinux"文件夹下。

  • 由于我们已将ISO内容复制到/images中,因此我们会将所需的PXE引导镜像从/images/isolinux复制到/var/lib/tftpboot/pxelinux /中。

[root@rhel-8 tmp]# cp /images/isolinux/initrd.img /var/lib/tftpboot/pxelinux/
[root@rhel-8 tmp]# cp /images/isolinux/vmlinuz /var/lib/tftpboot/pxelinux/

列出所有PXE引导镜像文件:

[root@rhel-8 tmp]# ls -l /var/lib/tftpboot/pxelinux/
total 58880
-r--r--r-- 1 root root 62248424 Apr 19 19:14 initrd.img
-rw-r--r-- 1 root root   116096 Apr 19 19:47 ldlinux.c32
-rw-r--r-- 1 root root    42821 Apr 19 19:01 pxelinux.0
-r-xr-xr-x 1 root root  8106848 Apr 19 19:14 vmlinuz

接下来导航到" pxelinux"文件夹

[root@rhel-8 tmp]# cd /var/lib/tftpboot/pxelinux

.3:创建启动菜单

  • 我们将创建KVM PXE启动服务器,该服务器可用于安装多个镜像,因此我们将创建启动菜单。

  • 将显示此引导菜单,以启动安装以供用户输入。

  • /var/lib/tftpboot/pxelinux下创建一个新文件boot.msg

  • 我们可以根据需要为此文件使用任何名称。

  • 由于我仅打算为单个镜像配置Kickstart服务器,因此我仅创建了两个菜单项。

[root@rhel-8 pxelinux]# cat boot.msg
Welcome to the installation of "My Linux Server" !
Red Hat Enterprise linux 8.1 (x86_64)
Version: 1.0
Architecture: x86_64
To start the installation enter :
    '1', '2' and press .
Available boot options:
  1 - Install Red Hat Enterprise Linux 8.1
  2 - Boot from Harddisk (this is default)
Have a lot of fun...

创建PXE配置文件

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

  • 在大型部署中,我们会为每个节点创建单独的PXE配置文件。

  • 这些PXE配置文件的命名语法非常重要

  • 首先,它将查找以MAC地址命名的文件,格式为01-xx-xx-xx-xx-xx-xx。

  • 例如,如果NIC的MAC地址为" 08:00:27:83:1e:2a",则PXE配置文件将为" 01-08-00-27-83-1e-2a"

  • 接下来,它将查找由DHCP服务器提供的IP地址命名的文件。

  • IP地址以十六进制格式查找。

  • 我们可以使用printf获取IP地址的十六进制格式,例如,获取10.10.10.12的十六进制值。

# printf "%02x%02x%02x%02xn" 10 10 10 12
0a0a0a0cn
  • 我已经为我们的KVM虚拟机创建了多个PXE配置文件

  • 我们无需担心MAC,因为在创建KVM虚拟机时,我们将分配自定义MAC。

[root@rhel-8 pxelinux.cfg]# ls -l
total 20
-rw-r--r--. 1 root root 320 Apr 30 15:32 01-00-17-a4-77-00-45
-rw-r--r--. 1 root root 320 Apr 30 15:38 01-00-17-a4-77-00-46
-rw-r--r--. 1 root root 320 Apr 30 15:39 01-00-17-a4-77-00-47
-rw-r--r--. 1 root root 320 Jan  4 20:02 01-00-17-a4-77-00-48

以下是我的一个PXE配置文件的内容

[root@rhel-8 pxelinux.cfg]# cat 01-00-17-a4-77-00-45
timeout 600
display boot.msg
default 1
prompt  1
label 1
  menu label ^Install Red Hat Enterprise Linux 8
  kernel vmlinuz
  append initrd=initrd.img showopts  ks=nfs:192.168.122.1://ks/kickstart_centos8-2.conf ip=dhcp net.ifnames=0 biosdevname=0
label 2
  menu label Boot from ^local drive
  localboot 0x80
menu end
  • 我们必须根据kickstart文件名和路径来修改内核参数。

  • 标签2是从硬盘启动的默认选项

  • 将从默认的NAT网络中收集DHCP IP

  • net.ifnames和biosdevname也是可选的,因为我不希望对客户端节点使用一致的网络设备命名方案。

提示:

确保所有PXE配置文件都具有执行qemu netboot的世界可读权限

配置Kickstart服务器

  • 在每次安装Red Hat和CentOS时,都会在root用户的home文件夹下创建一个默认的kickstart文件,即/root/anaconda-ks.cfg

  • 此anaconda kickstart文件包含用于安装服务器的值

  • 我们可以使用此anaconda文件来创建我们的kickstart配置文件并配置kickstart服务器

  • 我们还可以使用Red Hat提供的在线kickstart生成器工具。

创建/ks目录,我们将其中存储我们的kickstart文件

[root@rhel-8 pxelinux.cfg]# mkdir /ks

我在KVM PXE服务器上为不同的KVM虚拟机创建了多个kickstart配置文件

[root@rhel-8 pxelinux.cfg]# cd /ks/
[root@rhel-8 ks]# ls -l
total 20
-rw-r--r--. 1 root root 1352 Apr 30 16:15 kickstart_centos8-2.conf
-rw-r--r--. 1 root root 1352 Apr 30 16:15 kickstart_centos8-3.conf
-rw-r--r--. 1 root root 1352 Apr 30 16:15 kickstart_centos8-4.conf
-rw-r--r--. 1 root root 1352 Jan  4 20:03 kickstart_centos8-5.conf

.1:示例kickstart配置文件

以下是我在KVM PXE服务器上的示例kickstart配置文件。
我更喜欢执行基于文本的网络安装,以后我们可以选择将GNOME桌面的图形包安装到Linux服务器。

#version=RHEL8
# Use text install
text
# Create new user
user --name=hynman --shell=/bin/bash --homedir=/home/hynman  --iscrypted --password=$uSejt/TeWMJVQ/F8$/oFsIanDHS/5b9ssy7gZbQwNkORgRjsQIw4JyFjlTWDh9TVsEXWEy2APpCUNTHipOOEe..ubg3qBZOwpaPtsB.
# Create new repo
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
# Use NFS server for installation
nfs --server=192.168.122.1 --dir=/images/
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network  --bootproto=static --ip=192.168.122.10 --netmask=255.255.255.0 --gateway=192.168.122.1 --device=eth0 --noipv6 --no-activate
network  --hostname=centos8-2.example.com
# Root password
rootpw --iscrypted $w7El/FYx9mbTG6x9$Te.Yg6dq0TsQwGpdSjeDGSw4J9ZBAkLXzT9ODMV7I7lHvX3n5.9PCS4jIkS2GbVLZOpVRLvrua3wwbwA.cfWX.
# Run the Setup Agent on first boot
firstboot --enable
# Do not configure the X Window System
skipx
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Kolkata --isUtc
# Reboot the node post installation
reboot
# Partition clearing information
clearpart --all
# Disk partitioning information
autopart --type=LVM --fstype=ext4
# List of packages to be installed
%packages
@Virtualization Host
kexec-tools
%end
# Add on
%addon com_redhat_kdump --disable
%end

安装和配置NFS

提示:

我们还可以使用其他服务(例如HTTPS,FTP等)共享kickstart和Repo内容,以使用KVM PXE服务器执行基于网络的安装。

在上一篇文章中,我在RHEL/CentOS 7中使用了HTTP tp设置PXE启动服务器,因此其中我决定使用NFS。

我已经写了另一篇文章,其中包含详细的说明以及安装和配置NFSv4和NFSv3服务器的步骤。

因此,我其中将非常简短:

安装在KVM PXE服务器上配置NFS所需的nfs-utilsrpm

[root@rhel-8 ~]# dnf -y install nfs-utils
  • 以下是我计划为Linux kickstart服务器共享的目录。

  • 这里的/ks包含kickstart配置文件

  • 和/images包含用于安装的RHEL 8 ISO内容

[root@rhel-8 ~]# cat /etc/exports
/ks     *(ro,sync,no_root_squash)
/images *(ro,sync,no_root_squash)

再导出文件系统

[root@rhel-8 ~]# exportfs -r

打印可用的共享

[root@rhel-8 ~]# exportfs -v
/ks             (sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)
/images         (sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)

启用并启动nfs-server.service
其中因为我们使用的是NFSV4,所以我们尚未启动或者安装rpcbind
我们可以在以下位置阅读更多信息:在RHEL/CentOS 7/8中安装和配置NFSv4和NFSv3服务器和客户端的循序渐进指南

[root@rhel-8 ~]# systemctl enable nfs-server --now

确保nfs-server服务已启动并正在运行

[root@rhel-8 ~]# systemctl is-active nfs-server
active

创建KVM VM并执行qemu netboot

  • 我们将使用virt-install工具来创建KVM虚拟机

  • 使用--networkmac.address我们将一个自定义的MAC地址分配给我们的主NIC接口,以执行VM的qemu netboot

  • MAC地址已映射到我们的PXE配置文件

  • 使用--pxe执行基于网络的安装

[root@rhel-8 ~]# virt-install --name centos8-2 --memory 10240 --vcpus=2 --network bridge:virbr0,mac.address=00:17:a4:77:00:45  --pxe  --graphics=vnc -v  --disk path=/disks/centos8-2.qcow2,size=20 
Starting install...
Domain installation still in progress.
Waiting for installation to complete.
Domain has shutdown. Continuing.
Domain creation completed.
Restarting guest.

执行上述命令后,我们可以使用journalctl检查系统日志,因为我们看到我们有DHCP消息用于释放IP,然后是TFTP消息用于传输启动镜像。

Apr 30 15:34:31 rhel-8.example.com dnsmasq-dhcp[664]: DHCPDISCOVER(virbr0) 00:17:a4:77:00:45
Apr 30 15:34:31 rhel-8.example.com dnsmasq-dhcp[664]: DHCPOFFER(virbr0) 192.168.122.170 00:17:a4:77:00:45
Apr 30 15:34:35 rhel-8.example.com dnsmasq-dhcp[664]: DHCPDISCOVER(virbr0) 00:17:a4:77:00:45
Apr 30 15:34:35 rhel-8.example.com dnsmasq-dhcp[664]: DHCPOFFER(virbr0) 192.168.122.170 00:17:a4:77:00:45
Apr 30 15:34:43 rhel-8.example.com dnsmasq-dhcp[664]: DHCPREQUEST(virbr0) 192.168.122.170 00:17:a4:77:00:45
Apr 30 15:34:43 rhel-8.example.com dnsmasq-dhcp[664]: DHCPACK(virbr0) 192.168.122.170 00:17:a4:77:00:45
Apr 30 15:34:47 rhel-8.example.com dnsmasq-tftp[664]: sent /var/lib/tftpboot/pxelinux/pxelinux.0 to 192.168.122.170
Apr 30 15:34:47 rhel-8.example.com dnsmasq-script[664]: Unsupported action: tftp
Apr 30 15:34:47 rhel-8.example.com dnsmasq[664]: script process exited with status 1
Apr 30 15:34:47 rhel-8.example.com dnsmasq-tftp[664]: sent /var/lib/tftpboot/pxelinux/ldlinux.c32 to 192.168.122.170
Apr 30 15:34:47 rhel-8.example.com dnsmasq-tftp[664]: sent /var/lib/tftpboot/pxelinux/pxelinux.cfg/01-00-17-a4-77-00-45 to 192.168.122.170
Apr 30 15:34:47 rhel-8.example.com dnsmasq-tftp[664]: sent /var/lib/tftpboot/pxelinux/boot.msg to 192.168.122.170

因此,我们的KVM PXE服务器正在按预期运行。

现在,我们不必每次都经过很多步骤来创建KVM虚拟机,并且一键式安装服务器已准备就绪。