导航:首页 > 程序命令 > kvm常用命令

kvm常用命令

发布时间:2025-07-14 12:56:38

① 测试开发之系统篇-按需创建测试虚拟机

首先,我们来了解一下KVM虚拟机有关的几个概念和工具。

新建KVM虚拟机时,可以指定另一磁盘文件作为 BackingFile 。BackingFile是一个 只读 的虚拟磁盘基础映像,可以在多个虚拟机间进行共享。基于BackingFile创建和运行虚拟机时,只会在自己的磁盘文件中增量地写入文件,从而提高效率、节省磁盘和维护成本。

虚拟机快照 保存了虚拟机在某个指定时间点的状态,当我们在自动化测试过程中遭遇问题或错误时,可以利用快照保存、并恢复到执行中的某个时间点。借助BackingFile机制,虚拟机支持形如以下的多层依赖的快照链。

可使用以下命令,将处于快照链中的某个虚机,导出形成一个独立的磁盘映像文件,其不再依赖其它映像。

假设我们在用户的工作目录中,建立了以下目录。

下面用一个例子,给大家介绍下快速创建测试虚拟机的方法。

(1)按照上一篇文章中的步骤,创建一个Win10虚拟机;

(2)在虚拟机中,安装好工作中用到的测试软件;

(3)使用以下命令,新建一个共享工具磁盘;

(4)挂载共享磁盘到虚拟机,复制工具和文件到该盘中;

(5)移除该虚拟机,确认对话框中,请选择不删除相关磁盘文件;

(6)移动原虚机主磁盘文件到基础镜像目录,如
kvm/base/windows/win10/x64-pro-zh_cn.qcow2。

(7)执行以下命令,以上述基础镜像作为BackingFile,创建新的虚拟机磁盘;

(8)图形界面中,新建测试虚拟机,挂在新建的虚拟机和共享磁盘。

除了使用图形界面的qemu-manager软件,这里也提供一种命令行的方法,大家可用于测试平台的代码中。

(9)导出虚拟机XML配置文件

(10)修改XML配置文件中的以下字段:nameuuidvcpumemory和currentMemorymac address第1块disk的source file

(11)在第1块disk的Elemnt中,加入以下BackingFile有关的内容:

(12)如需要用页面VNC访问虚拟机桌面,找到XML的graphics元素,修改成以下内容。

(13)使用以下命令定义虚拟机。

(14)使用以下命令启动虚拟机。

(15)使用以下命令获取虚拟机的VNC端口编号,在VNC软件中使用”5900+该数字“的端口,访问虚拟机远程桌面。

另外,本人使用GO语言实现了基于libvirt接口的虚拟机管理有关功能,此开源项目旨在为大家提供一个基于KVM虚拟机和Docker容器的、按需测试环境管理平台,详情请参照GitHub上的easysoft/zagent项目。

常用命令:

② KVM虚拟机的常用操作命令整理

1,创建虚拟机

代码如下:
[root@localhost ~]# virt-install --name=centos1 \            #生成一个虚拟机  

--ram 1024 --vcpus=1 \  
--disk path=/root/centos1.img,size=10 \  
--accelerate --cdrom /root/CentOS-6.5-x86_64-bin-DVD1.iso \  
--graphics vnc,port=5921 --network bridge=br0  
2,virsh的其他操作

代码如下:
[root@localhost /]# virsh start centos1       #启动虚拟机

[root@localhost /]# virt-viewer centos1       #如果有图形界面的话,可以进入虚拟机的界面
[root@localhost ~]# virsh shutdown centos1    #关闭虚拟机
[root@localhost /]# virsh reboot centos1      #重启虚拟机
[root@localhost /]# virsh suspend centos1     #暂停虚拟机
[root@localhost /]# virsh resume centos1      #恢复虚拟机
[root@localhost /]# virsh autostart centos1   #自动加载虚拟机  
virsh参数如下:
autostart #自动加载指定的一个虚拟机
connect #重新连接到hypervisor
console #连接到客户会话
create #从一个SML文件创建一个虚拟机
start #开始一个非活跃的虚拟机
destroy #删除一个虚拟机
define #从一个XML文件定义一个虚拟机
domid #把一个虚拟机名或UUID转换为ID
domuuid #把一个郁闷或ID转换为UUID
dominfo #查看虚拟机信息
domstate #查看虚拟机状态
domblkstat #获取虚拟机设备快状态
domifstat #获取虚拟机网络接口状态
mpxml #XML中的虚拟机信息
edit #编辑某个虚拟机的XML文件
list #列出虚拟机
migrate #将虚拟机迁移到另一台主机
quit #退出非交互式终端
reboot #重新启动一个虚拟机
resume #重新恢复一个虚拟机
save #把一个虚拟机的状态保存到一个文件
mp #把一个虚拟机的内核mp到一个文件中以方便分析
shutdown #关闭一个虚拟机
setmem #改变内存的分配
setmaxmem #改变最大内存限制值
suspend #挂起一个虚拟机
vcpuinfo #虚拟机的cpu信息
version #显示virsh版本
3,virt-clone,如果我们要建几个一样的虚拟机,这个命令,非常有用

