以下命令行親自執行有效,執行環境:
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內存增加。
