概述:虚拟化技术的介绍(kvm,qemu),虚拟机的安装,虚拟机的管理(virt-manger,virsh等)。
1.为什么要有虚拟化技术?
如果你的主要操作系统是windows但是又需要在Linux上工作,像VMware(需要付费。。。)或者virtualbox一定是你的首选,这样你就可以在两个操作系统间随意切换了,除了这其实我们还有解除了很多虚拟化技术;比如虚拟光驱,我们完全不需要真正的光驱也可以使用光盘镜像,这些都是我们日常接触到的,但并不是虚拟化技术的全部,现在比较热门的docker容器也是一种虚拟化技术。
在企业中可以将同一台机器的资源分割,管理员可以针对不同的客户群设置不同的虚拟机,隔离出不同的区块,以进行系统升级和维护,而完全不影响终端使用者的作业。 资讯管理人员可以建置一部商用暨个人用的桌上型电脑系统,有效隔离软体的载入和病毒的攻击;或者建置一部能够执行不同作业系统和软体的电脑,以因应不同的需求或支援旧版软体。 可见在企业中虚拟化技术有很广泛的应用。
说了这么多,先来看看你的计算机是否支持虚拟化,打开终端键入grep --color -E "vmx|svm" /proc/cpuinfo
如果有信息显示那么恭喜你,你可以安装虚拟化软件了
虚拟化软件的安装
yum install qemu-kvm qemu-img
yum install virt-manager libvirt libvirt-python python-virtinst libvirt-client
2.虚拟机的安装
和我们最友好也最简单的虚拟化技术就是虚拟机了,这里简单介绍虚拟机的安装。
2.1)图形化安装
在系统工具中找到Virtual Machine Manager或者在终端输入virt-manager打开这个虚拟机图形管理窗口,在画红圈处单机右键选择NEW可以进入虚拟创建
进入这个界面选择第一个选项,用本地的媒体安装
改图第二个选项为你的磁盘镜像的路径,选好后Forward
在这里选择你虚拟机的内存大小
这里选择硬盘的大小
这里选择虚拟机的名字,这个名字是我们识别虚拟机的一个标志
这些点完后终于来到了装机界面,这里有两个选项,第一个选项是直接安装redhat7.1,第二个选项是测试一下这个镜像再安装。
选择装系统时使用的语言(为了继续强调英语的重要性,我选择了英语。。。),是安装系统时的语言不是系统本身的!
安装系统的一个主界面按照上到下,左到右的顺序,分别是时区的选择(上海),键盘类型的选择(美式键盘),系统的语系支持(把中文加上,否则遇到中文时会出现乱码),安装的镜像源是什么(本地的磁盘镜像),软件包的选择(为了快速我选择了最小安装),安装到哪个盘上和磁盘的分区(默认的磁盘分区和我自己分的没什么区别。。。一般是/boot 200MB,swap 为内存的2倍吧,剩下的全给/),Kdump 是一种基于 kexec 的 Linux 内核崩溃捕获机制,将 kernel 崩溃前的内存镜像保存,程序员通过分析该文件找出 kernel 崩溃的原因,从而进行系统改进。最后是安装过程的网络设置(我们选择不设置)。
一切设置好后我们进入安装的进度条界面,等进度条读完,即可重启进入这个新鲜的redhat。
2.2)命令安装虚拟机
在Linux中一切皆是命令安装虚拟机也可以使用命令而且非常方便
[root@foundation3 ~]# virt-install --name mo1 --ram 1024 --file /var/lib/li bvirt/images/mo1.img --cdrom /root/Desktop/rhel-server-7.1-x86_64-dvd.iso - -file-size 8 WARNING No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results. WARNING CDROM media does not print to the text console by default, so you likel y will not see text install output. You might want to use --location.See the man page for examples of using --location with CDROM media Starting install... Allocating 'mo1.img' | 8.0 GB 00:00 Creating domain... | 0 B 00:00 Connected to domain mo1
这其中--name选项是确定虚拟机的名字,--ram是虚拟机的内存,--file为你将虚拟机的磁盘文件存储路径,--cdrom是你的镜像文件路径,--file-size是虚拟机的磁盘大小。键入命令后即可进入安装系统的界面,在上一步骤已经介绍完了。
3)虚拟机的管理
在介绍虚拟机管理命令之前我们先介绍下创建完虚拟机并安装完系统后生成了哪些文件,或者说虚拟机对于我们真机到底是个啥?
[root@foundation3 ~]# ls /etc/libvirt/qemu /var/lib/libvirt/images/ /etc/libvirt/qemu: desktop.xml mo.xml networks server.xml /var/lib/libvirt/images/: mo1.img rh124-desktop-vda.qcow2 rh124-server-vda.ovl rh124-server.xml mo.img rh124-desktop-vdb.ovl rh124-server-vda.qcow2 test.sh mo_shot.qcow2 rh124-desktop-vdb.qcow2 rh124-server-vdb.ovl vm1.qcow2 rh124-desktop-vda.ovl rh124-desktop.xml rh124-server-vdb.qcow2
上面输出的结果中红色字处就是我们生成的文件,总共两个一个xml文件和一个硬盘文件。xml文件可以随意删掉,不会影响虚拟机,但是如果删掉他我们不能再virt-manager(虚拟机图形管理工具上找到他),不过我们有方法恢复;硬盘文件如果删掉的话那你的虚拟机也就无法使用了。
virt-manager ##开启图形管理工具
virt-viewer vmname
##显示以vmname为名字的虚拟机,当我们开启虚拟机时默认不会,将他显示在前台而只是running状态,如果我们要将他显示出来就要键入上面这条命令
virsh list ##列出正在运行的虚拟机(在默认情况下,需要root用户才可以查看)
[root@foundation3 ~]# virsh list Id Name State ----------------------------------------------------
表示我没有虚拟机在运行,但是如果我不是root用户的话也会显示如上图输出
[root@foundation3 ~]# virsh start mo Domain mo started [root@foundation3 ~]# virsh list Id Name State ---------------------------------------------------- 9 mo running [root@foundation3 ~]# su - mo Last login: Wed Oct 19 10:48:59 CST 2016 on pts/3 [mo@foundation3 ~]$ virsh list Id Name State ----------------------------------------------------
所以一定要切换到root用户使用此命令否则是无效的,但是具体为什么只有root用户可以查看或其他设定都在配置文件中规定着(/etc/libvirt/qemu.conf),说到这里我想到了一个我刚开始安装虚拟机出现的错误,如下:
[root@foundation3 ~]# virt-install --name zhao --ram 1024 --file /var/lib/libvirt/images/zhao.img --file-size 8 --cdrom /root/Desktop/rhel-server-7.1-x86_64-dvd.iso WARNING No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results. WARNING CDROM media does not print to the text console by default, so you likely will not see text install output. You might want to use --location.See the man page for examples of using --location with CDROM media Starting install... Allocating 'zhao.img' | 8.0 GB 00:00:00 ERROR internal error: process exited while connecting to monitor: 2016-10-19T03:00:25.552714Z qemu-kvm: -drive file=/root/Desktop/rhel-server-7.1-x86_64-dvd.iso,if=none,id=drive-ide0-0-1,readonly=on,format=raw: could not open disk image /root/Desktop/rhel-server-7.1-x86_64-dvd.iso: Could not open file: 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 zhao otherwise, please restart your installation.
根据上面红字的报错,他竟然说我没权限,我是root好不好!!我很是生气,作为root用户还要看到“Permission denied“的侮辱,我先查看了下镜像文件的权限,如下:
[root@foundation3 ~]# ll /root/Desktop/rhel-server-7.1-x86_64-dvd.iso -rw-r--r-- 1 qemu qemu 3890216960 Oct 17 22:15 /root/Desktop/rhel-server-7.1-x86_64-dvd.iso
显示结果是我有对他的读写权限,所以权限没有问题,经过仔细的查阅资料,我找到了解决方法,原来对虚拟机操作的权限还在一个他的配置文件中规定着!
#user = "root" # The group for QEMU processes run by the system instance. It can be # specified in a similar way to user. #group = "root" # Whether libvirt should dynamically change file ownership # to match the configured user/group above. Defaults to 1. # Set to 0 to disable file ownership changes. #dynamic_ownership =0
将红色处的#去掉我们的root就有权限创建虚拟机啦。
virsh list --all ##列出所有虚拟机(同样也需要root用户)
[root@foundation3 ~]# virsh list --all Id Name State ---------------------------------------------------- - desktop shut off - mo shut off - server shut off
virsh start vmname ##开启名为vmname的虚拟机
virsh shutdown vmname ##正常关闭vmname虚拟机
virsh destroy vmname ##强行结束vmname虚拟机
virsh create vmname.xml ##指定vmname虚拟机前端文件(*.xml),并显示在图形管理工具上,相当于临时恢复虚拟机前端引导选项
virsh define vmname.xml ##永久恢复虚拟机前端引导项
virsh undefine vmname.xml ##删除虚拟机前端管理,但不会删除硬盘镜像。
下面仔细说明下这个前段引导的作用和一些操作:
虚拟机图形管理界面和virsh list --all显示出一样的结果
我们可以对”mo“这台虚拟机单机右键选择Delete,删除前端文件。
也可以通过 virsh undefine mo命令删除它的前端文件。这个命令的原理是删除掉/etc/libvirt/qemu/mo.xml,所以只要提前备份这个文件即可恢复前端文件。然后使用virsh define */mo.xml就可恢复前端文件。
但是我没有备份。就只能通过重新加载镜像来生成mo.xml文件了,其实也非常简单。
[root@foundation3 ~]# virt-install --name mo --ram 1024 --disk /var/lib/libvirt/images/mo.img
是不是和刚开始创建虚拟机的命令是一样的只不过参数有些变化,这里我们相当于在电影中将一个特工的身份抹掉,再生成一个身份,所以只用指定它的新名字(可与和以前一样)和真身是什么(就是硬盘文件)即可,而且速度非常快。这样就重新生成好了前端文件。
4)虚拟机快照
使用过vmware的同学都知道虚拟机有一个快照功能非常好用,也是我们能在虚拟机上随便折腾的基础保证
红线处就是拍摄快照的地方。我们的kvm呢,当然也有这个功能了。如下
[root@foundation3 ~]# qemu-img create -f qcow2 -b /var/lib//libvirt/images/mo.img /var/lib/libvirt/images/test.qcow2
Formatting '/var/lib/libvirt/images/test.qcow2', fmt=qcow2 size=8589934592 backing_file='/var/lib//libvirt/images/mo.img' encryption=off cluster_size=65536 lazy_refcounts=off
[root@foundation3 ~]# ls /var/lib/libvirt/images/
mo1.img rh124-desktop-vdb.ovl rh124-server-vdb.ovl vm1.qcow2
mo.img rh124-desktop-vdb.qcow2 rh124-server-vdb.qcow2 zhao.img
mo_shot.qcow2 rh124-desktop.xml rh124-server.xml
rh124-desktop-vda.ovl rh124-server-vda.ovl test.qcow2
rh124-desktop-vda.qcow2 rh124-server-vda.qcow2 test.sh
[root@foundation3 ~]#
红色部分就是我们创建的快照,接下来我们使用上面提到的
[root@foundation3 ~]# virt-install --name mo --ram 1024 --disk /var/lib/libvirt/images/test.qcow2
就可以使用快照了,如果快照被玩坏了,再重新建立一个快照,仍然和原虚拟机是一样的,但是切记,虚拟机真正的磁盘文件不可删除或者玩坏,因为那样就没法恢复了。
总结一下kvm的快照其实就是以原虚拟机磁盘文件为基础,拍摄快照,每次拍摄的快照系统与原虚拟机一模一样,所以对于原虚拟机有什么更改,快照也会有相应的更改。
由于自带的管理命令太过强大,但是有点功能其实不太需要,但又缺少了诸如直接重置等一键简单操作,我自己封装了一个脚本,来管理虚拟机,代码如下:
#!/bin/bash create_img() { virsh undefine $1 &>/dev/null qemu-img create -f qcow2 -b /var/lib/libvirt/images/$1.img /var/lib/libvirt/images/$1_shot.qcow2 &>/dev/null virt-install --name $1 --ram 1024 --disk /var/lib/libvirt/images/$1_shot.qcow2 --import --noautoconsole &>/dev/null virsh define /etc/libvirt/qemu/$1.xml &>/dev/null } delete_img() { virsh undefine $1 &>/dev/null rm -rf /var/lib/libvirt/images/$1_shot.qcow2 &>/dev/null } check_status() { status=`virsh list --all| sed -n '3,$p'|sed 's/[[:space:]]\+/:/g'|grep $1 |cut -d':' -f4` echo $status if [ $status = "shut" ];then return 0 elif [ $status = 'running' ];then return 1 fi } case $1 in --start|-s) shift echo "start $1 ..." check_status $1 &>/dev/null && virsh start $1 &>/dev/null ;; --view|-v) shift echo "view $1 ..." check_status $1 &> /dev/null || virt-viewer $1 &>/dev/null & ;; --shutdown|-d) shift echo "shutdown $1 ..." check_status $1 &> /dev/null || virsh destroy $1 &>/dev/null & ;; --create|-c) shift check_status $1 &> /dev/null || virsh destroy $1 echo "create snapshot for $1 ..." create_img $1 echo "success create snapshot" ;; --reset|-r) shift check_status &>/dev/null $1 || virsh destroy $1 delete_img $1 create_img $1 ;; --check|-h) shift echo $1 `check_status $1` ;; *) echo "vmctl" echo "" echo "open,show,shutdown,reset...Virtual Machine" echo -e "--start|-s\topen Virtual Machine\n--view|-v\tshow the Virtual Machine that has been opened" echo -e "--shutdown|-d\tclose your Virtual Machine" echo -e "--create|-c\tcreate a snapshot for your Virtual Machine" echo -e "--reset|-r\treset your Virtual Machine" echo -e "--check|-h\tcheck Virtual Machine status running or shut" ;; esac
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。