代码如下:
# virt-clone --connect=qemu:///system -o centos1 -n centos3 -f  /root/centos3.img          #克隆centos1

正在克隆 centos1.img             | 10.0 GB     00:07
Clone 'centos3' created successfully.  
libguestfs-tools是虚拟机一个管理包,很有用的工具
[root@localhost ~]# yum -y install libguestfs-tools   #安装工具包  
4,未登录的情况下,查看镜像目录

代码如下:
[root@localhost ~]# virt-ls centos.img /home   #查看centos.img镜像文件中/home目录  

tank  
5,未登录的情况下,将镜像文件中的文件出来

代码如下:
[root@localhost ~]# virsh list --all       #查看所有的虚拟机名称  

Id    名称 状态  
----------------------------------------------------  
1     centos1running  
2     centos6.5                      running  
-     arch   关闭  
-     arch1  关闭  
-     arch2  关闭  
-     arch3  关闭  
-     arch5  关闭  
-     centos3关闭  
-     ubuntu 关闭  
-     ubuntu1关闭  
[root@localhost ~]# virt--out -d centos1 /etc/passwd /tmp       #将centos1中的文件到tmp下面  
6,查看虚拟机的分区情况

代码如下:
[root@localhost ~]# virt-filesystems -d centos1  

/dev/sda1  
/dev/VolGroup/lv_root
[root@localhost ~]# virt-list-partitions /root/centos.img  
/dev/sda1  
/dev/sda2
[root@localhost ~]# virt-df centos.img  
Filesystem   1K-blocks       Used  Available  Use%  
centos.img:/dev/sda1                    495844      34510     435734    7%  
centos.img:/dev/VolGroup/lv_root       8780808    2842056    5492700   33%  
7,mount虚拟机

代码如下:
[root@localhost ~]# guestmount -a /root/centos.img -m /dev/VolGroup/lv_root --rw /mnt/usb  

[root@localhost ~]# cd /mnt/usb/  
[root@localhost usb]# ls  
bin   dev  home  lib64       media  mnt  opt   root  selinux  sys  usr  
boot  etc  lib   lost+found  misc   net  proc  sbin  srv      tmp  var  
8,修改kvm中虚拟机的内存大小

代码如下:
[root@nfs ~]# virsh edit vm01  ##注意vi直接编辑不生效

vm01
 df8604c1-dcf3-fa98-420f-6eea7b39c395
 1048576 ###本来开始设置为1G,现在这个单位是k
 1048576
修改为1.5G

代码如下:
[root@nfs ~]# expr 1536 \* 1024

1572864/p
p[root@nfs ~]# virsh list
Id Name                 State
----------------------------------
 1 win2003              running
 3 vm01                 running/p
p[root@nfs ~]# virsh  shutdown vm01 ###修改配置文件后需要重新启动下虚拟机,先关闭它
Domain vm01 is being shutdown/p
p[root@nfs ~]# virsh list                      ###确认已经被关闭
Id Name                 State
----------------------------------
 1 win2003              running/p
p[root@nfs ~]# virsh start vm01            ###启动它
Domain vm01 started/p
p[root@nfs ~]# virsh list
Id Name                 State
----------------------------------
 1 win2003              running
 3 vm01                   running
到机器上查看内存大小:

代码如下:
[root@vm01 liuxiaojie]# free -m

    total       used       free     shared    buffers     cached
Mem:          1505        618        886          0         29        361
-/+ buffers/cache:        227       1277
Swap:         2000          0       2000
9,删除一个虚拟机(vm01)

代码如下:
[root@nfs qemu]# virsh undefine  vm01

[root@nfs qemu]# rm -f /home/data/vm01.img
10,删除一个域

