在Ubuntu 20.04上安装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

使用云镜像

构建单个虚拟机,我们可以采用手动安装方法。但是,如果我们需要部署大量的虚拟机呢?
可以试试云镜像。

我们可以根据需要修改预构建好的云镜像。

让我们看一下如何使用云镜像创建一个CentOS 8虚拟机。

下载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 

创建所需的目录

D=/var/lib/libvirt/images 
VM=centos8-vm1 ### 新建虚拟机名称
mkdir -vp $D/$VM 

创建meta-data文件

cd $D/$VM 
vi meta-data

添加下面配置:

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

创建user-data文件

我们将使用ssh密钥登录虚拟机。
所以请确保使用ssh-keygen生成了相应的密钥:

ssh-keygen -t ed25519 -C "centos 8 login ssh key"

编辑user-data文件:

cd $D/$VM 
vi user-data

添加下面内容:

#cloud-config
 
# Hostname management
preserve_hostname: False
hostname: centos8-vm1
fqdn: centos8-vm1.sweet.home
 
# Users
users:
    - default
    - name: vivek
      groups: ['wheel']
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL
      ssh-authorized-keys:
        - ssh-ed25519 T1D1J+Y4evzDB2lrN7udI3vRXi4U3z2gxSCp/mU3DuA centos8 login ssh key
 
# Configure where output will go
output:
  all: ">> /var/log/cloud-init.log"
 
# configure interaction with ssh server
ssh_genkeytypes: ['ed25519', 'rsa']
 
ssh_authorized_keys:
  - ssh-ed25519 T1D1J+Y4evzDB2lrN7udI3vRXi4U3z2gxSCp/mU3DuA centos8 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

检查user-data语法是否正确

cloud-init devel schema --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

创建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

创建一个池

virsh pool-create-as --name $VM --type dir --target $D/$VM 

通过云镜像安装CentOS 8虚拟机

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 -v meta-data user-data $VM-cidata.iso

查看KVM虚拟机的IP地址

如果使用br0,则执行:

host $VM 

如果使用virbr0,则执行:

virsh net-dhcp-leases default

验证是否可以登录到centos8-vm

使用ssh命令

ssh jack@$VM 
ssh jack@192.168.2.201

创建第一个虚拟机

我们将创建一个CentOS 8.x 虚拟机。

下载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 虚拟机

$ 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

配置从另一个终端通过ssh使用vnc登录:

$ sudo virsh dumpxml centos8 | grep vnc 
$ sudo virsh vncdisplay centos8

记下port号。

然后使用ssh客户端建立隧道,使用vnc客户端访问远程vnc服务器。
在你的客户端/桌面系统尚,执行下面命令,设置SSH端口转发:

$ ssh jack@server1.onitroad.local -L 5900:127.0.0.1:5900 
$ ssh jack@192.168.2.25 -L 5900:127.0.0.1:5900

一旦建立了ssh隧道,就可以将VNC客户端指向127.0.0.1(localhost)地址和端口5900。
您应该在Linux/macOS/Unix桌面上看到CentOS Linux 8 虚拟机安装界面。
现在按照屏幕上的说明安装CentOS 8 虚拟机。安装后,继续并单击重新启动按钮。远程服务器关闭了与VNC客户端的连接。您可以通过KVM客户机重新连接以配置服务器的其余部分。

在Ubuntu 20.04上配置桥接网络

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

$ ip link show master virbr0
$ bridge link show dev virbr0-nic 
$ ip a s virbr0

查看以太网设备名称

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

$ 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.2.25/24' 
$ sudo nmcli connection modify br0 ipv4.gateway '192.168.2.254' 
$ sudo nmcli connection modify br0 ipv4.dns '192.168.2.254' 
$ sudo nmcli connection modify br0 ipv4.dns-search 'sweet.home' 
$ sudo nmcli connection modify br0 ipv4.method manual

现在,我们可以将br0或者virbr0用于虚拟机网络。

KVM管理命令virsh

查看所有KVM虚拟机

# virsh list --all

获取KVM虚拟机信息

# virsh dominfo vmName
# virsh dominfo centos8-vm1

停止/关闭虚拟机

# virsh shutdown centos8-vm1

启动KVM虚拟机

# virsh start centos8-vm1

设置虚拟机在CentOS 8服务器启动时自动启动

# virsh autostart centos8-vm1

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

# virsh reboot ubuntu-vm1

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

# virsh reset ubuntu-vm1

删除KVM虚拟机

# 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
如何在Ubuntu 20.04 LTS服务器上安装KVM?

如何在Ubuntu 20.04 LTS Linux服务器上安装KVM并使用virt-install创建新的虚拟机?
如何使用virt-builder快速构建新的虚拟机?

检测CPU是否支持KVM

执行下面命令:

$ lscpu
$ kvm-ok

默认情况下,许多系统制造商在BIOS中禁用了CPU虚拟化技术。
我们需要在BIOS中打开它。

使用virt-builder和云镜像创建虚拟机

我们可以使用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 虚拟机

首先,设置SHELL变量:

export vm="debian-10-vm1"               # 虚拟机名称
export os="debian-10"                   # 操作系统
export tz="Asia/Chongqing"              # 时区
export ram="1024"                       # 内存大小 单位MB
export disk="10G"                       # 磁盘大小
export vcpu="1"                         # cpu数量
export key=/home/vivek/.ssh/id_rsa.pub  # SSH公钥
export pwd="Encrypted_PASSWORD_HERE"    # 使用 'mkpasswd --method=sha512crypt'生成加密的密码
export bridge="br0"                     # 桥接网络名称,比如'br0' 或 'virbr0'
export ostype="debian10"                # 执行 'osinfo-query os' 获取系统类型

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

$ 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/vivek -G sudo vivek" \ 
--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

记下随机生成的root密码。

现在,我们的自定义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

查看所有虚拟机:

$ sudo  virsh list

使用控制台登录虚拟机:

$ sudo virsh console ${vm}

因为我们在镜像中注入了ssh公钥。所以还可以通过ssh登录

$ host $vm 
$ ssh root@vm-ip-here 
$ ssh root@${vm}

我们可以使用virt-builder命令构建各种虚拟机。然后,我们使用virt-install在Ubuntu 20.04 LTS服务器上安装虚拟机。

日期:2020-03-23 08:03:59 来源:oir作者:oir