KVM入门

KVM

KVM(Kernel-based Virtual Machine)是众多虚拟化技术之一,它是Linux内核中的一个模块,该模块依赖于CPU,如果CPU支持虚拟化,那么该模块才可以被加载。KVM技术是硬件层面的虚拟化,它会为我们虚拟各种硬件设备,这样我们可以在已有操作系统上运行别的操作系统。

实验环境为CentOS Linux release 8.2.2004 (Core)

检查CPU是否支持虚拟化

lsmod | grep kvm
# 显示kvm则表示已加载kvm模块
  • 当然加载kvm模块需要开启CPU虚拟化技术,在BIOS中设置Intel Virtualization Technology为Enable

安装软件包

安装服务端软件包

yum install qemu-kvm -y
yum install libvirt -y
yum install virt-install -y
  • qemu-kvm将内核中的虚拟功能暴露给用户,提供了用户空间的虚拟机环境
  • libvirt是一个用于管理虚拟机中间件(库)、它为开发者提供了众多管理虚拟机的接口。Libvirt几乎支持所有常见的虚拟技术,包括KVM,Xen,LXC,VMware,VirtualBox等
  • virt-install 管理虚拟机的CLI工具,底层使用了libvirt库

创建虚拟机

配置虚拟网卡

默认情况下,KVM新创建的虚拟机使用NAT网络(虚拟机可以访问外面,但外部无法访问虚拟机中的服务)。这种NAT机制通过内核内部的IP转发来进行数据传输,所以外面的机器访问不到虚拟机。为了能让外面的机器访问虚拟机,需要创建虚拟网桥(可以理解为虚拟交换机),把虚拟机的虚拟网卡与主机的物理网卡通过网桥桥接起来,这样虚拟机和主机中的服务可以相互访问了。

1. 启动IP转发

编辑/etc/sysctl.conf文件

# 去掉该行前面的#号,开启转发功能
net.ipv4.ip_forward = 1

执行sudo sysctl -p命令使配置生效

2. 创建桥接设备
# 创建网桥
nmcli con add type bridge ifname br0
nmcli connection modify br0 +ipv4.addresses 10.180.145.199/24 
# 停止物理网卡
ifdown enp4s0f2
# 将物理网卡添加至网桥
nmcli con add type bridge-slave ifname enp4s0f2 master br0

注:将物理网卡enp4s0f2添加到br0后,物理网卡的IP地址将失去作用,且物理网卡仅做数据转发,给桥配置IP地址即可

使用nmcli con show查看添加结果
NAME                 UUID                                  TYPE      DEVICE   
Bridge connection 1  1dbf8aaf-2745-4e7d-9627-8b46349eaac1  bridge    br0  
br0 slave 1          5c12cf98-455f-4798-940e-b12ce5f638c9  ethernet  enp4s0f2 
3. 创建虚拟机

首先准备好镜像文件,我这里准备了cirros.img镜像文件(下载地址),将文件放到/var/images目录下,然后通过前面提到的命令来创建虚拟机

virt-install -v \
	--virt-type kvm \
	--name test \
	--vcpus 2 \
	--memory 64 \
	--disk path=/var/images/cirros.img,bus=virtio \
	--graphics vnc,port=5901,listen=0.0.0.0 \
	--noautoconsole \
	-w bridge=br0 \
	--import

下面解释一下各个参数的作用:

  • --name myvps1 虚拟机名称为myvps1
  • --memory 512 虚拟机内存大小为512MB
  • -w bridge=br0 指定网络为网桥设备,后面具体解释
  • --disk 指定虚拟盘的位置,虚拟盘可以是一个文件,分区或者一个逻辑卷。例子指定为myvps1.img文件,总线使用virtio总线
  • --graphics 指定图形界面,例子中指定vnc远程桌面控制,即我们可以使用vnc客户端对虚拟机进行远程桌面控制
  • --noautoconsole 不要自动连接到虚拟机控制台,主要因为我们安装的服务器版虚拟机,它上面没有图形界面
  • --hvm 创建功能完整的虚拟机
  • --import 直接从盘启动虚拟机

当然关于参数的详解使用man virt-install来查看

如果虚拟机创建成功,可以通过virsh list命令查看到虚拟机已运行

