KVM常用命令virsh

列出所有虚拟机

# 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

安装kvm

运行以下dnf命令/yum命令:

# dnf module install virt

然后安装创建新虚拟机所需的工具

# dnf install virt-install virt-viewer libguestfs-tools

使用systemctl命令启动libvirtd服务并设置开机自启动:

# systemctl enable libvirtd.service
# systemctl start libvirtd.service
# systemctl status libvirtd.service ## 查看服务状态

KVM

KVM是基于Linux内核的免费的开放源代码虚拟化软件。
用于在物理服务器上创建多个虚拟机。

要使用KVM,必须在服务器BIOS中启用了虚拟化技术(VT)。
使用下面命令来检查CPU是否支持Intel VT和AMD-V虚拟化技术:

$ lscpu | grep Virtualization

配置桥接网络

virbr0网络是私有网络。用于同一个服务器中的多个虚拟机之间通讯。

如果要使虚拟机和外界的服务器通讯,那么需要在服务器上搭建一个新网桥。

修改接口的配置文件。

# vi /etc/sysconfig/network-scripts/ifcfg-br0

br0配置:

## 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配置:

TYPE=Ethernet
NAME=bridge-slave-eno1
UUID=f43a8688-81f0-4860-91d4-f8f41efe2d10
DEVICE=eno1
ONBOOT=yes
BRIDGE=br0

重启网络服务

# 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  --

检查kvm安装

使用lsmod命令确保已经加载了KVM Linux内核模块(驱动程序):

# lsmod | grep -i kvm

配置桥接网络

默认情况下,libvirtd配置了一个网桥virbr0。
使用下面命令进行确认:

# virsh net-info default
# nmcli device
# nmcli connection show

libvirtd使用轻型DHCP和缓存DNS服务器dnsmasq。

查看DHCP的IP分配范围:

# cat /var/lib/libvirt/dnsmasq/default.conf
# egrep '^(dhcp-range|interface)' /var/lib/libvirt/dnsmasq/default.conf

# ip a show virbr0
# ip r

使用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 虚拟机

首先,设置SHELL变量:

vm="ubuntu-vm1"                  # VM name
os="ubuntu-18.04"                # OS    
tz="Asia/Chongqing"                # 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/jack -G sudo jack" \
--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密码。

虚拟机镜像制作好了以后,就可以使用它来安装虚拟机了。

安装虚拟机

# 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密钥,所以可以使用ssh登录:

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

我们可以使用virt-builder在在几分钟内构建各种虚拟机。

创建第一个虚拟机/来宾操作系统

这里,我们将创建一个全新的CentOS 8.x VM。

使用wget命令下载最新的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

创建CentOS 8.x 虚拟机

执行下面命令:

# 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端口。

# virsh dumpxml centos8-vm | grep vnc

我们将通过SSH建立隧道。然后使用VNC客户端通过VNC服务远程访问虚拟机。
首先在Linux和Unix客户端上执行以下SSH端口转发命令:

{jack@linux-desktop:~ }$ ssh jack@192.168.2.19 -L 5900:127.0.0.1:5900

当建立ssh隧道后,在VNC客户端中,将HOST和端口指向127.0.0.1(localhost)地址和" 5900"。
连接并继续进行CentOS 8.x安装。

如何创建RHEL 8.x 虚拟机

你需要下载rhel-server.iso到本地,然后执行下面命令创建。

# 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端口信息

$ sudo virsh dumpxml rhel8-server | grep vnc

使用SSH客户端设置隧道:

$ ssh jack@192.168.2.19 -L 5906:127.0.0.1:5906

建立ssh隧道后,将VNC客户端指向127.0.0.1(localhost)地址和端口5906,以继续进行RHEL 8.x安装。

如何在CentOS 8服务器上安装KVM

如何在CentOS 8上安装KVM并使用云镜像来安装来宾虚拟机?
如何在CentOS 8中使用KVM设置和管理虚拟化环境?
如何在Linux物理服务器上安装和管理Linux虚拟机?

使用云镜像

上面手动安装方法只适用于创建单个虚拟机或者用于学习目的。
如果我们要部署大量的虚拟机呢?
那么可以尝试使用云镜像。

我们可以根据需要对云镜像进行修改。比如,添加用户,安装ssh密钥,设置时区等。

下面演示如何使用云镜像创建CentOS 8虚拟机。

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

创建所需的目录

# D=/var/lib/libvirt/images
# VM=centos8-vm1 
# mkdir -vp $D/$VM
mkdir: created directory '/var/lib/libvirt/images/centos8-vm1'

创建元数据文件meta-data

# cd $D/$VM
# vi meta-data

内容如下:

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

创建用户数据文件

生成ssh密钥,用于通过ssh密钥登录到虚拟机中。

# ssh-keygen -t ed25519 -C "CentOS 8 host server 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: jack
      groups: ['wheel']
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL
      ssh-authorized-keys:
        - ssh-ed25519 CentOS 8主机服务器登录ssh密钥
 
# 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 CentOS 8主机服务器登录ssh密钥
 
# set timezone for VM
timezone: Asia/Chongqing
 
# 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.1.1911-20200113.3.x86_64.qcow2 $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

查看DHCP分配给虚拟机的IP地址

如果使用br0,请使用host命令查看centos8-vm1的地址:

# host $VM

如果使用默认的virbr0 桥接接口,则使用下面命令:

# virsh net-dhcp-leases default

登录到centos8-vm

使用ssh命令:

# ssh jack@$VM
# ssh jack@192.168.2.212
日期:2020-03-23 08:03:59 来源:oir作者:oir