如果需要构建KVM环境,首先需要硬件支持。
首先处理器(CPU)要在硬件上支持VT技术,还要在BIOS中将其功能打开,KVM才能使用到。目前,多数流行的服务器和部分桌面处理器的BIOS都默认将VT打开了。
在BIOS中,VT的选项通过“Advanced→Processor Configuration”来查看和设置,它的标识通常为“Intel®Virtualization Technology”或“Intel VT”等类似的文字说明。
设置好了VT和VT-d的相关选项,保存BIOS的设置并退出,系统重启后生效。在Linux系统中,可以通过检查/proc/cpuinfo文件中的CPU特性标志(flags)来查看CPU目前是否支持硬件虚拟化。在x86和x86-64平台中,Intel系列CPU支持虚拟化的标志为“vmx”,AMD系列CPU的标志为“svm”。所以可以用以下命令行查看“vmx”或者“svm”标志:
[marvin@localhost ~]$ grep -E "svm|vmx" /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm 3dnowprefetch cpuid_fault cat_l2 pti cdp_l2 ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust smep erms mpx rdt_a rdseed smap clflushopt intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts umip rdpid md_clear arch_capabilities
KVM作为Linux kernel中的一个module而存在,是从Linux 2.6.20版本开始被完全正式加入内核的主干开发和正式发布代码中。所以,只需要下载2.6.20版本,Linux kernel代码即可编译和使用KVM。
总的来说,下载最新KVM源代码,主要有以下3种方式: 1)下载KVM项目开发中的代码仓库kvm.git。 2)下载Linux内核的代码仓库linux.git。 3)打包下载Linux内核的源代码(Tarball 格式)。
首先查看系统是否加载了kvm模块
使用命令:lsmod | grep kvm
[marvin@localhost ~]$ lsmod | grep kvm kvm_intel 299008 0 kvm 753664 1 kvm_intel irqbypass 16384 1 kvm
如果没有安装KVM模块,需要安装,具体安装过程可google/百度1。
(免费订阅,永久学习)学习地址:
LinuxC/C++服务器开发/架构师 面试题、学习资料、教学视频和学习路线图(资料包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis、MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等),或点击这里加qun免费领取,关注我持续更新哦! !
安装qemu有两种方式,一种为源码安装,一种直接apt/yum/dnf安装。
源码安装
参考官方步骤:Download QEMU - QEMU
下载QEMU源码
解压
configure
# 加入KVM ./configure --prefix=XXX --enable-debug --target-list=x86_64-softmmu --enable-kvm # --prefix 选项设置qemu的安装位置,之后若要卸载删除qemu只要删除该文件夹即可 # config完,可以在指定的qemu安装文件夹下面找到config-host.mak文件, # 该文件记录着qemu配置的选项,可以和自己设置的进行对比,确保配置和自己已知
make和安装
make时如果缺少相关的库或者软件,make会退出并提示缺少的东西,按照提示安装即可。
安装工具安装
sudo yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python python-virtinst libvirt-client virt-install virt-viewer
qemu-kvm:qemu模拟器
qemu-img:qemu磁盘image管理器
virt-install:用来创建虚拟机的命令行工具
libvirt:提供libvirtd daemon来管理虚拟机和控制hypervisor
libvirt-client:提供客户端API用来访问server和提供管理虚拟机命令行工具的virsh实体
virt-viewer:图形控制台
其中最重要的是qemu-kvm、qemu-img,同时为了方便管理虚拟机,最好安装上libvirt2。
安装完qemu后,在/usr/bin/目录下会有qemu开头的若干可执行程序, 类似qemu-x86_64这种命令是运行某种架构的程序的,qemu-system-x86_64是运行某种架构系统的(虚拟机),如果需要kvm支持,需要加上参数 -enable-kvm, 如果使用libvirt可以配置相应的xml来实现kvm支持。
创建镜像
[marvin@localhost Worksapce]$ qemu-img create -f qcow2 XXX.qcow2 10G
创建虚拟机
qemu-system-x86_64 -enable-kvm -name "XXX" -m 1024 -smp 2 -boot d -drive file=XXX.qcow2,if=virtio,index=0,media=disk,format=qcow2 -drive file=YYY.iso,index=1,media=cdrom
创建之后通过vnc连接到安装界面,之后便可进行安装
启动虚拟机
# 未开启kvm支持,使用标准输入作为 QEMU monitor 命令源 ./qemu-system-x86_64 -m 1024 -hda XXX.qcow2 -usb -usbdevice tablet -vnc :51 -monitor stdio # 开启kvm支持,使用标准输入作为 QEMU monitor 命令源 ./qemu-system-x86_64 --enable-kvm -m 1024 -hda XXX.qcow2 -usb -usbdevice tablet -vnc :51 -monitor stdio # gdb调试 gdb --args ./qemu-system-x86_64 -m 1024 -hda XXX.qcow2 -usb -usbdevice tablet -vnc :51
qemu的标准选项
# qemu的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。 -name name # 虚拟机名称 -M machine # 指定要模拟的主机类型,如standard PC,ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型 -m megs # 设定虚拟机的RAM大小 -cpu model # 设定CPU模型,如coreduo、qemu64等,可以使用"qemu-kvm -cpu ?"获取所支持的所有模型 -smp n # 设定模拟的SMP架构中CPU的个数 [,cores=cores] # 每个CPU的核心数 [,threads=threads] # 线程数 [,sockets=sockets] # CPU的socket数目 [,maxcpus=maxcpus] # 用于指定热插入的CPU个数上限 -numa 非一致内存访问 -numa opts:指定模拟多节点的numa设备 -fda file: -fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱 -hda file: -hdb file: -hdc file: -hdd file:使用指定file作为硬盘镜像 -cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用:将file指定为/dev/cdrom可以直接使用物理光驱 -drive # 定义一个硬盘设备:可用子选项有很多 file=/path/to/somefile # 硬盘映像文件 if=interface # 硬盘设备接口类型 ide、scsi、sd、virtio(半虚拟化) index=index # 设定同一种控制器类型中不同设备的索引号,即标识号 media=media # 定义介质类型为硬盘还是光盘disk、cdrom snapshot=snapshot # 指定当前硬盘设备是否支持快照功能:on或off cache=cache # 定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个 format=format # 指定映像文件的格式,具体格式可参见qemu-img命令 -boot [order=drives][,once=drives][,menu=on|off] # 定义启动设备的引导次序,每种设备使用一个字符表示:不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱,c表示第一个光驱设备,n-p表示网络适配器,默认为硬盘设备。例如:-boot order=dc,once=d
示例 qemu-system-x86_64 --name censtos -smp 2 -m 2048 -cpu host -drive file=/data/iso/CentOS-7-x86_64-Minimal-1804.iso,media=cdrom -drive file=centos.qcow2,media=disk -boot order=dc,once=d
qemu显示选项
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
SDL
-sdl # 启用SDL
VNC
-vnc display [option,option] # 默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在vnc上,并将VGA输出重定向至vnc会话,使用此选项时,必须使用-k选项指定键盘布局类型;其中有许多子选项,具体请参考qemu的手册
display
1、host:N # N为控制台号
192.168.1.1:1 # 5900为起始端口
2、unix:/path/to/socket_file # 监听在套接字
3、none # 不显示
option
password # 连接时需要验证密码,设定密码通过monitor接口使用change
reverse # “反向”连接至某处于监听状态的vncview上
-vga type # 指定要仿真的VGA接口类型,常见的类型有:
cirrus: Cirrus Logic GD5446显示卡
std:带有Bochs VBI扩展的标准VGA显示卡
vmware:VMware SVGA-II兼容的显示适配器
qxl:QXL半虚拟化显示卡:与VGA兼容,在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型
none:禁用VGA卡
-monitor stdio # 在标准输入输出上显示monitor界面
-nographic # 默认情况下,qemu使用SDL来显示VGA输出,而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台
-curses # 禁止图形接口,并使用curses/ncurses作为交互接口
-alt-grab # 使用Ctrl+Alt+Shift组合键释放鼠标
-ctrl-grab # 使用右Ctrl键释放鼠标
-spice option[,option[,...]] # 启用spice远程桌面协议:其中有许多子选项,具体请参照qemu-kvm手册。
网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其他类型请参考qemu手册9。
nic #定义网络接口
-net nic [,vlan=n,macaddr=n,model=type,name=name,addr=addr,vectors=v] # 创建一个新的网卡设备并连接至vlan n中:PC架构上默认的NIC为e1000,macaddr用于为其制定mac地址,name用于指定一个在监控时显示的网上设备名称;qemu可以模拟多个类型的网卡设备,如virtio、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表中的一部分,可以使用qemu-system-x86_64 -net nic,model=?来获取当前平台支持的类型。
vlan # vlan号
macaddr # mac地址(mac 默认不变)
model # e1000 virtio
name # 设备名
addr # ip地址
tap #nic管理虚拟机中的接口,tap就是管理宿主机上的对应接口
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] # 通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤销接口配置;使用script=no和downscript=no可分别用来禁止执行脚本。
user
-net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有:
vlan=n # 连接至vlan n,默认n=0
name=name # 指定接口的显示名称,常用于监控模式中
net=addr[/mask] # 设定GuestOS中可见的IP网络,掩码可选,默认为10.0.2.0/8
host=addr # 指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2
dhcpstart=addr # 指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31
dns=addr # 指定GuestOS可见的dns服务器地址,默认为GuestOS网络中的第3个地址,即x.x.x.3
tftp=dir # 激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录
bootfile=file # BOOTP文件名称,用于实现网络引导GuestOS,如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pexlinux.0
kvm的网络模型
1、隔离模型 使用bridge连接各个虚拟机但不关联物理网卡 2、nat模型 在路由模型上添加nat规则 iptables 3、路由模型 在隔离模型的基础之上添加一个虚拟网卡,开启路由转发功能。 需要虚拟机指定虚拟网卡的ip为网关 需要在要通信的主机或路由添加回复报文的路由条目 4、桥接模型 在隔离模型的bridge上添加物理网卡 将物理网卡变为bridge,将原来的IP放到一张虚拟网卡并添加到桥上 dhcp 服务器 namespace 名称空间
手动创建bridge
yum install bridge-utils #安装工具包 rpm -ql bridge-utils #查看utils释放的文件 brctl -h #查看帮助 brctl addbr br0 #添加网桥 ifconfig -a #查看全部接口 brctl stp br0 off #关闭生成树 ip link set br0 up #启动br0设备 ip addr del 192.168.1.50/24 dev ens33 #拆除物理网卡ip ip addr add 192.168.1.50/24 dev br0 #添加ip ip a #ip是否添加成功 ping 192.168.1.50 #检查ip可用 ip link set dev ens33 master br0 #物理网卡加入桥接设备 brctl show #查看是否加入桥
i386平台专用选项
-no-acpi # 禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项 -ballcon none # 禁用balloon设备 -balloon virtio[,addr=addr] # 启用virtio balloon设备
查看创建qcow2格式的磁盘支持的选项
Difference between qemu-kvm, qemu-system-x86_64, qemu-x86_64 ↩︎
[Re: Qemu-discuss] Difference between qemu-kvm, qemu-system-x86_64, qemu ↩︎
原文链接: https://www.cnblogs.co
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po