[ kvm ] 学习笔记 5:QEMU-KVM 命令详解

1. QEMU、KVM 、QEMU-KVM

QEMU 提供了一系列的硬件模拟设备(cpu、网卡、磁盘等),客户机指令都需要QEMU翻译,因此性能较差。KVM 是Linux 内核提供的虚拟化模块,负责CPU和内存的虚拟化,但是缺少I/O设备的虚拟化。QEMU-KVM 就是 KVM 与 QEMU 的结合,KVM 负责CPU虚拟化+内存虚拟化,QEMU 模拟其他I/O设备。

2. QEMU-KVM 命令详解

2.1 qemu-kvm 命令基本格式

qemu-kvm 工具命令格式如下:

qemu-kvm [options] [disk_image]

其中,opions 是各种选项、参数,disk_image 是客户机的磁盘镜像文件(默认被挂载为第一个 IDE 磁盘设备)。

2.2 CPU 相关的参数

(1)-cpu 参数

指定CPU模型,默认的 CPU 模型为 qemu64,"-cpu ?" 可以查询当前 qemu-kvm 支持哪些 cpu 模型。

[root@192.168.118.14 ~]#qemu-kvm -cpu ?
x86           qemu64  QEMU Virtual CPU version 1.5.3                  
x86           phenom  AMD Phenom(tm) 9550 Quad-Core Processor         
x86         core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz 
x86            kvm64  Common KVM processor                            
x86           qemu32  QEMU Virtual CPU version 1.5.3                  
x86            kvm32  Common 32-bit KVM processor                     
x86          coreduo  Genuine Intel(R) CPU           T2600  @ 2.16GHz 
x86              486                                                  
x86          pentium                                                  
x86         pentium2                                                  
x86         pentium3                                                  
x86           athlon  QEMU Virtual CPU version 1.5.3                  
x86             n270  Intel(R) Atom(TM) CPU N270   @ 1.60GHz          
x86      cpu64-rhel6  QEMU Virtual CPU version (cpu64-rhel6)          
x86           Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)   
x86           Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)    
x86          Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)       
x86         Westmere  Westmere E56xx/L56xx/X56xx (Nehalem-C)          
x86      SandyBridge  Intel Xeon E312xx (Sandy Bridge)                
x86          Haswell  Intel Core Processor (Haswell)                  
x86        Broadwell  Intel Core Processor (Broadwell)                
x86       Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)           
x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)          
x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)          
x86       Opteron_G4  AMD Opteron 62xx class CPU                      
x86       Opteron_G5  AMD Opteron 63xx class CPU                      
x86             host  KVM processor with all supported host features (only available in KVM mode)

如果想尽可能多的将宿主机的 CPU 特性暴露给客户机使用,则可以使用 "-cpu host" 参数。使用 "-cpu host" 参数会带来动态迁移的限制,不让客户机在不同的cpu硬件上迁移。

(2)-smp 参数

-smp n[,scores=scores][,threads=threads][,sockets=sockets]

 设置客户机总共有 n 个逻辑CPU,并设置了其中 CPU socket 的数量、每个socket 上核心(core)的数量、每个核心上的线程(thread)数量。其中:n = sockets x cores x threads

2.3 内存相关的参数

(1) -m megs 参数

设置客户机内存大小为 megs MB。默认单位:MB,可设置 GB

(2)--mem-path path参数

从path路径表示的临时文件中为客户机分配内存,主要是分配大页内存(如2 MB 大页),如 "--mem-path /dev/hugepages"

(3)--mem-prealloc 参数

启动时即分配全部的内存,而不是根据客户机请求而动态分配,必须与 "--mem-path" 参数一起使用

(4)-balloon 开启内存气球的设置

"-balloon virtio" 为客户机提供 virtio_balloon 设备,从而通过内存气球balloon,可以在 QEMU monitor 中用 "balloon"命令来调节客户机占用内存的大小。

2.4 磁盘相关的参数

