Linux环境下KVM的安装和使用

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

二、实验环境
centos 7

三、实验步骤

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

开启虚拟机的CPU VT-x支持
在这里插入图片描述
将镜像文件导入虚拟机,我采用了FTP传输,未采用文件共享的方式。

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

查看CPU是否支持虚拟化
cat /proc/cpuinfo | egrep ‘vmx|svm’
在这里插入图片描述
找到flags部分,其中输出有SVM或VMX,表明CPU支持虚拟化技术

查看是否加载KVM
lsmod | grep kvm
在这里插入图片描述
如上图,说明已加载

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

(1)关闭selinux
首先查看selinux的状态
getenforce
在这里插入图片描述
值为Disables则表明为关闭状态

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

在这里插入图片描述
(3)启动libvirt并设置开机自启动
systemctl start libvirtd
systemctl enable libvirtd

在这里插入图片描述
(4)创建物理桥接设备
查看网卡信息
ifconfig
在这里插入图片描述
找到自己桥接至局域网的网卡名称,这里我的是ens33

关闭NetworkManager服务
chkconfig NetworkManager off
service NetworkManager stop
在这里插入图片描述
桥接设备关联网卡
virsh iface-bridge ens33 br0
在这里插入图片描述
brctl show在这里插入图片描述
3、用virt-manager创建Linux虚拟机1

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

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

在这里插入图片描述
选择iso镜像文件在这里插入图片描述
选择内存和cpu设置
在这里插入图片描述
为虚拟机启用存储在这里插入图片描述
准备开始安装在这里插入图片描述
安装成功在这里插入图片描述
4、查看虚拟机ip,在其上安装ssh,并从host ssh登陆到虚拟机1

yum install -y openssh-server
在这里插入图片描述
查看ip
ip addr
在这里插入图片描述
从host ssh登陆到虚拟机1
ssh root@192.168.244.134
在这里插入图片描述
5、在虚拟机1上编写任意程序并运行

vi hello.c
在这里插入图片描述
编写程序在这里插入图片描述
编译运行

gcc -o hello hello.c
./hello

在这里插入图片描述
6、用virt-manager创建虚拟机1的克隆虚拟机,并检查是否完全克隆了虚拟机1的环境,查看并比较两个虚拟机的镜像文件的大小,分析原因

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

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

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

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

Cpu资源占用情况
在这里插入图片描述
可以看到,无论是一个虚拟机还是两个虚拟机同时运行无限循环程序,CPU使用率都是100%。

内存占用情况
在这里插入图片描述
上图为两个虚拟机同时运行无限循环程序的情况,内存占用基本相等。

在这里插入图片描述
上图为运行普通程序的情况,内存占比不高,且基本相等。

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

vi /etc/selinux/config
在这里插入图片描述
修改SELINUX为enforcing,然后重启
在这里插入图片描述
getenforce在这里插入图片描述
开启成功

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

虚拟机开启状态:
查看镜像文件 ls -Z /var/lib/libvirt/images/
在这里插入图片描述
查看虚拟机进程 ps -eZ | grep qemu-kvm在这里插入图片描述
虚拟机关闭状态:
查看镜像文件 ls -Z /var/lib/libvirt/images/
在这里插入图片描述
查看虚拟机进程 ps -eZ | grep qemu-kvm在这里插入图片描述
由于虚拟机已经关闭,所以也就没有进程可言,查询虚拟机进程命令输出为空

比较上面的结果可以得到以下结论:
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
在这里插入图片描述
ls -lZ /opt/mybash在这里插入图片描述
由于在SELinux的默认安全策略里,使用svirt_t类型的入口程序必须类型为qemu_exec_t,这里修改一下mybash的类型:

chcon -t qemu_exec_t /opt/mybash
在这里插入图片描述
ls -lZ /opt/mybash在这里插入图片描述
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
在这里插入图片描述
手动更改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

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