如何在CentOS 8 Headless Server上安装KVM

时间:2020-01-09 10:39:21  来源:igfitidea点击:

如何在CentOS 8(CentOS Enterprise Linux)无终端(显示器键鼠)服务器上安装" KVM"(基于内核的虚拟机)?
如何在CentOS 8上设置KVM并使用cloud images/cloud-init来安装来宾VM(虚拟机)?

基于Linux内核的虚拟机(KVM)是免费的开放源代码虚拟化软件,用于CentOS8。
KVM将您的服务器变成虚拟机监控程序。
在本教程中我们学习了如何在CentOS 8中使用KVM设置和管理虚拟化环境。
它还描述了如何使用命令行在物理服务器上安装和管理虚拟机(VM)。
确保在服务器BIOS中启用了虚拟化技术(VT)。
您还可以运行以下命令来测试CPU是否支持Intel VT和AMD-V虚拟化技术:

$ lscpu | grep Virtualization
## Test for both Intel/AMD CPU that support KVM ##
$ sort -u

KVM仅支持Intel/AMD 64位和IBM z13,Power 8/9 CPU和更高版本的主机VM。

在CentOS 8无终端(显示器键鼠)远程服务器上安装KVM的步骤

请使用su命令或sudo命令成为root用户:

$ sudo -i
## 或者
$ su 

步骤1:安装kvm

运行以下dnf命令/yum命令:

# dnf module install virt

然后安装工具以配置新的虚拟机(VM):

# dnf install virt-install virt-viewer libguestfs-tools

使用systemctl命令启用并启动libvirtd服务:

# systemctl enable libvirtd.service
# systemctl start libvirtd.service
# systemctl status libvirtd.service

第2步:验证您的kvm安装

确保使用lsmod命令和grep命令加载了KVM Linux内核模块(驱动程序):

# lsmod | grep -i kvm

步骤3:配置桥接网络

默认情况下,libvirtd配置的基于dnsmsq的网桥称为virbr0。
您可以使用以下简单命令进行验证:

# virsh net-info default
# nmcli device
# nmcli connection show

libvirtd使用轻型DHCP和缓存DNS服务器dnsmasq。
我们可以使用cat命令或grep命令/egrep命令查看包含IP范围的配置文件:

# cat /var/lib/libvirt/dnsmasq/default.conf
# egrep '^(dhcp-range|interface)' /var/lib/libvirt/dnsmasq/default.conf
## use the ip command to verify info about the virbr0 ##
# ip a show virbr0
# ip r

步骤4:配置桥接网络

如果要使VM可用于LAN上的其他服务器,请在连接到LAN的服务器上设置网桥。
更新您的nic配置文件。
这是我的预配置的br0接口,该接口被eno1以太网奴役:

# vi /etc/sysconfig/network-scripts/ifcfg-br0

br0配置:

## my lan 192.168.1.0/24 ##
## Bridge br0 config, only IPv4 and no IPv6 here for now ##
STP=no
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
UUID=dd51480e-fbac-41a8-b5e6-ea3d097f5059
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.19
PREFIX=24
GATEWAY=192.168.1.254
DNS1=192.168.1.254
DOMAIN=sweet.home
IPV6_DISABLED=yes

并配置eno1以太网:

# vi /etc/sysconfig/network-scripts/ifcfg-bridge-slave-eno1

eno1配置:

TYPE=Ethernet
NAME=bridge-slave-eno1
UUID=f43a8688-81f0-4860-91d4-f8f41efe2d10
DEVICE=eno1
ONBOOT=yes
BRIDGE=br0

重新启动网络服务(警告ssh命令将断开连接,最好重新启动Linux机器):

# systemctl restart NetworkManager.service
## 或者
# nmcli con up br0
# nmcli connection delete eno1

使用nmcli命令进行验证

# nmcli device

输出示例:

DEVICE      TYPE      STATE      CONNECTION        
br0         bridge    connected  br0               
virbr0      bridge    connected  virbr0            
eno1        ethernet  connected  bridge-slave-eno1 
lo          loopback  unmanaged  --                
virbr0-nic  tun       unmanaged  --                
wlp1s0      wifi      unmanaged  -

有关更多信息,请参见使用nmcli命令的CentOS 8添加网桥(br0)。

步骤5:创建第一个虚拟机/来宾VM(虚拟机)

