Inter-VM Shared Memory - Qemu

2021-08-27 | Tags: #qemu #tubitak #virt

VM'leri birbirleri ile haberleşmesi için genellikle HTTP kullanıyor, hem protokol olarak daha oturmuş olması hem de güvenlikleri açısından daha rahat bir metod. Ancak bu VM'leri biraz daha partition mantığı ile düşündüğümüz zaman paylaşımlı bir bellek alanının daha hızlı sonuçlar alacağını söylebiliriz. Qemu'nun içerisinde bulunan ivshmem paketi sayesinde bu işlemleri gerçekleştirmek mümkün. Aynı zamanda acrn hypervisor'ü de inter-vm iletişimi için bu paketi kullanıyor. Öncelikle

$ sudo apt-get install qemu-utils

paketini yüklememiz gerekiyor. Sonrasında soketi başlatmak için

$ sudo ivshmem-server

diyerek soketi başlatıyoruz. Bu bize /tmp/ivshmem_socket bağlantısını oluşturuyor. Sonrasında qemu'yu başlatalım:

$ sudo qemu-system-x86_64 \
  --cdrom "/home/musa/Documents/Src/iso/ubuntu-14.04.6-desktop-amd64.iso" \
  -enable-kvm \ 
  -m 2G \
  -smp 2 \
  -device ivshmem-plain,memdev=hostmem \ 
  -object memory-backend-file,size=1M,share,mem-path=/dev/shm/ivshmem,id=hostmem \
  "$@" \
;

burada ubuntu başladıktan sonra lspci diyerek bağlanan pci cihazlarını görelim. Aslında ivshmem kendisini bir PCI cihazı olarak vm'e ekliyor.

Bilgi PCI cihazlarının hepsinin bir vendor ve device id'si bulunmaktadır ve bunlar bu cihazlar için özeldir. bu şekilde bu cihazlar birbirleri ile çakışmazlar. kontrol etmek için bu linke bakılabilir.

https://www.pcilookup.com/

       +--------------------------+
       |                          |
+------+---+   +---------+        |
|          |   |         |        |
|   Qemu   |   |   Qemu  +------+ |
|          |   |         |      | |
+----+-----+   +-----+---+      | |
     |               |          | |
+----+---------------+---+   +--+-+--+
|          KVM           |   | Memory|
+------------------------+   +-------+

VM içerisinde artık PCI cihazı aktif bir durumda. PCI cihazına yazmak için standart işlemleri kullanabiliriz. Aynı zamanda bu bellek bölgesini kullanmak için mmap ile de bir yer açmalayız. shared_memory bir struct içerisine istediğimiz değişkenleri atabiliriz.

const std::string con_path = "/sys/devices/pci0000:00/0000:00:04.0/resource2";
int fd = open(con_path.c_str(), O_RDWR);
this->mem_region = (shared_memory *)mmap(0, STORAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

sonrasında bu alandaki değerleri istediğimiz gibi değiştirebiliriz ve bu alan da diğer vm'ler ile paylaşılmış olacaktır.

this->mem_region->text = "Hello World";

This was the end of the blog post. You can reach me via email umusasadik at gmail com