QEMU-KVM虚拟化:内存调整控制
以下命令行亲自执行有效,执行环境:
Compiled against library: libvirt 4.5.0
Using library: libvirt 4.5.0
Using API: QEMU 4.5.0
Running hypervisor: QEMU 1.5.3
架构细节可查看:CPU 和内存虚拟化
https://www.cnblogs.com/sammyliu/p/4543597.html
内存虚拟化的映射实现
- A –> 虚拟地址(VA),指GuestOS提供给其应用程序使用的线性地址空间。
- B –> 物理地址(PA),经VMM抽象的,虚拟机看到的伪物理地址
- C –> 机器地址(MA),真是的机器物理地址,即地址总线上出现的地址信号
内存地址的映射关系::
GuestOS:PA = f(VA) #GuestOS维护着一套页表,负责VA到PA的映射
VMM:MA = g(PA) #VMM维护着一套页表,负责PA到MA的映射
通过转换方法实现了从虚拟地址到机器地址的映射。实际运行时,用户程序访问VA1,经过GuestOS的页表转换得到PA1,再由VMM介入并使用VMM的页表将PA1转换为MA1 。
QEMU内存结构
QEMU 利用mmap
系统调用,在Host 进程的虚拟地址空间中申请连续大小的空间,作为 Guest 的物理内存。
QEMU 作为 Host 上的一个进程运行,Guest 的每个 vCPU 都是 QEMU 进程的一个子线程。而 Guest 实际使用的仍是 Host 上的物理内存,因此对于 Guest 而言,在进行内存寻址时需要完成以下地址转换过程:
Guest虚拟内存地址(GVA) | Guest线性地址 | Guest物理地址(GPA) | Guest ------------------ | Host Host虚拟地址(HVA) | Host线性地址 | Host物理地址(HPA)
其中,GVA->GPA
的映射由 Guest OS 维护,HVA->HPA
的映射由 Host OS 维护,因此需要一种机制,来维护GPA->HVA
之间的映射关系。
细节原理非常复杂,只需要理解HOST和Guest分别通过页表进行内存地址转换,把物理地址转换为Guest的“虚拟地址“即可。
在此不再深入,可参看
https://www.binss.me/blog/qemu-note-of-memory/
https://www.cnblogs.com/ck1020/p/6729224.html
https://abelsu7.top/2019/07/07/kvm-memory-virtualization/
https://juniorprincewang.github.io/2018/07/20/qemu%E5%86%85%E5%AD%98%E8%99%9A%E6%8B%9F%E5%8C%96/
https://www.anquanke.com/post/id/86412
内存调整控制
查看虚拟机内存
只有1G
也可以通过host查看
virsh qemu-monitor-command centos7 --hmp --cmd info balloon
修改增加内存
先关机 virsh shutdown centos7 设置最大内存,2G virsh setmaxmem centos7 2097152 开机 virsh start centos7 设置内存 virsh setmem centos7 2097152
查看结果
查看域信息
virsh dominfo centos7
到此,我们已成功实现guest内存增加。
目前维护的开源产品:https://gitee.com/475660