如何在Ubuntu 20.04 LTS无终端(显示器键鼠)服务器上安装KVM

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

基于内核的虚拟机(KVM)是Linux内核的虚拟化模块,可将其转变为虚拟机监控程序。
如何通过桥接网络安装KVM,将来宾操作系统设置为基于ssh会话的非图形Ubuntu Linux 20.04 LTS服务器的后端虚拟化技术?
我们可以使用KVM来运行多个操作系统,例如MS-Windows服务器/台式机,\ * BSD系列操作系统,使用虚拟机的各种Linux发行版。
每个虚拟机都有自己的专用磁盘,图形卡,网卡,硬件设备等。

在Ubuntu 20.04 LTS无终端(显示器键鼠)服务器上安装KVM的前提条件

假设:

  • 主机Ubuntu服务器位于远程数据中心,它是一个无终端(显示器键鼠)服务器。
  • 本教程中的所有命令都在基于ssh的会话中执行。
  • 您需要一个vnc客户端来安装客户机操作系统。但是,如果您使用云镜像,则不需要这样做。
  • 在本教程中,您将学习"如何在Ubuntu 20.04 LTS服务器上安装KVM软件以及如何使用KVM设置您的第一个来宾VM。"

找出CPU是否支持KVM的Intel VT/AMD-V虚拟化

运行以下任一命令:

$ lscpu

## 或者

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

默认情况下,许多系统制造商在BIOS中为KVM禁用AMD或Intel硬件CPU虚拟化技术。
您需要重新引导系统并在BIOS中打开它。

在Ubuntu 20.04上安装KVM

让我们看看如何在Ubuntu 20.04 LTS Linux服务器上安装KVM。

步骤1在Ubuntu 20.04 LTS服务器上安装KVM

我们需要以下软件包:

包装名称简短描述安装目标/类型
qemu-kvmQEMU x86硬件上的完全虚拟化无终端(显示器键鼠)服务器
libvirt-daemon-systemLibvirt守护程序配置文件无终端(显示器键鼠)服务器
libvirt-clientslibvirt库的程序无终端(显示器键鼠)服务器
virtinst用于创建和克隆虚拟机的程序无终端(显示器键鼠)服务器
libosinfo-bin查询osinfo数据库的工具无终端(显示器键鼠)服务器
libguestfs-tools用于云镜像的客户机磁盘镜像管理系统和工具无终端(显示器键鼠)服务器
cpu-checker工具可帮助评估某些CPU(或BIOS)功能无终端(显示器键鼠)或GUI服务器
virt-manager用于管理虚拟机的桌面应用程序图形/GUI服务器
ssh-askpass-gnome交互式X程序,提示用户输入ssh-add的通行密码图形/远程服务器的GUI

执行以下apt命令/apt-get命令为无终端(显示器键鼠)服务器安装软件包:

$ sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst cpu-checker libguestfs-tools libosinfo-bin

步骤2在Ubuntu 20.04上配置桥接网络

默认情况下,KVM安装会创建virbr0桥,我们可以将其用于外界进行通信。
让我们使用ip命令查找有关virbr0网桥的信息:

$ ip link show master virbr0

$ bridge link show dev virbr0-nic

$ ip a s virbr0

我们可以设置br0以便从局域网上的DHCP服务器直接分配IP,或者直接按以下方式路由IPv4/IPv6地址:

查找您的以太网设备名称

执行以下命令,然后记下以太网名称:

$ nmcli connection show --active

使用enp0s31f6创建一个名为br0的新网桥

运行:

$ sudo nmcli con add ifname br0 type bridge con-name br0

$ sudo nmcli con add type bridge-slave ifname enp0s31f6 master br0

$ nmcli connection show

## SET UP IPv4 too as per your config ##

$ sudo nmcli connection modify br0 ipv4.addresses '192.168.1.25/24'

$ sudo nmcli connection modify br0 ipv4.gateway '192.168.1.254'

$ sudo nmcli connection modify br0 ipv4.dns '192.168.1.254'

