虚拟机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 ...
随机推荐
- 用indexOf获取字符窜某个字符的所有位置
indexOf方法可以传两个参数,第二个参数是传位置的参数,利用这点获取所有的位置.例如: var str = "hello world,welcome!"; var arr = ...
- 关于EL表达式的生效时间(猜想)
通过ajax与服务端异步交互的时候,在服务端将某些变量或对象设置到request等域里,此时页面上的EL表达式是获取不到ajax异步交互时设置在request等域里的变量或对像的. 我猜测可能EL表达 ...
- .Net程序员学用Oracle系列(4):四个基本概念
<.Net程序员学用Oracle系列:导航目录> 本文大纲 1.概念说明 1.1.表空间 1.2.SCHEMA 1.3.用户 1.4.权限 2.表空间管理 2.1.创建表空间 2.2.监控 ...
- [ios] 微信订阅号: ios博文精选
晚上下班后时间充裕,平时要么看电视剧,要么玩游戏 感觉浪费时间. 最后决定自己也搞一个微信订阅号分享技术方面的东西,也提升自己. 如果大家也是一样情况,欢迎大家关注我的订阅号. 微信订阅号: ios ...
- ABAP 通过sumbit调用另外一个程序使用job形式执行-简单例子
涉及到两个程序: ZTEST_ZUMA02 (主程序) ZTEST_ZUMA(被调用的程序,需要以后台job执行) "ztest_zuma 的代码 DATA col TYPE i VALUE ...
- SELinux开启和关闭
1.查看SELinux状态 /usr/sbin/sestatus -v 2.关闭SELinux (1)临时关闭(不用重启机器): setenforce 0 #设置SELinux成为permissive ...
- netty入门篇(1)
上一篇 nio简介 下一篇 netty中级篇(2) 一.为什么选择Netty Netty是最流行的框架之一.健壮性.功能.性能.可定制性和可扩展性在同类框架中首屈一指,因此被大规模使用,例如ROCK ...
- java 文件下载支持中文名称
/** * 文件下载 * @param filePath 文件路径 * @param fileName 文件名称 */ public void download(String filePath,Str ...
- Uva 10780 Again Prime? No Time.(分解质因子)
题意:给你两个数m和n,问 n! 可以被 m^k 整除的k的最大值 思路:从这道我们可以想到n!末尾有多少个0的问题,让我们先想一下它的思想,我们找 n! 末尾有多少0, 实际上我们是在找n!中5的个 ...
- ngDialog 设置其宽度大小
[ngdialog弹窗大小设置(angularjs)] 方法一:添加css样式属性 css: .ngdialog.ngdialog-theme-plain.custom-width-70 .ngdia ...