如何在Ubuntu 20.04 LTS无终端(显示器键鼠)服务器上安装KVM
基于内核的虚拟机(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-kvm | QEMU x86硬件上的完全虚拟化 | 无终端(显示器键鼠)服务器 |
libvirt-daemon-system | Libvirt守护程序配置文件 | 无终端(显示器键鼠)服务器 |
libvirt-clients | libvirt库的程序 | 无终端(显示器键鼠)服务器 |
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