Linux环境下KVM的安装和使用

一、实验目的
熟悉Linux环境下KVM的安装和使用

二、实验环境
centos 7

三、实验步骤

0、安装VMWare并在其上安装运行Linux虚拟机,并配置和宿主机的文件共享(注意开启虚拟机的CPU VT-x支持)

开启虚拟机的CPU VT-x支持

kvm里面装mysql kvm安装linux系统_linux


将镜像文件导入虚拟机,我采用了FTP传输,未采用文件共享的方式。

1、检查Linux host对虚拟化的支持(CPU vmx标志位和kvm内核模块)

查看CPU是否支持虚拟化

cat /proc/cpuinfo | egrep ‘vmx|svm’

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_02


找到flags部分,其中输出有SVM或VMX,表明CPU支持虚拟化技术查看是否加载KVM

lsmod | grep kvm

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_03


如上图,说明已加载

2、在host上安装kvm相关包(qemu-kvm libvirt-bin virt-manager)

(1)关闭selinux

首先查看selinux的状态

getenforce

kvm里面装mysql kvm安装linux系统_云计算_04


值为Disables则表明为关闭状态

(2)安装KVM相关软件包
yum install qemu-kvm qemu-img
virt-manager libvirt libvirt-python virt-manager
libvirt-client virt-install virt-viewer -y

kvm里面装mysql kvm安装linux系统_安全_05


(3)启动libvirt并设置开机自启动

systemctl start libvirtd

systemctl enable libvirtd

kvm里面装mysql kvm安装linux系统_linux_06


(4)创建物理桥接设备

查看网卡信息

ifconfig

kvm里面装mysql kvm安装linux系统_安全_07


找到自己桥接至局域网的网卡名称,这里我的是ens33关闭NetworkManager服务

chkconfig NetworkManager off

service NetworkManager stop

kvm里面装mysql kvm安装linux系统_安全_08


桥接设备关联网卡

virsh iface-bridge ens33 br0

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_09


brctl show

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_10


3、用virt-manager创建Linux虚拟机1

进入图形化管理界面
virt-manager

新建虚拟机,选择本地安装介质

kvm里面装mysql kvm安装linux系统_安全_11


选择iso镜像文件

kvm里面装mysql kvm安装linux系统_云计算_12


选择内存和cpu设置

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_13


为虚拟机启用存储

kvm里面装mysql kvm安装linux系统_云计算_14


准备开始安装

kvm里面装mysql kvm安装linux系统_云计算_15


安装成功

kvm里面装mysql kvm安装linux系统_安全_16


4、查看虚拟机ip,在其上安装ssh,并从host ssh登陆到虚拟机1yum install -y openssh-server

kvm里面装mysql kvm安装linux系统_linux_17


查看ip

ip addr

kvm里面装mysql kvm安装linux系统_安全_18


从host ssh登陆到虚拟机1

ssh root@192.168.244.134

kvm里面装mysql kvm安装linux系统_linux_19


5、在虚拟机1上编写任意程序并运行vi hello.c

kvm里面装mysql kvm安装linux系统_bash_20


编写程序

kvm里面装mysql kvm安装linux系统_bash_21


编译运行

gcc -o hello hello.c
./hello

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_22


6、用virt-manager创建虚拟机1的克隆虚拟机,并检查是否完全克隆了虚拟机1的环境,查看并比较两个虚拟机的镜像文件的大小,分析原因右键clone

kvm里面装mysql kvm安装linux系统_bash_23


克隆成功

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_24


虚拟机克隆后的环境与克隆前基本相同,只改变了可能会发生冲突的部分。打开配置文件,发现新克隆的虚拟机已经自动生成了新的UUID和MAC地址,这是kvm和vmware的克隆不同之处。

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_25


kvm里面装mysql kvm安装linux系统_云计算_26


两个虚拟机的镜像文件大小如下图

kvm里面装mysql kvm安装linux系统_linux_27


kvm里面装mysql kvm安装linux系统_安全_28


可以看到,克隆出来的虚拟机镜像为2.0GB,而源虚拟机1镜像大小为21.5GB。原因是KVM虚拟机的模版导出,通常都是直接用qemu-img命令可以将默认的raw格式或者qcow2格式的磁盘文件压缩后导出,以上两种方法都能在一定程度上压缩减小导出后的镜像文件体积;但仅限于在虚拟机刚安装部署好,还没有进行过大量数据读写处理的情况下。