我将创建一个全新的CentOS 8.x VM。
首先,使用wget命令/lftp命令获取CentOS 8.x最新的ISO镜像。

# cd /var/lib/libvirt/boot/
# wget https://mirrors.edge.kernel.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-boot.iso

使用sha256sum命令验证ISO镜像:

# wget https://mirrors.edge.kernel.org/centos/8/isos/x86_64/CHECKSUM
# sha256sum --ignore-missing -c CHECKSUM

创建CentOS 8.x VM(虚拟机)

在以下示例中,我创建具有1GB RAM,1个CPU内核,1个nic和20GB硬盘空间的CentOS 8.x VM,执行:

# virt-install \
--virt-type=kvm \
--name centos8-vm \
--memory 1024 \
--vcpus=1 \
--os-variant=rhel8.1 \
--cdrom=/var/lib/libvirt/boot/CentOS-8.1.1911-x86_64-boot.iso \
--network=bridge=br0,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/centos8.qcow2,size=20,bus=virtio,format=qcow2

要配置VNC并完成CentOS 8 VM的安装,请从另一个终端输入ssh并执行:

# virsh dumpxml centos8-vm | grep vnc
    <graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>

然后降低端口值(即5900)。
您需要使用SSH客户端设置隧道,并使用VNC客户端访问远程VM的VNC显示。
在Linux和Unix客户端/MacBook Pro桌面上执行以下SSH端口转发命令:

{Hyman@linux-desktop:~ }$ ssh [email protected] -L 5900:127.0.0.1:5900

现在您已经建立了ssh隧道,将VNC客户端指向127.0.0.1(localhost)地址和端口" 5900",如下所示:您应该看到CentOS Linux 8 guest虚拟机安装屏幕如下:现在按照屏幕上的说明进行操作并安装CentOS 8.安装完成后,继续并单击重新启动按钮。
远程服务器关闭了与我们的VNC客户端的连接。
您可以通过KVM客户端重新连接以配置服务器的其余部分,包括基于SSH的会话,防火墙,网络等等。

如何创建RHEL 8.x VM

确保您在本地存储了rhel.iso。
在此示例中,我将创建具有2GB RAM,2个CPU内核,1个NIC和40GB磁盘空间的RHEL 8.x VM,执行:

# virt-install \
--virt-type=kvm \
--name rhe8-server \
--memory 2048 \
--vcpus=2 \
--os-variant=rhel8.1 \
--cdrom=/var/lib/libvirt/boot/rhel-server.iso \
--network=bridge=br0,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/rhel8.qcow2,size=40,bus=virtio,format=qcow2

要获取vnc端口信息,请通过ssh从另一个终端登录并执行:

$ sudo virsh dumpxml rhel8-server | grep vnc
    <graphics type='vnc' port='5906' autoport='yes' listen='127.0.0.1'>

您需要使用SSH客户端设置隧道,并使用VNC客户端访问远程vnc VM显示。
从客户端/桌面执行以下SSH端口转发命令:

$ ssh [email protected] -L 5906:127.0.0.1:5906

建立ssh隧道后,将VNC客户端指向127.0.0.1(localhost)地址和端口5906,以继续进行RHEL 8.x安装。

第6步:使用virt-builder构建来宾镜像

使用virt-builder命令可以在CentOS 8上快速构建虚拟机。

列出镜像

# virt-builder --list
# virt-builder --list | egrep -i 'debian|ubuntu'
# virt-builder --list | egerp -i centos

编译Ubuntu 18.04 LTS vm(虚拟机)

首先,设置shell变量:

vm="ubuntu-vm1"                  # VM name
os="ubuntu-18.04"                # OS    
tz="Asia/Kolkata"                # Time zone
ram="1024"                       # VM RAM 
disk="10G"                       # VM Disk Size
vcpu="1"                         # Number of Virtual CPUs
key=~/.ssh/id_rsa.pub            # SSH Pub key
pwd="Encrypted_PASSWORD_HERE"    # Use 'mkpasswd --method=sha512crypt' to create Encrypted password
bridge="br0"                     # Network bridge name such as 'br0' or 'virbr0'
ostype="ubuntu18.04"             # Run 'osinfo-query os' to get exact varient

现在,根据变量快速构建虚拟机镜像:

