Centos7 安装与使用 kvm 虚拟机
KVM(Kernel-based Virtual Machine)虚拟化是基于硬件的完全虚拟化 ,需要硬件支持(如Intel VT技术或者AMD V技术)。因此在部署之前首先要确保服务器支持虚拟化。
KVM只是虚拟化解决方案的一部分,想要实现全虚拟化,还需要其他的条件:
- CPU处理器提供的虚拟化支持(VT-x 硬件辅助虚拟化,可以为GuestOS创建虚拟化处理器,本质是对寄存器的隔离模拟和对指令集的划分)。
- 内存可以通过kvm虚拟化成独立的虚拟化地址(/dev/kvm为KVM内核模块生成的设备)
- I/O虚拟化(QEMU)
==> KVM虚拟化 = KVM内核模块 + /dev/kvm + QEMU
本教程以 vmware 虚拟机为例子,在其中的 centos7 虚拟机上安装 kvm 虚拟机 (windows部署方法相同)
一、首先开启虚拟化模块,如图:

注意:如果是物理服务器,那么需要进入bios里开启虚拟化支持才可以
二、 安装 qemu-kvm 、libvirt ,执行命令如下:
yum install -y qemu-kvm libvirt
- qemu-kvm 用来创建虚拟机硬盘
- libvirt 用来管理虚拟机
三、 安装 virt-install,执行命令如下:
yum -y install virt-install
- virt-install 用来创建虚拟机
四、 启动 libvirtd 并且设置开机自启动:
systemctl enable libvirtd
systemctl start libvirtd

五、配置桥接网络:
如果不配置桥接,默认情况下虚拟机走得是linux默认的网桥virbr0,通过此网桥连接后的虚拟机为NAT模式,外面无法访问内部,如图:

1、创建网桥,执行命令如下:
systemctl stop NetworkManager #不关闭会无法启动网卡
systemctl disable NetworkManager #禁止开机启动
systemctl restart network
virsh iface-bridge ens33 br0 #当前机器网卡为ens33,根据情况调整
注意:NetworkManager需要执行disable,否则机器重启后NetworkManager也会启动,此时网卡没有IP,无法连接
2、查看创建的网桥br0,网桥br0与网卡ens33绑定,因此他们的mac地址一样,如图:

注: 宿主机如果安装了桌面环境,网络由 NetworkManager 来管理,它不支持桥接网络, 所以需要先关闭 NetworkManager,一定要关闭,否则容易报错,配置完桥接后还 要启动 NetworkManager 要不桌面无法使用,是黑屏状态
六、 创建虚拟机硬盘, 硬盘名称为 CentOS-7-x86_64.raw,硬盘大小为 10G :
qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G

注:硬盘格式除了raw外还可以用 qcow2 格式,此格式支持快照但是速度没有 raw 的快,命令方式类似,qemu-img create -f qcow2 /opt/centos.qcow2 10G
七、 利用 virt-install创建虚拟机:
virt-install --virt-type kvm \
--name=centos --ram 1024 --vcpus=1 \
--cdrom=/root/CentOS-7-x86_64-DVD-2009.iso \
--disk path=/data/kvm/CentOS-7-x86_64.qcow2,format=qcow2,bus=virtio \
--network bridge=br0,model=virtio,link_state=up \
--graphics vnc,listen=0.0.0.0,port=5988 --force --autostart
注意:需要提前将iso文件上传到服务器上
- –name::表示名称
- –ram :表示内存为 1024M,也可以写为–memory
- –vcpus :表示 cpu 核数
- –cdrom: 表示镜像所在目录
- –disk :表示创建的虚拟机硬盘位置
- format=raw:指定磁盘镜像文件格式为qcow2
- bus=virtio:将磁盘驱动类型设置为virtIO,设置类型就是vda,性能更好
- –network bridte=br0 : 连接至名为br0的网桥设备
- model=virtio:将网络设置模型设置为virtIO,可提高网络性能
- link_state=up:设置虚拟网络接口的链接状态为 “up”
- –graphics :表示指定图形界面工具
- –autostart:表示自启动
- port 指定安装后通过VNC连接时候的端口号,可自定义

上图中的界面会一直保持到通过vnc安装完虚拟机后,就会自动退出,并显示完成状态
报错1:ERROR internal error: process exited while connecting to monitor: 2019-05-10T17:10:20.075431Z qemu-kvm: -drive file=/root/window.iso,format=raw,if=none,id=drive-ide0-0-1,readonly=o n: could not open disk image /root/window.iso: Could not open ‘/root/window.iso’: Permission denied Domain installation does not appear to have been successful. If it was, you can restart your domain by running: virsh –connect qemu:///system start windows otherwise, please restart your installation. 表示权限不足 可以编辑配置文件 vi /etc/libvirtd/qemu.conf 文件 取消#user=”root” #group=”root”注释 然后重启 libvirtd systemctl restart libvirtd
报错2:执行virt-install安装的时候提示错误:创建提示ERROR Host does not support domain type kvm for virtualization type ‘hvm’ arch ‘x86_64’,此错误一般是没有开启虚拟化支持
八、接下来通过 vnc 来连接虚拟机进行安装,地址为宿主机地址,端口为 5988(防 火墙提前开放端口) ,如果报错提示如下:

或者连接后瞬间闪退,可以调整如下配置:
修改成 rgb222 连接即可 ,如图:

然后开始正常安装即可,如图:

注:无需提前安装桌面环境
九、 查看虚拟机状态,执行命令如下:
virsh list --all

十、 进入虚拟机:
因为目前还不知道虚拟机的IP,因此此时还需要通过VNC来连接虚拟机,端口不变,进入后执行命令查看IP

注:如果虚拟机没有显示网卡信息,可以执行 ifup ens3 命令启动网卡,同时配置文件中的 onboot 一定设置成 yes
至此,部署 kvm 虚拟机完成!!!
常用命令:
- 开启虚拟机 :virsh start centos
- 关闭虚拟机 :virsh shutdown centos
- 重启虚拟机: virsh reboot centos
- 删除虚拟机: virsh undefine centos
- 挂起虚拟机: virsh suspend centos
- 恢复挂起虚拟机: virsh resume centos
- 强制关机: virsh destroy centos
- 导出备份配置: virsh dumpxml centos > centos.xml
- 恢复导入配置: virsh define centos.xml
- 修改配置文件: virsh edit centos
- 查看vnc端口号: virsh vncdisplay centos
有的时候 virsh shutdown 命令不能关闭虚拟机,此时要在虚拟机(不是宿主) 内安装 acpid 软件并设置开机自启动,然后就可以执行 shutdown|reboot 来关闭 和重启了, yum -y install acpid systemctl start acpid systemctl enable acpid
通过图形化界面管理多台虚拟机
如果一台机器上安装了多台 kvm 虚拟机,如果想通过 vnc 连接只能输入对应的端口号(从 5900 开始递增),此种方法过于麻烦,可以通过安装图形化管理界面 virt-manager 来管理所有虚拟机(前提是宿主机已经安装了桌面环境,gnome 或者 kde 桌面都可以,建议 kde 桌面,安装简单),在宿主机执行命令如下:
yum -y install virt-manager
通过 vnc 连接宿主机桌面环境(不是连接内部虚拟机),并打开终端命令行,在其中执行 virt-manager,弹出界面如下:

点击对应的虚拟机右键既可选择开启/关闭/重启虚拟机 如果右键关机键无法实现关机可以从此处关机 ,如图:

通过Virt-manager 来安装虚拟机,此种方法简单,操作如图所示:

选择镜像文件位置,如图:

设置内存和 CPU ,如图:

创建磁盘空间,以及自定义名称,如图:


点击Finish既可以开始安装!!!
kvm网络优化
kvm 安装的虚拟机默认网卡驱动为 rtl8139,除此之外还有e1000和virtio,三者主要区别就是速度:
- rtl8139: 10/100Mb/s
- e1000: 1Gb/s
- virtio 10Gb/s
在实际的测试结果中使用virtio要比使用e1000或者rtl8139网络吞吐性能要高出2倍左右,如果修改为e1000,直接将rtl8139改为e1000即可
本例子中将网卡驱动修改为virtio
Linux的内核是从2.6.24才开始支持Virtio的,通过如下命令查看:
grep -i Virtio /boot/config-3.10.0-1160.el7.x86_64

Linux系统原生自带就有,但是如果你的虚拟机是Windows,那么得装Virtio驱动,下载地址:http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers
1、首先从虚拟机的xml文件中找到已经使用virtio驱动的硬件,复制address地址内容,如图:

2、找到硬盘的配置内容位置,修改bus的名字为virtio,address所在行替换为第一步复制的行,并将slot修改为0x06,如图:

3、找到网卡配置内容,修改type为virtio, address所在行替换为第一步复制的行,并将slot修改为0x07,如图:

注意:slot参数是需要修改的,不能重复,因此硬盘slot使用0x06,,网卡使用0x07
kvm 快照管理
kvm 虚拟机默认使用 raw 的镜像格式,优点是性能好,速度快,但是缺点是不支持一些新的 功能,如镜像(快照)、zlib 磁盘压缩、AES 加密等,要使用镜像功能需要将 raw 装换为 qcow2 格式 进行快照备份
1. 查看现有磁盘镜像格式 ,执行命令: qemu-img info centos.raw