Block device options:
-fda/-fdb file  use 'file' as floppy disk 0/1 image
-hda/-hdb file  use 'file' as IDE hard disk 0/1 image
-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image
-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)
-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
       [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
       [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]
       [,serial=s][,addr=A][,id=name][,aio=threads|native]
       [,readonly=on|off][,copy-on-read=on|off]
       [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]][[,iops=i]|[[,iops_rd=r][,iops_wr=w]]
                use 'file' as a drive image
-mtdblock file  use 'file' as on-board Flash memory image
-sd file        use 'file' as SecureDigital card image
-pflash file    use 'file' as a parallel flash image
-snapshot       write to temporary files instead of disk image files
-hdachs c,h,s[,t]
                force hard disk 0 physical geometry and the optional BIOS
                translation (t=none or lba) (usually QEMU can guess them)
-fsdev fsdriver,id=id[,path=path,][security_model={mapped-xattr|mapped-file|passthrough|none}]
[,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd]
-virtfs local,path=path,mount_tag=tag,security_model=[mapped-xattr|mapped-file|passthrough|none]
        [,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd]
-virtfs_synth Create synthetic file system image

(1)-hda、-hdb 和 -cdrom 等参数

  设置客户机的 IDE 磁盘和光盘设备。如 "-hda centos7.img" 将 centos7.img 镜像文件作为客户机的第一个 IDE 磁盘。

(2)-drive 参数

  详细的配置一个驱动。

例如: -drive file=/images/centos7.img,if=virtio,cache=writeback 使用 virtio_blk 驱动 和 磁盘回写机制 来支持该磁盘文件

(3)-boot 参数

-boot [order=drives][,once=drives][,menu=on|off]

设置客户机启动的各种选项(包括启动顺序等),如:在安装客户机操作系统时,使用 "-boot order=dc -hda centos7.img -cdrom centos7.iso",让 centos.img 文件作为IDE磁盘,安装光盘 centos7.iso 作为 IDE 光驱,并且从光盘启动客户机,从而让客户机进入到系统安装的流程中。

2.5 网络相关参数

(1) -net nic 参数

为客户机创建一个网卡,凡是使用 qemu-kvm 模拟的网卡作为客户机网络设备的情况都应该使用该参数,通常该参数与 -net tap 连用。

例如:-net nic model=virtio, macaddr=52:54:00:ac:0f:11 使用 -net nic 命令时,一定要手动指定mac地址,否则客户机的mac地址会与宿主机mac一致。

(2)-net user参数

让客户机使用不需要管理员权限的用户模式网络

例如:-net nic -net user

(3)-net tap参数

使用宿主机的TAP网络接口来帮助客户机建立网络。使用网桥连接和NAT模式网络的客户机都会使用到 "-net tap" 参数。

例如:-net nic -net tap,ifname=vnet0,script=/etc/qeum-ifup,downscript=no  ifname 指定在宿主机空间的网卡名称,script 和 downscript 为配置网络脚本。

2.6 显示相关的参数

(1)vnc参数

默认使用 vnc 方式显示客户机。

例如手动指定:-vnc localhost:2

(2)-nographic参数

让客户机以命令行的方式在当前终端启动显示。

例如:

[root@192.168.118.14 ~]#qemu-kvm -smp 2 -m 512m /images/cirros-0.3.5-i386-disk.img -nographic
...
[系统启动信息]
...

login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root.
<!DOCTYPE login:    # Ctrl+A H 获取帮助信息
C-a h    print this help
C-a x    exit emulator
C-a s    save disk data back to file (if -snapshot)
C-a t    toggle console timestamps
C-a b    send break (magic sysrq)
C-a c    switch between console and monitor
C-a C-a  sends C-a

[00:00:33.833] login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root.
<!DOCTYPE login:    # Ctrl+A C 切换到 qemu-monitor 模式
[00:00:37.237] (qemu)

[00:00:37.237] (qemu)   # Ctrl+A C 切换为命令行模式
[00:01:13.592] login as 'cirros' user. default password: 'cubswin:)'. use 'sudo' for root.
<!DOCTYPE login: 

(3)-daemonize 参数

在启动时让 qemu-kvm 作为守护进程在后台运行。如果没有该参数,默认 qemu-kvm 在启动客户机后就会占用标准输入输出,直到客户机退出。

2.7 其他参数

(1)-name 参数

-name 指定客户机名称可用于宿主机上唯一标识该客户机。

2.8 总结

总结实际场景中经常用到的一些关于 qeum-kvm 的命令组合:

(1)直接通过镜像文件启动客户机方式:

[root@192.168.118.14 ~]#qemu-img -name 'test' -smp 1 -m 512m /images/cirros-0.3.5-i386-disk.img [-daemonize | -nographic]
# -daemonize 守护进程方式启动
# -nographic 占用终端输出输入直接显示
二者选其一。

(2)创建镜像文件并通过 iso 安装 客户机操作系统:

关于 qemu-img 的使用查看:KVM 基础功能详解 倒数第二部分。

[root@192.168.118.14 ~]#qemu-kvm -name "centos7" -smp 2 -m 1024m -drive file=/images/centos_7.qcow2,if=virtio,cache=writeback -cdrom /usr/local/src/CentOS-7-x86_64-Minimal-1511.iso -daemonize
VNC server running on `::1:5900'

上面两种方式都没有应用网络方式,如果需要使用网络服务请参考:

[kvm] 四种简单网络模型