设置KVM PXE服务器以执行网络启动RHEL CentOS 8
在本文中,将介绍设置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服务器上共享安装文件,例如initrd
,vmlinuz
和其他相关文件。
在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
这是通过
initrd
和vmlinuz
执行的。
我希望我们熟悉涵盖这部分的Linux引导过程。在实际内核加载之前,
initrd
和vmlinuz
将从内存中加载必要的驱动程序以启动服务器。
.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-utils
rpm
[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虚拟机使用
--network
和mac.address
我们将一个自定义的MAC地址分配给我们的主NIC接口,以执行VM的qemu netbootMAC地址已映射到我们的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虚拟机,并且一键式安装服务器已准备就绪。