2. 关闭虚拟机将 raw 转换成 qcow2 格式 ,执行命令: qemu-img convert -f raw -O qcow2 centos.raw centos.qcow2 , f 表示源镜像格式,-O 表示目标镜像格式(不是零是大写的欧)

再次查询当前镜像格式发现已经变成了 qcow2 ,如图:

3. 修改虚拟机配置文件,将配置文件中的 raw 格式修改成 qcow2 格式 ,如图:

4. 对虚拟机 centos6.9 进行创建快照 ,执行命令如下:
virsh snapshot-create-as centos6.9 centos
其中 centos 属于快照别名,通过 as 制定的,也可以不加 as 不加别名得到的就是一个版本号
5. 查看虚拟机快照版本, 执行命令:virsh snapshot-list centos6.9 ,如图:

virsh snapshot-current centos6.9 可以看到版本号 ,如图:

创建的快照默认在/var/lib/libvirt/qemu/snapshot 目录下 ,如图:

6. 恢复虚拟机快照, 恢复之前要先关闭虚拟机,通过virsh domstate centos6.9 确认是否为关闭状态,执行如下命令恢复快照。
virsh snapshot-revert centos6.9 centos
恢复之前可以通过 virsh snapshot-list centos6.9 查看当前镜像下有几个快照然后选怎恢复哪 个版本的快照
7. 删除快照,执行命令:virsh snapshot-delete centos6.9 centos ,如图:

kvm 虚拟机重命名
1. 查看所有 kvm 虚拟机 :virsh list –all
2. 重命名虚拟机需要先将虚拟机关闭,然后导出其 xml 文件,进入xml文件目录下,cd /etc/libvirt/qemu 执行命令: virsh dumpxml centos6.9 > centos.xml ,将centos6.9.xml重命名为centos6.xml,原centos6.9还在,如图:

编辑centos6.xml,修改其中的name为修改后的虚拟机的名字,如图:

3.通过命令 virsh undefine centos6.9 删除之前的虚拟机配置文件。
4.通过命令 virsh define /etc/libvirt/centos6.xml 重新定义虚拟机配置文件
5. 再次使用 virsh list –all 命令查看结果 ,已经重命名成功,如图:

6. 注意:当虚拟机下面存在快照时无法用 virsh undefine 来删除,需要先将快照删除 报错如下:

7. 更改虚拟机和内存可以直接通过命令进入配置文件中修改 virsh edit centos6 (需关机后修改)

kvm 虚拟机克隆
克隆可以手动克隆也可以选择通过 virt-manager 的方式来克隆 virt-manager 克隆方式简单 只需要先关闭虚拟机后然后在图形界面右键选择 clone 即可,例如:


新的克隆机的 mac 地址都会自动变更成新的,但是原来安装的机器的 vnc 端口 不会变(如果是通过 vnc 来安装的).此时我们需要更改原端口 ,如图:

修改端口后就可以通过 vnc 和端口来连接机器 连接之后更改 ip 地址,然后重启网卡或者重启机 器后即可正常使用
如果虚拟机出现下面这种情况:表示挂起 , 可以使用命令 virsh resume k8s 来唤醒虚拟机 ,如图:

如果要强制关闭虚拟机则使用 virsh destroy 虚拟机名字
更改虚拟机磁盘位置
当虚拟机所在的磁盘空间满了之后需要将部分虚拟机转移到另一个磁盘中,操作方法如下:
- 将对应虚拟机磁盘文件转移到 新的磁盘上。
- 修改对应的xml文件,更改里面的磁盘文件位置。
例如: 原来在/data 目录下,现在转移到 /vnet 目录下 mv /data/ansible.img /vnet, ansible.img为虚拟机磁盘文件
修改对应的 xml 文件(修改之前先备份),xml 文件在/etc/libvirt/qemu/目录下 ,通过命令 virsh edit ansible 的方式修改( vi /vim 方法修改后无法生效 ), 修改后完后执行 virsh start ansible 重新启动虚拟机即可

可以将raw格式理解为后置备,分配后直接占用所有空间,qcow2理解为精简置备,随着使用量的增加逐渐增加,直到峰值
禁止 kvm 虚拟机自启动命令:virsh autostart –disable centos7.0
kvm 虚拟机静态迁移
可以将 B 物理机器上的虚拟机的磁盘文件以及 xml 配置文件拷贝到 A 机器上然后重新定义机器即可,例如:
在 A 机器上执行:将 B 机器上的磁盘文件拷贝到 A 机器的指定目录下
scp root@B 机器:/home/centos.raw /home/
scp root@B 机器: /etc/libvirt/qemu/centos.xml /etc/libvirt/qemu/
重新定义机器即可 : virsh define /etc/libvirt/qemu/centos.xml
kvm 虚拟机动态迁移
1. 创建共享存储:(nfs)
2. 两台机器挂在共享存储
3. 启动动态迁移 ,通过命令 virsh migrate –live
4. 创建迁移互的配置文件
5. 重新定义虚拟机
kvm虚拟机扩容
扩容有两种方式:
- 第一种是在原有磁盘上增加大小的扩容
- 新增一块硬盘,进行扩容
一、修改原有磁盘大小进行扩容
1、首先查看扩容之前磁盘大小,可使用空间为11G,执行命令如下:

2、查看当前虚拟机磁盘容量,执行命令如下:
qemu-img info Kylin-Server-V10-SP3-General-Release-2303-X86_64.qcow2

3、关闭虚拟机,并在宿主机上给虚拟机增加容量40G空间,执行命令如下:
qemu-img resize Kylin-Server-V10-SP3-General-Release-2303-X86_64.qcow2 +40G

4、启动虚拟机,查看磁盘总空间已经增加,但是还没分配到lvm逻辑卷中,如图:

5、接下来对磁盘进行分区,没标注的地方直接回车即可,执行命令如下:

6、分区后可以看到已经出现的一个新的分区/dev/sda3,如图:

7、接下来对虚拟机的PV进行扩容,vg也会一起扩容过去,执行命令如下:

8、接下来对LVM进行扩容,执行命令如下:
lvextend -l +100%FREE /dev/mapper/klas-root #扩容LVM逻辑卷
xfs_growfs /dev/mapper/klas-root #刷新磁盘文件系统

9、此时再次查看磁盘空间,可以看到已经新增了40G,如图:

二、新增一块硬盘扩容
1、首先查看扩容之前虚拟机的磁盘大小,根目录为8G,如图:

2、创建一个新的磁盘,大小为5G,如图:

3、关闭虚拟机,编辑虚拟机配置文件,将新磁盘添加,如图:
virsh shutdown centos
virsh edit centos #本例子虚拟机假设为centos

注意:
- source中要改为新加的磁盘名
- dev位置改为vdb,第一块磁盘为vda,因此这里改为vdb
- slot位置也要改,不能与原有的冲突,可根据实际情况改,不冲突即可
4、启动虚拟机,登录后可以看到新添加的磁盘,如图:

5、接下来继续按照”修改原有磁盘大小章节”的第四步方法来进行扩容即可,扩容后可以看到根目录已扩容完成,如图:

kvm虚拟机挂载ISO文件
有的时候,虚拟机需要挂载iso文件来进行配置本地yum源,此时可以通过如下方法
1、在宿主机执行命令编辑虚拟机,找到cdrom位置,添加source内容如图:

2、添加完成后需要重启虚拟机才可以,在宿主机执行命令如下:
virsh reboot 虚拟机名字 //如果不成功就virsh destroy centos强制关机然后virsh start centos启动
3、进入虚拟机中,创建一个挂载目录,然后将iso挂载,如下:
mkdir -p /media/cdrom
mount /dev/cdrom /media/cdrom

安装win7
virt-install --virt-type kvm --name=win7_51_249 \
--ram 4096 --vcpus=4 --os-type=windows \
--os-variant=win7 \
--disk device=cdrom,path=/data/iso/cn_windows7.iso \
--disk device=cdrom,path=/data/iso/virtio-win-0.1.102.iso \
--disk path=/data/kvm/win7.qcow2,format=qcow2,bus=virtio \
--network bridge=br0,model=virtio,link_state=up \
--graphics vnc,listen=0.0.0.0,port=5967 --force --autostart
注:安装windows是需要提前下载驱动virtio-win的,下载地址https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.240-1/
安装win10
virt-install --virt-type kvm \
--name=win10_49_252 --ram 4096 --vcpus=4 \
--os-type=windows --disk path=/data2/kvm/win10_49_252.qcow2 \
--os-variant=auto --cdrom /data/iso/win10.iso \
--disk /data/iso/virtio-win-0.1.173_amd64.vfd,device=floppy \
--network bridge=br0,model=virtio,link_state=up \
--graphics vnc,listen=0.0.0.0,port=5966 --force --autostart
virtio文件下载地址https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.173-9/
安装后默认情况下没有网卡,此时需要安装网络驱动才行,邮件我的电脑–管理–设备管理,在其他设置选择网卡控制器,如图:

右键选择更新驱动,如图:

选择浏览我的电脑驱动,如图:

点击浏览,选择A盘下的win10,如图:

弹出网卡驱动后,选择安装,如图:

安装完成后,进入到网路配置页面即可看到网卡已经出现,并可根据需要配置自动获取或者静态IP即可,如图:

问题:宿主机有网络,但是宿主机内的虚拟机没有网络?
可查看是否NetworkManager 是否关闭,如果没关闭会抢走”物理口,导致桥接失败,可执行如下命令:
systemctl stop NetworkManager
systemctl disable NetworkManager