# virt-builder "${os}" \
--hostname "${vm}" \
--network \
--timezone "${tz}" \
--size=${disk} \
--format qcow2 -o /var/lib/libvirt/images/${vm}-disk01.qcow2 \
--update \
--firstboot-command "dpkg-reconfigure openssh-server" \
--firstboot-command "useradd -p ${pwd} -s /bin/bash -m -d /home/Hyman -G sudo Hyman" \
--edit '/etc/default/grub:s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"/' \
--ssh-inject "root:file:${key}" \
--run-command update-grub

输出示例:

[   2.0] Downloading: http://libguestfs.org/download/builder/ubuntu-18.04.xz
[   2.4] Planning how to build this image
[   2.4] Uncompressing
[   7.9] Resizing (using virt-resize) to expand the disk to 10.0G
[  20.8] Opening the new disk
[  24.4] Setting a random seed
virt-builder: warning: random seed could not be set for this type of guest
[  24.4] Setting the hostname: ubuntu-vm1
[  25.1] Setting the timezone: Asia/Kolkata
[  25.2] Updating packages
[ 138.7] Installing firstboot command: dpkg-reconfigure openssh-server
[ 138.8] Installing firstboot command: useradd -p $XoUElABFFfTFr4/f$dGYZ2MCb2QcMuKQ2RmE./U0v7mhr2LFd4rbvOMdbjPCWwiyOMuirQagJ.9hBobz9Dy61AXS8oeTabem/H5YhB1 -s /bin/bash -m -d /home/Hyman -G sudo Hyman
[ 138.8] Editing: /etc/default/grub
[ 138.9] SSH key inject: root
[ 139.7] Running: update-grub
[ 139.9] Setting passwords
virt-builder: Setting random password of root to SzzVUrAhaYRUiVJj
[ 140.6] Finishing off
                   Output file: /var/lib/libvirt/images/ubuntu-vm1-disk01.qcow2
                   Output size: 10.0G
                 Output format: qcow2
            Total usable space: 9.8G
                    Free space: 7.9G (81%)

请记下随机根密码。
现在,我们的自定义VM镜像已使用给定的选项构建。
让我们安装VM:

# virt-install --import --name "${vm}" \
--ram "${ram}" \
--vcpu "${vcpu}" \
--disk path=/var/lib/libvirt/images/${vm}-disk01.qcow2,format=qcow2 \
--os-variant "${ostype}" \
--network=bridge=${bridge},model=virtio \
--noautoconsole

列出虚拟机:

# virsh list

使用控制台登录

# virsh console ${vm}

由于我们注入了ssh密钥,请执行:

## this will only work if your br0 dhcpd also provide name resoution via dns ##
# host $vm
# ssh root@vm-ip-here
# ssh root@${vm}

我们可以使用virt-builder构建各种本地或云使用的VM,通常在几分钟或更短的时间内。
然后,我们使用virt-install在KentOS 8无终端(显示器键鼠)服务器上安装KVM。

步骤7:使用云镜像

出于学习目的或构建单个VM的考虑,可以采用手动安装方法。
但是,如果需要部署大量VM呢?
那么可以尝试使用云镜像。
您可以根据需要修改预构建的云镜像。
例如,我们可以使用Cloud-init添加用户,安装ssh密钥,设置时区以及更多功能,Cloud-init是事实上的多分发软件包,用于处理云实例的早期初始化。
让我们看看如何使用具有1024MB内存,20GB磁盘空间和一个vCPU的云镜像创建CentOS 8 VM。

下载CentOS 8云镜像

# cd /var/lib/libvirt/boot
# wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2
# wget https://cloud.centos.org/centos/8/x86_64/images/CHECKSUM
# sha256sum --ignore-missing -c CHECKSUM

使用mkdir命令创建所需的目录

# D=/var/lib/libvirt/images
# VM=centos8-vm1 ## your vm goes name ##
# mkdir -vp $D/$VM
mkdir: created directory '/var/lib/libvirt/images/centos8-vm1'

创建元数据文件

# cd $D/$VM
# vi meta-data

追加以下配置:

instance-id: centos8-vm1
local-hostname: centos8-vm1

创建用户数据文件

我将使用ssh键登录到VM。
因此,请确保已安装ssh键:

# ssh-keygen -t ed25519 -C "CentOS 8 host server login ssh key"

有关更多信息,请参见如何在Linux/Unix系统上设置SSH密钥。
如下编辑用户数据:

# cd $D/$VM
# vi user-data

