虚拟机Q&A
Q1:虚拟机运行一段时间后,各个版本的第一台虚拟机容量变大,增大容量可以接受
原因:不详
解决方法:用备份镜像替换当前镜像
1.1G Jun 24 17:07 win7_sp1_32_0.qcow2 |
root 1.3G Jul 7 10:48 win7_sp1_32_0.qcow2 |
Q2:Live snapshot revert times increases linearly with snapshot age
现象:The revert times keep increasing linearly with the age of the snapshot, going from tens of seconds to thousands. While the revert takes place the qemu process takes 100% of a core and there is no disk activity.
原因:kvm虚拟机创建的快照时间和当前的linux物理机时间间隔太大,如果linux时间修改回创建快照的时间,则snapshot-revert回复时间基本在5sec以内。 默认的clock选项为<clock offset='localtime'/>,猜测应该是guest会以高频率catchup host的时间,导致CPU占用为100%,且恢复快照时间很慢。
解决方法:
1、实时创建快照,保证创建快照时间和linux当前时间基本相近,同时删除前一快照
注:此方法修改后在虚拟机少于四台时效果较好,基本revert时间控制在5sec以内,如果大于4台kvm虚拟机,则revert时间还是会达到三四十秒,原因是高并发的I/O读写导致恢复时间较慢
time1 = time.time() |
2.更改xml内容
注意:更改xml内容最好是修改好domain.xml后再virsh define domain.xml,如果是已经建立内存快照,然后通过virsh edit domain修改xml,则下次恢复快照依旧不生效。原因是恢复快照会恢复xml文件的内容。
将<clock offset='localtime'/>改成 <clock offset='localtime'> </clock> |
tickpolicy='catchup' 选项可有可无,主要就是让guest不要tarck host的时间,而track guest的时间
reference: https://bugs.launchpad.net/qemu/+bug/1505041
Q:虚拟机镜像变大的问题
需求:虚拟机恢复内存快照后,分析样本结束保持原有大小不变
解决方法:qemu-system-x86_64命令启动虚拟机时,带上-snapshot参数
-snapshot
Write to temporary files instead of disk image files. In this case, the raw disk image you use is not written back.
You can however force the write back by pressing C-a s.
版本信息:
root@polyhawk-50:/polydata/mnt/vmous# kvm --version
QEMU emulator version 2.0.0 (Debian 2.0.0+dfsg-2ubuntu1.15), Copyright (c) 2003-2008 Fabrice Bellardroot@polyhawk-50:/polydata/mnt/vmous# virsh version
Compiled against library: libvirt 1.2.2Using library: libvirt 1.2.2
Using API: QEMU 1.2.2
Running hypervisor: QEMU 2.0.0
root@polyhawk-50:/polydata/mnt/vmous# cat /etc/issue
Ubuntu 14.04.3 LTS \n \lroot@polyhawk-50:/polydata/mnt/vmous# uname -a
Linux polyhawk-50 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
搜索出来主要有两类办法:一是修改xml文件,二是修改模拟器启动脚本
一:修改domain.xml
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
……
<qemu:commandline>
<qemu:arg value='-snapshot'/>
</qemu:commandline>
</domain>
注:虚拟机中可以加入如下信息来优化虚拟机性能以及方便在不同的CPU架构之间进行虚拟机迁移
<qemu:commandline> Instead of using "host", you can also choose a number of other CPU models from the list displayed with the "qemu-system-i386 -cpu help" command (SandyBridge, Haswell, etc). |
二:修改kvm脚本
查看domain.xml发现<emulator>/usr/bin/kvm-spice</emulator>,
root@polyhawk-50:/usr/bin# ls -l /usr/bin/kvm-spice
lrwxrwxrwx 1 root root 3 Jul 28 04:27 /usr/bin/kvm-spice –> kvm
root@polyhawk-50:/usr/bin# cat /usr/bin/kvm
#! /bin/sh
exec qemu-system-x86_64 -enable-kvm "$@"
直接修改kvm文件,最后加上-snapshot
此两种方法其实原理是相同的,但在上述环境中报出error
root@polyhawk-50:/polydata/mnt/vmous# virsh start winxp_sp2_test2
error: Failed to start domain winxp_sp2_test2
error: internal error: process exited while connecting to monitor: qemu-system-x86_64: -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1: Device needs media, but drive is empty
qemu-system-x86_64: -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1: Device initialization failed.
qemu-system-x86_64: -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1: Device 'ide-hd' could not be initialized
未解决,貌似是libvirt不支持,
最后还有一种解决方法,在domain.xml文件里加上<transient/>
<transient>- Indicates that changes to the device contents should be reverted automatically when
the guest virtual machine virtual machine exits. With some hypervisors, marking a disk transient
prevents the domain from participating in migration or snapshots.
sample:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback'/>
<source file='/polydata/mnt/vmous/winxp_sp2_test2.qcow2'/>
<target dev='hda' bus='ide'/>
<transient/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
同样是libvirt不支持,无奈……
reference:
http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=19212&page=1&authorid=18819
http://serverfault.com/questions/111794/libvirt-and-qemu-kvm-snapshot-option
https://bugzilla.redhat.com/show_bug.cgi?id=832194
https://bugs.launchpad.net/qemu/+bug/1192780
https://libvirt.org/drvqemu.html
续:
加-snapshot参数报Device needs media, but drive is empty 错误是因为ubuntu的appamor阻挡了libvirt的一些行为,
为了确保Libvirt始终有必须的权限,必须禁用apparmor。方法如下:
1. 在编译libvirt的时候选择--without-apparmor 选项;
2. 执行下面的命令为libvirt禁用 apparmor:
$ ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
$ln -s /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper /etc/apparmor.d/disable/
$ apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd
$ apparmor_parser -R /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper
然后重启机器。
之后在xml文件中加入-snapshot选项即可,virsh destroy domain后暂存数据自动删除,但reboot数据却依然保留
冲突:xml文件中带入-snapshot参数导致建立虚拟机快照镜像大小(后备镜像方式)不增加,仍为193K,矛盾就是快照恢复失败,会boot启动,而不会瞬间恢复快照。即使已经建立不带-snapshot的快照,virsh snapshot-edit 修改快照信息增加-snapshot后,快照仍无法正常恢复,而是正常启动
Q3:新建虚拟机
环境:安装相应的库,apt-get install qemu-kvm libvirt-bin virtinst 1.创建img,格式为qcow2(支持压缩) qemu-img create -f qcow2 /polydata/data/image/winxp_sp3_test.qcow2 8G 查看创建的img qemu-img info /polydata/data/image/winxp_sp3_test.qcow2 2.光盘启动系统 virt-install --virt-type kvm --name winxp_sp3_test --ram 512 --os-type=windows --os-variant=winxp --disk path=/polydata/data/image/winxp_sp3_test.qcow2,format=qcow2,size=8,cache=none --cdrom=/polydata/polydev/iso/xp/zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole virt-install #man virt-install查看更多参数和用法 参数说明 --name winxp_sp3_test #虚拟机domain名称,domain是一个虚拟机的唯一标识 --ram 512 #内存512M --virt-type kvm #hypervisor类型, kvm ,qemu, xen, kqemu --hvm #full virtualization --os-type=windows #操作系统类型 windows, linux --os-variant=winxp #virt-install --os-variant list查看更多 --disk path=/polydata/data/image/winxp_sp3_test.qcow2,format=qcow2,size=8,cache=none --cdrom=/polydata/polydev/iso/xp/zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso #启动光盘 --network bridge=br0 #桥接模式,网卡br0 桥接到tap0 --graphics vnc,listen=0.0.0.0 #因为是在服务器上安装,没有GUI,所以VNC远程桌面安装 --noautoconsole #不自动加载console 3. 远程连接桌面 查看VNC端口,然后用VNC客户端连接,注意端口保持一致 virsh vncdisplay winxp_sp3_test 4.安装系统 安装完成后打开服务,services.msc,找到windows defender和windows firewall,设置为disable并且关闭服务,关闭windows update,win7的ie打开设置下,安装python2.7.9,复制agent.pyw到客户机的startup文件夹,关闭自动播放,设置用户权限为Never Notify。 5.创建快照 snapshot-create winxp_sp3_test 多个快照共用一个backupfile创建qcow2文件的时候,指定backing_file选项 qemu-img create -f qcow2 -o backing_file=winxp_sp3_backup.qcow2 winxp_sp3_0.qcow2 |
Q4:虚拟机迁移
假设要迁移winxp_sp3_test到另一台机器,按一下步骤执行(务必在虚拟机running状态下操作) 1. 导出winxp_sp3_test的虚拟机及快照配置 virsh dumpxml --migratable winxp_sp3_test > winxp_sp3_test.xml virsh snapshot-current winxp_sp3_test > winxp_sp3_test_snapshot.xml 2. 把winxp_sp3_test.qcow2和步骤1中导出的xml文件都复制到目标机器上,并检查文件的uuid,mac是否重复,按需修改,如果修改IP,需要在目标机器上重新创建快照 3. 在目标机器上导入配置 定义domain virsh define winxp_sp3_test.xml 定义快照 virsh snapshot-create winxp_sp3_test winxp_sp3_test_snapshot.xml --redefine –current 在目标机器上执行snapshot-info winxp_sp3_test --current检查是否成功 |
Q:安装虚拟机时磁盘空间不足,只有1M![]() 创建镜像命令:qemu-img create -f qcow2 /polydata/image/winxp_sp2_backup1.qcow2 10G 安装命令:virt-install --virt-type kvm --name winxp_sp2_backup1 --ram 512 --os-type=windows --os-variant=winxp --disk path=/polydata/image/winxp_sp2_backup1.qcow2,cache=writeback --network bridge=br0 --cdrom=/tmp/WinLite.iso --graphics vnc,listen=0.0.0.0 --noautoconsole 原因是安装虚拟机的命令行中没有指定磁盘格式,改为如下命令即可 virt-install --virt-type kvm --name winxp_sp2_backup1 --ram 512 --os-type=windows --os-variant=winxp --disk path=/polydata/image/winxp_sp2_backup1.qcow2,format=qcow2,cache=writeback --network bridge=br0 --cdrom=/tmp/WinLite.iso --graphics vnc,listen=0.0.0.0 --noautoconsole |
Q:删除虚拟机内部的文件,镜像在宿主机上的磁盘空间能否缩小? 但是image还是占用很大的空间。如何是image磁盘占用小一些? 答:使用virt-sparsify命令能压缩掉一些虚拟机文件系统的空洞,但是虚拟机系统 和宿主机系统是两回事情。如果是精简模式,比如qcow2,使用的时候是用多少占多少。 另外介绍一个比较巧妙的办法: 1 使用dd命令将虚拟机未使用的空间用0填满: dd id=/dev/zero of=/data 然后 rm /data 关闭虚拟机 2 使用qemu-img转换镜像文件 qemu-img convert -O qcow2 vm.qcow2 vm.new.qcow2 |
Q:使用qemu-system-x86_64启动虚拟机时报Could not initialize SDL(No available video device) - exiting 未指定vga参数, -vga [std|cirrus|vmware|qxl|xenfb|tcx|cg3|none] qemu-system-x86_64 winxp_sp3_test.qcow2 –vga std -vnc 0.0.0.0:0 Q:多块磁盘启动 加上-hda/-hdb参数,另外可以指定cpu,mem等参数 qemu-system-x86_64 -hda Base_OS_From_25.86-disk1.img -hdb Base_OS_From_25.86-disk2.img -vga std -vnc 0.0.0.0:0 -m 32768 -smp cpus=12 -cpu host |
Q: tcp远程连接libvirt
TCP方式: 例如:qemu+tcp://172.16.0.15/system,服务端只需要做简单配置即可: vim /etc/libvirt/libvirtd.conf: listen_tls = 0 #禁用tls登录 listen_tcp = 1 #启用tcp方式登录 tcp_port = "16509" #tcp端口16509 listen_addr = "0.0.0.0" auth_tcp = "none" #TCP不使用认证 max_clients = 1024 #最大总的连接客户数1024 min_workers = 50 #libvirtd启动时,初始的工作线程数目 max_workers = 512 #同上,最大数目 max_requests = 1000 #最大同时支持的RPC调用,必须大于等于max_workers max_client_requests = 1000 #每个客户端支持的最大连接数 vim /etc/default/libvirt-bin: # Start libvirtd to handle qemu/kvm: start_libvirtd="yes" # options passed to libvirtd, add "-l" to listen on tcp # 默认加载/etc/libvirt/libvirtd.conf,如果需要替换则加上 --config [conf_path] libvirtd_opts="-d -l" |
虚拟机Q&A的更多相关文章
- OpenShare常见问题及解答
OpenShare常见问题及回答: Q:OpenShare可以整合SAP么? A:当然可以,OpenShare是真正完全开放的产品,但要进行二次开发,事实上我们帮我们大部分的客户都整合了SAP,包括数 ...
- Linux-I/O重定向和管道
Linux I/O重定向 标准输入(stdin):文件描述符0 标准输入(stdout):文件描述符1 标准错误(stderr):文件描述符2 file descriptors(FD,文件描述符 或 ...
- linux文件管理之管道与重定向
============================================================== 内容提要: 输入输出重定向.管道: 重定向的作用: 文件描述符 0 1 2 ...
- Linux基础管道管理
一.I/O重定向 标准输入,标准输出,标准错误 file descriptors (FD, 文件描述符或Process I/O channels); 进程使用文件描述符来管理打开的文件 [root@l ...
- Day 13 linux 的输入输出与管道的使用
1.重定向概述 1.什么是重定向 将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中.比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中.这样第二天通过查看文件的内容就知道昨天备份 ...
- 管道及 I/O 重定向
I/O重定向 I/O Redirection 标准输入.标准输出.标准错误输出重定向及综合案例输入重定向及结合案例 标准输入.标准输出.标准错误 file descriptors (FD,文件描述符 ...
- OpenStack常见面试题
现在,大多数公司都试图将它们的 IT 基础设施和电信设施迁移到私有云, 如 OpenStack.如果你打算面试 OpenStack 管理员这个岗位,那么下面列出的这些面试问题可能会帮助你通过面试. Q ...
- IGS_学习笔记03_Integrated SOA Gateway设定配置(案例)
20150506 Created By BaoXinjian
- openstack Q版部署-----虚拟机创建(8)
一 .创建网络环境 环境变量生效一下 创建一个网络: openstack network create --share --external \ --provider-physical-network ...
随机推荐
- VS2012下基于Glut 矩阵变换示例程序:
也可以使用我们自己的矩阵运算来实现OpenGL下的glTranslatef相应的旋转变换.需要注意的是OpenGL下的矩阵是列优先存储的. 示例通过矩阵运算使得圆柱或者甜圈自动绕Y轴旋转,可以单击鼠标 ...
- SAP CRM 为用户创建业务合作伙伴并分配到组织单位
想要在SAP CRM的前台完成一些操作,需要登录的用户在系统中存在对应的业务合作伙伴才可以,某些情况下,还需要被分配到正确的公司.部门.职位.下面是相关的操作步骤. 本文假定读者已经拥有一个开发帐号. ...
- luogu P2580 于是他错误的点名开始了
luogu P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...
- 为什么用Object.prototype.toString.call(obj)检测对象类型?
最近做了做一些js面试25 Essential JavaScript Interview Questions*,其中第一道是:使用typeof bar === "object"检测 ...
- JavaScript进阶(三)
现在来说说判断语句(if)if语句是基于条件成立才执行相应代码时使用的语句.语法:if(条件){条件成立时执行代码}注意:if小写,大写字母(IF)会出错!假设你应聘web前端技术开发岗位,如果你会h ...
- webservice(二)
---摘自网络,感谢提供者 WsExplorer和Tcp/Ip Monitor工具本身就存在于eclipse和MyEclipse中 使用工具的原因: 1. 使用工具可以更好的了解WebService ...
- mysql的注释
一直没怎么用过mysql数据库, 今天用mysqldump备份了一下表结构, 记录一下遇到的问题 1. mysqldump默认导出没有事务和存储过程, 如果想导出这些可以用 -E 和 -R[--rou ...
- POJ 1118 Lining Up
枚举,排序. 先将所有点按双关键字排序,然后枚举线的顶点$P$,剩余的点以$P$为中心进行极角排序,可以取个$gcd$,这样一样的点就排在一起了,然后统计一下更新答案. #pragma comment ...
- Jedis实现发布订阅功能
Redis为我们提供了publish/subscribe(发布/订阅)功能.我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时 ...
- line-height属性详解
line-height属性详解:http://www.cnblogs.com/dolphinX/p/3236686.html