现在的位置: 首页 > 综合 > 正文

qemu-kvm如何mem 热插拔

2017年12月21日 ⁄ 综合 ⁄ 共 4043字 ⁄ 字号 评论关闭

  linux内核已经实现了内存热插的支持,当一个linux系统不管运行在 物理环境 或者虚拟环境  时只要宿主能提供内存热插拔机制,linux内核就能相应的增加或者减少内存。

目前已知的VMware已经可以做到内存热插。

    改变内存容量有两种方式:

  1. 40  1.1 purpose of memory hotplug  
  2. 41  ------------  
  3. 42  Memory Hotplug allows users to increase/decrease the amount of memory.  
  4. 43  Generally, there are two purposes.  
  5. 44    
  6. 45  (A) For changing the amount of memory.  
  7. 46      This is to allow a feature like capacity on demand.  
  8. 47  (B) For installing/removing DIMMs or NUMA-nodes physically.  
  9. 48      This is to exchange DIMMs/NUMA-nodes, reduce power consumption, etc.  
  10.    

        前些天检查maillist时发现已经有人实现了DIMMs 方式更改内存大小。这种方式还没有并入mainline tree。

  1. https://github.com/vliaskov/seabios/commits/memhp-v3-alt  
  2. https://github.com/vliaskov/qemu-kvm/commits/memhp-v3-alt  

 

可以测试下:

1)下载带有 dimm hotplug 功能的qemu-kvm:

  1. git clone -b  memhp-v3-alt https://github.com/vliaskov/qemu-kvm/commits/memhp-v3-alt  

配置编译:

  1. $./configure --target-list="i386-softmmu x86_64-softmmu i386-linux-user x86_64-linux-user" --enable-kvm   
  1. $make  

2)下载linux内核 linux-3.0.1.tar.bz2 做测试:(32bit)

linux memory hotplug 需要内核编译进如下选项:

  1. - For all memory hotplug  
  2.     Memory model -> Sparse Memory  (CONFIG_SPARSEMEM)  
  3. location:  
  4. Processor type and features    
  5.     Memory model (Sparse Memory)  --->  
  1.     Allow for memory hot-add       (CONFIG_MEMORY_HOTPLUG)  
  2. location:  
  3. Power management and ACPI options  
  4.     ACPI (Advanced Configuration and Power Interface) Support  
  5.         Memory Hotplug  
  1. - To enable memory removal, the followings are also necessary  
  2.     Allow for memory hot remove    (CONFIG_MEMORY_HOTREMOVE)  
  3.     Page Migration                 (CONFIG_MIGRATION)  
  1. - For ACPI memory hotplug, the followings are also necessary  
  2.     Memory hotplug (under ACPI Support menu) (CONFIG_ACPI_HOTPLUG_MEMORY)  
  3.     This option can be kernel module.  
  4.   
  5. - As a related configuration, if your box has a feature of NUMA-node hotplug  
  6.   via ACPI, then this option is necessary too.  
  7.     ACPI0004,PNP0A05 and PNP0A06 Container Driver (under ACPI Support menu)  
  8.     (CONFIG_ACPI_CONTAINER).  
  9.     This option can be kernel module too.  

配置好之后就可以用make 了。

编译完成后将得到的bzImage文件拷贝出来。

3)制作启动所需固件:

当内存hotplugged之后,内核需要知道新增加上的内存并且制作内存管理表,生成sysfs文件来操作内存。

由于这需要固件的支持,而现有的qemu mainline 中包含的bios并不支持相应的功能,所以需要下载bios来重新编译:

  1. git clone -b memhp-v3-alt https://github.com/vliaskov/seabios/commits/memhp-v3-alt  

创建一个放固件的目录:bios

里面放的固件如下所示:(这些都是编译后qemu目录下的)

  1. .  
  2. ├── bios.bin  
  3. ├── keymaps  
  4. │   ├── common  
  5. │   ├── en-us  
  6. │   └── modifiers  
  7. ├── kvmvapic.bin  
  8. ├── linuxboot.bin  
  9. ├── multiboot.bin  
  10. ├── optionrom  
  11. │   ├── kvmvapic.bin  
  12. │   ├── linuxboot.bin  
  13. │   └── multiboot.bin  
  14. ├── ppc_rom.bin  
  15. ├── pxe-e1000.rom  
  16. ├── sgabios.bin  
  17. ├── slof.bin  
  18. ├── spapr-rtas.bin  
  19. ├── vgabios.bin  
  20. ├── vgabios-cirrus.bin  
  21. ├── vgabios-qxl.bin  
  22. ├── vgabios-stdvga.bin  
  23. └── vgabios-vmware.bin  

将编译好的固件 ./out/bios.bin  替换上面的  bios.bin。

4)制作文件系统busybox.img

可参考如下连接:

  1. http://blog.csdn.net/gudujianjsk/article/details/7655855  

现在测试用的内核文件都得到了,用如下脚本开启测试:

  1. ./../qemu-kvm/i386-softmmu/qemu-system-i386 -enable-kvm -m 512 -kernel bzImage -L ./../bios -append "root=/dev/sda" -dimm id=dimm0,size=512M,node=0,populated=off -boot c -smp 1  -hda busybox.img -monitor stdio -k en-us -vnc :2  

启动后系统显示如下:

由于编译时配置将 CONFIG_ACPI_HOTPLUG_MEMORY 配置为内核模块了,所以这里需要首先加载一个内核模块:acpi_memhotplug.ko.

所有的sections都在sysfs下有它们的设备信息。每一个section都是在 /sys/devices/system/memory/目录下的内存块的一部分。

  1. /sys/devices/system/memory/memoryXXX  

在这里XXX就是内存ID。

在monitor中动态 增加dimm:

  1. sae@lx15:/var/dbg/test-dimm/busybox$ sudo ./test-box.sh   
  2. QEMU 1.2.50 monitor - type 'help' for more information  
  3. (qemu) device_add dimm,id=dimm0  

此时在虚拟机中可见多了个memory1,其状态是offline:

此时新增加的内存还没有做好使用的准备。为了使用新增加的内存你需要把新增加的内存设置为online 状态

 

 此时用free查看总计的内存数量:

 

测试完毕。

http://www.mjmwired.net/kernel/Documentation/memory-hotplug.txt

【上篇】
【下篇】

抱歉!评论已关闭.