[root@localhost ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 4     test                           running
4. 连接虚拟机

我们使用VNC软件来连接虚拟机,VNC软件是一款开源的Linux远程桌面控制软件,和Windows下的Teamviewer或者是QQ自带的远程桌面控制一样。VNC分服务端和客户端,安装客户端的电脑可以远程控制安装服务端的电脑,刚才我们在创建虚拟机的时候,指定支持vnc远程控制,所以我们下载一个vnc客户端就可以了。下载地址

image-20201012094238214

直接在地址栏填写网桥地址+VNC端口即可,端口号为创建虚拟机命令中--graphics vnc,port=5901

5. 遗留问题

创建虚拟机网络如果指定bridge,会自动创建tun设备,该设备是成对出现的,主要用于虚拟机与桥通信。虚拟机内部网卡eth0和主机上vnet0设备对接起来,这样虚拟机发出的数据包可以到桥上,然后经物理网卡被转发出去。

image-20201012095847478

管理虚拟机

启动虚拟机

使用下面的命令来启动刚创建的虚拟机

# virsh start myvps1

让虚拟机随物理机一起启动

# virsh autostart myvps1

列出正在运行的虚拟机,所有虚拟机,关闭的虚拟机

# virsh list
# virsh list --all
# virsh list --inactive

重启,关机

重启

# virsh reboot myvps1

关机

# virsh shutdown myvps1

保存,恢复状态

有时我们需要把某个虚拟机暂时关闭,而又想启动时恢复当时的状态,这是需要用到save命令

# virsh save myvps1 myvps1-20171202.state

执行上面的命令后,虚拟机的内存会被保存到一个文件中,然后虚拟机自动关闭

# virsh restore myvps1-20171202.state

恢复虚拟机

挂起,恢复

挂起

# virsh suspend myvps1

恢复

# virsh resume myvps1

空间扩容

在虚拟机运行一段时间后可能会需要添加更多的磁盘空间。这里可以使用attach-disk命令对磁盘扩容。

1. 生成文件

我们使用dd命令来产生一个文件

# sudo dd if=/dev/zero   of=/var/lib/libvirt/images/myvps1-disk2.image bs=1M count=4096

该命令会为我们生成一个4GB大小的文件

2. 把文件添加到虚拟机

使用attach-disk命令,把刚刚创建的文件添加到myvps1虚拟机,作为其磁盘使用:

# virsh attach-disk myvps1 \
/var/lib/libvirt/images/myvps1-disk2.img vdb \
--live \
--cache none

这样一个名为vdb的虚拟磁盘就被添加到虚拟机中了

3. 分区

将硬盘添加到虚拟机后,需要在虚拟机中对新的硬盘进行格式化才能使用。下面的操作都是在虚拟机myvps1中进行的

查看硬盘是否添加成功

# sudo fdisk -l

增加CPU核数

查看主机cpu核数

# virsh nodeinf0

查看当前虚拟机(myvps1)虚拟机核数,显示只有一个核,vcpu 0表示第0个核,而不是核数为0

# virsh vcpuinfo myvps1
关闭虚拟机
# virsh shutdown myvps1
修改最大核数为2核,并设置到配置文件(/etc/libvirt/qemu下)
# virsh setvcpus myvps1 2 --maximum --config
设置核数为2到配置文件(/etc/libvirt/qemu下)
# virsh setvcpu2 myvps1 2 --config
重启虚拟机
# virsh start myvps1

增加内存

增加内存核增加CPU核数一样,先设置最大内存,在设置当前内存

查看当前虚拟机信息,可以看到当前的内存设置
# virsh dominfo myvps1
设置最大内存为2G
# virsh setmaxmem myvps1 2097152 --config
设置当前内存为1G
# virsh setmem myvps1 1048576 --config
重启虚拟机
# virsh shutdown myvps1
# virsh start myvps1

克隆虚拟机

有时我们需要几台环境相同的虚拟机,这时,我们不需要从头创建,只需要克隆即可

先关闭虚拟机
# virsh shutdown myvps1
克隆虚拟机
# sudo virsh-clone \
--original myvps1 \
--name myvps3 \
--file /var/lib/libvirt/images/myvps3.img
启动克隆的虚拟机
# virsh start myvps3

虚拟机镜像管理

虚拟机镜像做好后,我们可能需要修改虚拟机的IP地址,虚拟机内部的文件等。当然可以先启动虚拟机,然后通过VNC或者SSH进去修改。不过,方便的方法时使用virt-edit命令来直接编辑虚拟机镜像文件即可。virt-edit是libguestfs-tools包提供的命令。

# yum install libguestfs-tools

这个软件包专门管理虚拟机的虚拟磁盘文件,提供的工具有:

  • virt-cat 显示虚拟机中文件的内容(相当于cat命令)
  • virt-edit 编辑虚拟机中的文件(相当于vi命令)
  • virt-inspector 显示虚拟机的操作系统等详细信息
  • virt-tar 在虚拟机和主机之间传递文件

当然还有很多命令,这里就不一一列出了

删除虚拟机

# virsh undefine myvps1
# virsh pool-refresh default

在执行virsh undefine myvps1时,虚拟机的虚拟磁盘文件/var/lib/libvirt/images/myvps1.img文件不会被删除,需要手动删除。删除完毕后需要执行virsh pool-refresh default命令清楚虚拟机的缓存记录

posted @ 2017-12-02 19:03  被罚站的树  阅读(1427)  评论(1编辑  收藏