$ sudo nmcli connection modify br0 ipv4.dns-search 'sweet.home'

$ sudo nmcli connection modify br0 ipv4.method manual

现在,我们可以将br0或virbr0用于来宾VM网络。

步骤3创建您的第一个虚拟机(VM)来宾

我将创建一个CentOS 8.x VM。
首先,获取CentOS 8.x最新的ISO镜像:

$ cd /var/lib/libvirt/boot/

$ sudo wget https://mirrors.edge.kernel.org/centos/8/isos/x86_64/CentOS-8.2.2004-x86_64-dvd1.iso

在Ubuntu 20.04 LTS上创建CentOS 8 VM

在此示例中,我创建一个具有2GB RAM,2个CPU内核,1个nic和40GB磁盘空间的CentOS 8.x VM,执行:

$ export ISO="/var/lib/libvirt/boot/CentOS-8.2.2004-x86_64-dvd1.iso" # Installation media

$ export NET="br0" # bridge name

$ export OS="centos8" # os type

$ export VM_IMG="/var/lib/libvirt/images/centos8.qcow2" # VM image on disk

$ sudo virt-install \

--virt-type=kvm \

--name centos8 \

--ram 2048 \

--vcpus=2 \

--os-variant=${OS} \

--virt-type=kvm \

--hvm \

--cdrom=${ISO} \

--network=bridge=${NET},model=virtio \

--graphics vnc \

--disk path=${VM_IMG},size=40,bus=virtio,format=qcow2
Starting install...
Allocating 'centos8.qcow2'               |  40 GB  00:00:01     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

要通过ssh从另一个终端配置vnc登录并执行:

$ sudo virsh dumpxml centos8 | grep vnc

`<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>`

您还可以使用以下命令:

$ sudo virsh vncdisplay centos8

请记下端口值(即5900)。
您需要使用SSH客户端设置隧道,并使用VNC客户端访问远程vnc服务器。
从客户端/桌面执行以下SSH端口转发命令:

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

## OR FOR LAN ##

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

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

步骤4使用virt-builder和云镜像创建VM

我们可以使用virt-builder命令在Ubuntu 20.04 LTS服务器上快速构建虚拟机。
要列出镜像,请运行:

$ sudo virt-builder --list

# filter it using grep command/egrep command #

$ sudo virt-builder --list | egrep -i 'debian|ubuntu'

$ sudo virt-builder --list | egrep -i centos

在KVM上按以下方式构建Debian 10 LTS vm。首先,设置shell变量:

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

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

$ sudo 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

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

安装虚拟机

$ sudo 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
Starting install...
Domain creation completed.

列出所有虚拟机:

$ sudo  virsh list

使用控制台登录:

$ sudo 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在Ubuntu 20.04 LTS无终端(显示器键鼠)服务器上安装VM。

步骤5使用云镜像

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

下载CentOS 8云镜像

$ sudo -i

# cd /var/lib/libvirt/boot

# wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.2.2004-20200611.2.x86_64.qcow2

# wget https://cloud.centos.org/centos/8/x86_64/images/CHECKSUM

# sha256sum --ignore-missing -c CHECKSUM
CentOS-8-GenericCloud-8.2.2004-20200611.2.x86_64.qcow2: OK

使用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-keygen命令确保已安装ssh-key:

# ssh-keygen -t ed25519 -C "Ubuntu 20.04 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 Ubuntu 20.04 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 Ubuntu 20.04 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.2.2004-20200611.2.x86_64.qcow $VM.qcow2

`'/var/lib/libvirt/boot/CentOS-8-GenericCloud-8.2.2004-20200611.2.x86_64.qcow' -> '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

Successfully ejected media.

## use the rm command to deleted files ##

# rm -v meta-data user-data $VM-cidata.iso
removed 'meta-data'
removed 'user-data'
removed 'centos8-vm1-cidata.iso'

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

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

# host $VM

`centos8-vm1.sweet.home has address 192.168.1.201`

使用默认的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