KVM虚拟化学习之路(三):内存配置与存储配置

kvm 2017-11-15

内存配置

通过qemu命令启动客户机对内存大小的参数如下:

-m mergs # 设置客户机内存megs MB 大小

默认单位MB,可以支持加上M或者G或者MB或者GB,如果不设置-m参数,默认128MB。

大页(Huge Page)

qemu-kvm提供了 -mem-path FILE 参数用于使用huge page,还有 -mem-prealloc 可以让宿主机在启动客户机时就全部分配好客户机的内存,而不是在客户机实际用到更多内存时才按需分配。-mem-prealloc 必须在有-mem-path 参数时才能使用。提前分配好内存的好处是客户机的内存访问速度更快,缺点是客户机启动时就得到所有的内存,从而让宿主机的内存很快的减少了。

内存过载

在kvm中,内存也是允许过载使用(over-commit)的,kvm能够给客户机的内存总数大于实际可用的物理内存总数。一般来说,有三种方式来实现内存过载使用:

  1. 内存交换(swapping):用交换空间(swpa space)来弥补内存的不足。
  2. 气球(ballooning):通过virtio_balloon驱动来时间宿主机Hypervisor和客户机之间的协作。
  3. 页共享(page sharing): 通过KSM(kernel Samepage Merging)合并多个客户机进程使用相同的内存页。

其中,第一种内存交换方式是最成熟的。

存储配置

qemu提供对多种存储设备的模拟,包括IDE设备,SCSI设备,软盘,U盘,virtio磁盘等,设备的启动顺序也很灵活。主要有如下参数来配置客户机的存储。

基本配置项

  1. -hda file 将file镜像文件作为客户机的第一个IDE设置(序号为0),在客户机中表现为/dev/hda设备,也可以将宿主机中的一个硬盘(如/dev/sdb)作为-hda的file参数来使用,从而让整个硬盘模拟为客户机的第一个IDE设备。

    同理有-hdb -hdc等,在客户机表现为/dev/hdb 或/dev/sdb设备

  2. -fda file 将file作为客户机中的软盘设备(序号0)在客户机表现为/dev/fd0
  3. -cdrom file 将file作为客户机中的光盘CD-ROM,在客户机通常表现为/dev/cdrom设备。也可以将宿主中的光驱/dev/cdrom作为-cdrom的file来使用。注意,-cdrom参数不能喝-hdc参数同时使用个,因为-cdrom就是客户机中的第三个IDE设备。在通过物理光驱中的光盘或磁盘ISO镜像文件安装客户机操作系统时,一般会使用-cdrom参数。

  4. -mtdblock file 使用file文件作为客户机自带的一个Flash存储器
  5. -sd filw 使用file文件作为客户机中的SD卡

详细配置项

qemu-kvm还提供了 -driver 参数来详细定义一个存储驱动器,该参数具体形式如下:

-driver option[,option[,optin,...]]

为客户机定义一个新的驱动器,它有如下的一些选项:

  1. file=file 使用file文件作为镜像文件加载到客户机的驱动器中
  2. if=interface 指定驱动器使用的接口类型,可用的类型有:ide, scsi, sd, mtd, floopy, pflash, virtio,等等。
  3. bus=bus,unit=unit 设置驱动器在客户机中的总线编号和单元标号
  4. index=index 设置在同一种接口的驱动器中的索引编号
  5. media=media 设置驱动器中的媒介的类型,其值为"disk"或"cdrom"
  6. snapshot=snapshot 设置是否启用 -snopshot 选项,其可选值为"on"或"off"。当启用时,qemu不会将磁盘数据的更改写回到镜像文件中,而是写到临时文件中,当然可以在qemu monitor中使员工"commit"会强制将磁盘数据的更改保存为镜像文件中。
  7. cache=cache 设置宿主机对块设备数据(包括文件或一个磁盘)访问中的cache情况,可以设置为"none"(或"off"),"writeback","writethrough"等,默认是"writethrough",即直写模式,它是在调用write写入数据的同时将数据写入磁盘缓存和后端块设备,有限操作简单,缺点是写入数据速度较慢。而"writeback"回写模式,在调用write写入数据时只将数据写入到磁盘缓存中即返回,只有在数据被换出缓存时才将修改的数据写到后端存储中,有点是写入速度快,缺点是一旦更新数据在写入后端前遇到系统断电,数据会无法恢复。"writethrough"和"writeback"都会尽量使用缓存。若设置cache=none关闭缓存的方式,QEMU将再调用open系统调用打开镜像文件时使用"O_DIRECT"的标识,所以其读写数据都是绕过缓存直接从块设备中读写。一些块设备文件(qcow2格式)在writethrough模式下性能表现很差,这时建议使用writeback模式。
  8. aio=aio 选择异步IO的方式,有"threads"和"native"两个值可选,默认值是"threads",即让一个线程池去处理异步IO;而native只适用于cache=none的情况,就是使用linux原生的aio
  9. format=format 指定使用的磁盘格式,在默认情况下QEMU自动检测磁盘格式的
  10. serial=serial 指定分配给设备的序列号
  11. addr=addr 分配给驱动控制器的PCI地址,此选项只有在virtio接口才适用。
  12. id=name 设置该驱动器ID,这个id可以在QEMU monitor中用"info block" 看到。
  13. readonly=on|off 设置该驱动是否只读

配置客户机

设备的启动殊勋可以用如下的参数设定:

-boot [order=drives][,once=drives][,menu=on|off][,splash=splashfile][,splash-time=sp-time]

在QEMU模拟的x86 PC中,用“a”“b”分别代表了第一和第二软驱,用“c”表示第一个硬盘,用“d”表示CD-ROM光驱,用“n”表示从网络启动。其中,默认从硬盘启动,要用光盘启动可以设置-boot order=d。“once”表示设置第一次启动的启动顺序,在系统重启后改设置即失效,如-boot noce=dmenu=on|off 用于设置交互式的启动菜单选项(前提是试用客户机的BIOS支持),默认值off。“splash=splashfile”和“splash-time=sp-time”是在“menu=on”时才有效,将名为spashfile的图片作为logo传递给BIOS来显示,而sp-time是BIOS显示splash图片的时间,单位是毫秒。

存储配置示例

下面三个命令等价启动一个客户机:

# qemu-kvm -m 1024 -smp 2 xxx.img
# qemu-kvm -m 1024 -smp 2 -hda xxx.img
# qemu-kvm -m 1024 -smp 2 -drive file=xxx.img,if=ide,cache=writethrough

本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

赏个馒头吧