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";