代码如下:
[root@nfs web01]# virsh list --all
Id Name State
----------------------------------
1 web01 running ##处于工作状态
- myweb01 shut off
- myweb03 shut off
- mywin2003 shut off
- myxp shut off
- xp shut off

代码如下:
[root@nfs web01]# virsh undefine web01   ##处于工作状态也能删除!
Domain web01 has been undefined

代码如下:
[root@nfs web01]# virsh list
Id Name State
----------------------------------
1 web01 running

代码如下:
[root@nfs web01]# virsh destroy web01
Domain web01 destroyed

代码如下:
[root@nfs web01]# virsh list --all    ##web01已经没有了!
Id Name State
----------------------------------
- myweb01 shut off
- myweb03 shut off
- mywin2003 shut off
- myxp shut off
- xp shut off

代码如下:
[root@nfs web01]# virsh define web01
error: Failed to open file 'web01': No such file or directory

③ kvm和qemu的关系 kvm为什么没有做io虚拟化 半虚拟化和全虚拟化的区别 kvm是否在内

不同的基于KVM的虚拟化平台,可能会采用不同的虚拟化组件,目前主流的采用QEMU-KVM组件,但在不同的产品里版本有所不同,功能也有差异,下面就几个概念进行梳理下


KVM:Kernel-Based Virtual Machine 基于内核的虚拟机,是Linux内核的一个可加载模块,通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的,支持虚拟化功能的硬件支持(比如Intel VT,AMD-V),是一种全虚拟化架构。KVM在2007年年2月被导入Linux 2.6.20内核中。从存在形式来看,它包括两个内核模块:kvm.ko 和 kvm_intel.ko(或kvm_amd.ko),本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(由KVM本身创建)作为管理接口,主要负责vCPU的创建,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行。


QEMU:是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。QEMU有两种工作模式:系统模式,可以模拟出整个电脑系统,另一种是用户模式,可以运行不同与当前硬件平台的其他平台上的程序(比如在x86平台上运行跑在ARM平台上的程序);其代码地址 http://git.qemu.org/qemu.git ,有兴趣的同学可以自己去看看,目前最新的版本是2.7.0,在0.9.1及之前版本还可以使用kqemu加速器(可以理解为QEMU的一个插件,用来提高QEMU的翻译性能,支持Windows平台),但1.0以后版本就只能使用qemu-kvm(只支持Linux)进行加速了,1.3版本后QEMU和QEMU-KVM合二为一了。


QEMU-KVM:从前面对KVM内核模块的介绍知道,它只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。

在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件,QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化

当然,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备,另文再谈

综上所述,QEMU-KVM具有两大作用:

1.提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟

2.对各种虚拟设备的创建,调用进行管理(QEMU负责)


libvirt

顺带提一提libvirt,这是RedHat开始支持KVM后,大概是觉得QEMU+KVM方案中的用户空间虚拟机管理工具不太好用或者通用性不强,所以干脆搞了个libvirt出来,一个针对各种虚拟化平台的虚拟机管理的API库,一些常用的虚拟机管理工具如virsh(类似vim编辑器),virt-install,virt-manager等和云计算框架平台(如OpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt提供的应用程序接口。

libvirt主要由三个部分组成:API库,一个守护进程 libvirtd 和一个默认命令行管理工具 virsh。


总结:

目前来说,QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低),而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU

即使后来RedHat后来开发了libvirt,也只能简单的认为是个虚拟机管理工具,仍然需要通过用户空间QEMU来与KVM进行交互


阅读全文

与kvm常用命令相关的资料

热点内容
java验证码干扰线 浏览:69
云笈七签pdf 浏览:499
powershellpdf 浏览:25
怎么把pdf变成jpg 浏览:341
iphone如何开启gps定位服务器 浏览:797
魔兽世界改服务器怎么进去 浏览:925
为什么连接服务器没有应答 浏览:389
程序员为何被开除 浏览:864
手机论坛网站源码 浏览:589
快递柜锁控板源码 浏览:352
阿里巴巴农业云服务器 浏览:518
android多行注释的快捷键 浏览:866
java环境变量的作用 浏览:526
phpwebsocket扩展 浏览:17
会玩app怎么把猪头弄掉 浏览:93
战地3怎么换服务器地址 浏览:474
qq邮箱app怎么导出通讯录 浏览:704
命令女主身体 浏览:969
java的注释规范 浏览:862
华为mt40e怎么删app 浏览:91