如何在CentOS 8上安装KVM以及如何在物理服务器上安装和管理虚拟机
原文地址:如何在CentOS 8上安装KVM以及如何在物理服务器上安装和管理虚拟机
本文分享了如何在CentOS 8中使用KVM设置和管理虚拟化环境。同时还分享了如何使用命令行在物理服务器上安装和管理虚拟机(VM)。
基于Linux内核的虚拟机(KVM)是免费的开放源代码虚拟化软件,用于CentOS8。KVM将您的服务器转变为虚拟机监控程序。
确保在服务器的BIOS中启用了虚拟化技术(VT)。您还可以运行以下命令来测试CPU是否支持Intel VT和AMD-V虚拟化技术: KVM仅支持Intel / AMD 64位和IBM z13,Power 8/9 CPU以及您的主机VM的更高体系结构。
$ lscpu | grep Virtualization
## Test for both Intel/AMD CPU that support KVM ##
$ sort -u
Virtualization: VT-x
在CentOS 8服务器上安装KVM的步骤
请使用su命令或sudo命令成为root用户:
$ sudo -i
## OR ##
$ 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
如果您希望虚拟机可用于LAN上的其他服务器,请在连接到LAN的服务器上设置网桥。更新您的nic配置文件。这是我的预配置的br0接口,该接口被eno1以太网奴役:
vi /etc/sysconfig/network-scripts/ifcfg-br0
br0 config:
## my lan 192.168.2.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.2.19
PREFIX=24
GATEWAY=192.168.2.254
DNS1=192.168.2.254
DOMAIN=sweet.home
IPV6_DISABLED=yes
和eno1以太网的
# vi /etc/sysconfig/network-scripts/ifcfg-bridge-slave-eno1
配置:eno1 config:
TYPE=Ethernet
NAME=bridge-slave-eno1
UUID=f43a8688-81f0-4860-91d4-f8f41efe2d10
DEVICE=eno1
ONBOOT=yes
BRIDGE=br0
重新启动网络服务(警告ssh命令将断开连接,最好重新启动Linux机器): 使用nmcli命令验证它。 示例输出:
# systemctl restart NetworkManager.service
## OR ##
# 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 --
步骤5:创建第一个虚拟机/guest VM
我将创建一个全新的CentOS 8.x VM。首先,使用wget命令/ lftp命令获取CentOS 8.x最新 的ISO映像。使用sha256sum命令验证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
在下面的例子,我创建的CentOS 8.x中有1GB RAM,1个CPU核心,1个NIC和20GB硬盘空间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端口转发命令:
{vivek@linux-desktop:~ }$ ssh vivek@192.168.2.19 -L 5900:127.0.0.1:5900
现在,您已经建立了ssh隧道,将VNC客户端指向127.0.0.1(localhost)地址和端口5900,如下所示:
您应该看到CentOS Linux 8 guest虚拟机安装屏幕,如下所示:
现在,按照屏幕上的说明进行操作并安装CentOS8。安装完成后,继续并单击重新启动按钮。远程服务器关闭了与我们的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 vivek@192.168.2.19 -L 5906:127.0.0.1:5906
建立ssh隧道后,将VNC客户端指向127.0.0.1(localhost)地址和端口5906,以继续进行RHEL 8.x安装。
第6步:使用virt-builder构建guest镜像
可以使用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/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
示例输出:
[ 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 $6$XoUElABFFfTFr4/f$dGYZ2MCb2QcMuKQ2RmE./U0v7mhr2LFd4rbvOMdbjPCWwiyOMuirQagJ.9hBobz9Dy61AXS8oeTabem/H5YhB1 -s /bin/bash -m -d /home/vivek -G sudo vivek
[ 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%)
请记下随机root密码。现在,我们的自定义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
列出VM:
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在CentOS 8无头服务器上安装KVM。
步骤7:使用云端图片
出于学习目的或构建单个VM的考虑,可以采用手动安装方法。但是,您是否需要部署大量VM?尝试云图像。您可以根据需要修改预构建的云映像。例如,我们可以使用Cloud-init来添加用户,安装ssh密钥,设置时区等,它是事实上的多分发软件包,用于处理云实例的早期初始化。让我们看看如何使用具有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"
有关更多信息,请参见“如何在CentOS8系统上设置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: vivek
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
复制云镜像
# 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
创建一个pool
# virsh pool-create-as --name $VM --type dir --target $D/$VM
通过云映像安装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
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.2.212
使用默认的virbr0 bride interface时, 要查找Linux KVM来宾虚拟机的IP地址:
# virsh net-dhcp-leases default
验证–登录到centos8-vm
使用ssh命令:
# ssh vivek@$VM
# ssh vivek@192.168.2.212
关于有用的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
结论
在本教程中,您学习了如何在CentOS 8 Linux服务器上安装KVM以及如何使用virt-install来配置新的guest VM。此外,您还学会了使用virt-builder快速构建新的虚拟机。
{{ nComment.author.nickname }}
{{ nComment.time }}