7、在克隆虚拟机上运行同样的程序,在两个虚拟机和host上观察对比CPU和内存资源占用情况

分别在两个虚拟机上运行无限循环程序,查看cpu和内存资源占比

Cpu资源占用情况

kvm里面装mysql kvm安装linux系统_云计算_29


可以看到,无论是一个虚拟机还是两个虚拟机同时运行无限循环程序,CPU使用率都是100%。内存占用情况

kvm里面装mysql kvm安装linux系统_云计算_30


上图为两个虚拟机同时运行无限循环程序的情况,内存占用基本相等。

kvm里面装mysql kvm安装linux系统_linux_31


上图为运行普通程序的情况,内存占比不高,且基本相等。

8、在宿主机上安装、配置并启用selinux。可以用sestatus命令查看selinux的开启状态,CentOS 6是默认开启的

vi /etc/selinux/config

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_32


修改SELINUX为enforcing,然后重启

kvm里面装mysql kvm安装linux系统_云计算_33


getenforce

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_34


开启成功

9、在虚拟机关闭和启动的情况下,检查虚拟机镜像文件的MCS标签,以及虚拟机进程的MCS标签

虚拟机开启状态:

查看镜像文件 ls -Z /var/lib/libvirt/images/

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_35


查看虚拟机进程 ps -eZ | grep qemu-kvm

kvm里面装mysql kvm安装linux系统_云计算_36


虚拟机关闭状态:

查看镜像文件 ls -Z /var/lib/libvirt/images/

kvm里面装mysql kvm安装linux系统_linux_37


查看虚拟机进程 ps -eZ | grep qemu-kvm

kvm里面装mysql kvm安装linux系统_安全_38


由于虚拟机已经关闭,所以也就没有进程可言,查询虚拟机进程命令输出为空

比较上面的结果可以得到以下结论:
1、在虚拟机启动之前,镜像文件的类型是virt_image_t,而在虚拟机启动之后,镜像文件的类型是svirt_image_t.
2、在虚拟机启动之前是没有配置MCS标签的
3、虚拟机启动之后进程和镜像文件的MCS标签存在一一对应的关系,故因此保证独立性。

10、通过在虚拟机上对host特定文件的访问,验证MCS标签的访问控制和对虚拟机的隔离作用
采用模拟的方式,并不是真正在虚拟机上访问宿主机文件,而是在宿主机上以不同的MCS标签启动bash进程(用runcon),在其中对文件进行读写操作,模拟一台虚拟机进程对另一台虚拟机进程文件的访问

先将用户的默认shell /bin/bash拷贝到/opt/mybash,并查看一下当前的安全上下文

sudo cp /bin/bash /opt/mybash

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_39


ls -lZ /opt/mybash

kvm里面装mysql kvm安装linux系统_kvm里面装mysql_40


由于在SELinux的默认安全策略里,使用svirt_t类型的入口程序必须类型为qemu_exec_t,这里修改一下mybash的类型:chcon -t qemu_exec_t /opt/mybash

kvm里面装mysql kvm安装linux系统_bash_41


ls -lZ /opt/mybash

kvm里面装mysql kvm安装linux系统_bash_42


MCS为s0:c0,c1的操作

以特定的SELinux安全策略来运行,这里切换一下类型为svirt_t和MCS为s0:c0,c1,并查看当前用户的安全上下文以确认,之后通过echo命令向/tmp/mytest文件(由于SELinux安全策略限制,此时只能向/tmp目录下写新建文件)里随便写内容,写成功后再查看一下/tmp/mytest的安全上下文sudo runcon -t svirt_t -l s0:c0,c1 /opt/mybash

kvm里面装mysql kvm安装linux系统_linux_43


手动更改mytest的MCS标签为s0:c0,c1

MCS为s0:c0,c2的操作
再以特定的SELinux安全策略来运行,这里切换一下类型为svirt_t和MCS为s0:c0,c2,并查看当前用户的安全上下文以确认,之后通过cat命令查看/tmp/mytest文件里面的内容,

runcon -t svirt_t -l s0:c0,c2 /opt/mybash

kvm里面装mysql kvm安装linux系统_bash_44


如上图所示,访问成功,成功显示mytest文件里的内容test test test,确认文件MCS与当前环境的MCS是一致的,实验成功。