如何在CentOS 8 Headless Server上安装KVM
如何在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