添加如下内容(根据您的设置替换主机名,用户,ssh授权密钥):

#cloud-config
 
# Hostname management
preserve_hostname: False
hostname: centos8-vm1
fqdn: centos8-vm1.sweet.home
 
# Users
users:
    - default
    - name: Hyman
      groups: ['wheel']
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL
      ssh-authorized-keys:
        - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4Owk8inCz5ZnhWSiP2Y5wfVKTFOLTFOJ0K/sC2egDF CentOS 8 host server login ssh key
 
# Configure where output will go
output:
  all: ">> /var/log/cloud-init.log"
 
# configure interaction with ssh server
ssh_genkeytypes: ['ed25519', 'rsa']
 
# Install my public ssh key to the first user-defined user configured
# in cloud.cfg in the template (which is centos for CentOS cloud images)
ssh_authorized_keys:
  - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4Owk8inCz5ZnhWSiP2Y5wfVKTFOLTFOJ0K/sC2egDF CentOS 8 host server login ssh key
 
# set timezone for VM
timezone: Asia/Kolkata
 
# Remove cloud-init 
runcmd:
  - systemctl stop NetworkManager.service && systemctl start NetworkManager.service
  - dnf -y remove cloud-init

验证用户数据是否存在语法错误:

# cloud-init devel schema --config-file user-data
`Valid cloud-config file user-data`

复制云镜像

# cd $D/$VM
# cp -v /var/lib/libvirt/boot/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2 $VM.qcow2
`'/var/lib/libvirt/boot/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2' -> 'centos8-vm1.qcow2'`

创建20GB磁盘镜像

# cd $D/$VM
# qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G
# virt-resize --quiet --expand /dev/sda1 $VM.qcow2 $VM.new.image
# mv -f $VM.new.image $VM.qcow2
# ls -l

创建一个cloud-init ISO文件

# mkisofs -o $VM-cidata.iso -V cidata -J -r user-data meta-data
I: -input-charset not specified, using utf-8 (detected in locale settings)
Total translation table size: 0
Total rockridge attributes bytes: 331
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
183 extents written (0 MB)

创建一个池

# virsh pool-create-as --name $VM --type dir --target $D/$VM
`Pool centos8-vm1 created`

通过云镜像安装CentOS 8 VM

# cd $D/$VM
# virt-install --import --name $VM \
--memory 1024 --vcpus 1 --cpu host \
--disk $VM.qcow2,format=qcow2,bus=virtio \
--disk $VM-cidata.iso,device=cdrom \
--network bridge=br0,model=virtio \
--os-variant=rhel8.1 \
--graphics spice \
--noautoconsole

删除不需要的文件:

# cd $D/$VM
# virsh change-media $VM sda --eject --config
rm: remove regular file 'meta-data'? y
removed 'meta-data'
rm: remove regular file 'user-data'? y
removed 'user-data'
rm: remove regular file 'centos8-vm1-cidata.iso'? y
removed 'centos8-vm1-cidata.iso'

找出名为centos8-vm1的KVM VM的IP地址

如果使用br0,请使用host命令:

# host $VM
`centos8-vm1.sweet.home has address 192.168.1.212`

使用默认的virbr0新娘界面时,要查找Linux KVM来宾虚拟机的IP地址:

# virsh net-dhcp-leases default

验证登录到centos8-vm

使用ssh命令:

# ssh Hyman@$VM
# ssh [email protected]

关于有用的virsh KVM管理命令的说明

让我们看一些管理虚拟机的有用命令。

列出所有虚拟机

# virsh list --all

获取虚拟机信息

# virsh dominfo vmName
# virsh dominfo centos8-vm1

停止/关闭VM

# virsh shutdown centos8-vm1

启动虚拟机

# virsh start centos8-vm1

将VM标记为在CentOS 8服务器启动时自动启动

# virsh autostart centos8-vm1

重启(软安全重启)虚拟机

# virsh reboot ubuntu-vm1

重置(硬重置/不安全)VM

# virsh reset ubuntu-vm1

删除虚拟机

# virsh shutdown centos8-vm1
# virsh undefine centos8-vm1
# virsh pool-destroy centos8-vm1
# D=/var/lib/libvirt/images
# VM=centos8-vm1.img
# rm -ri $D/$VM

查看virsh命令类型的完整列表

# virsh help | less
# virsh help | grep reboot