是否可以实现kvm/qemu VM guest和host通过共享内存连接来收集和缓存它们之间的数据

是否可以实现kvm/qemu VM guest和host通过共享内存连接来收集和缓存它们之间的数据

配置:

  • 主机:Ubuntu:20.04 操作系统
  • 来宾:Ubuntu20.04操作系统
  • 这两个文件使用9p文件系统进行互通。

挂载命令如下,

mount -t 9p -o trans=virtio tmp_shared /mnt -oversion=9p2000.l

目前进展如下:

  • C语言中的函数mmap用于通过9p文件系统映射同一个文件的内存。
  • 目前,Host可以写入文件的内存,但Guest无法实时读取变化。
  • Host端:(write.c这段代码是修改文件内存)
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #define _GBU_SOURCE
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define FILE_PATH "/tmp/shared/test.txt" //file path
    
    int main()
    {
        int fd;
        struct stat fa;
        char *mapped;
    
        // open
        if ((fd = open(FILE_PATH, O_CREAT | O_RDWR)) < 0){
            perror("open");
            exit(1);
        }
    
        // attr
        if ((fstat(fd, &fa)) == -1){
            perror("fstat");
            exit(1);
        }
    
        // map
        if ((mapped = (char *)mmap(NULL, fa.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, 0)) == (void *)-1){
            perror("mmap");
            exit(1);
        }
    
        // close
        close(fd);
    
        printf("before :\n%s\n", mapped);
    
        mapped[3] = 'P';
    
        printf("\nafter:\n%s\n", mapped);
    
    
        if (munmap(mapped, fa.st_size) == -1)
        {
            perror("munmap");
            exit(1);
        }
    
        return 0;
    }
    
    
  • Guest端:(read.c这段代码是为了继续读取文件)
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <error.h>
    
    #define FILE_PATH "/mnt/test.txt" // file path
    
    int main()
    {
        int fd;
        struct stat fa;
        char *mapped;
    
        // open
        if ((fd = open(FILE_PATH, O_RDWR)) < 0)
        {
            perror("open");
            exit(1);
        }
    
        // attr
        if ((fstat(fd, &fa)) == -1)
        {
            perror("fstat");
            exit(1);
        }
    
        // map
        if ((mapped = (char *)mmap(NULL, fa.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void *)-1)
        {
            perror("mmap");
            exit(1);
        }
    
        // close
        close(fd);
    
        // read
        while (1)
        {
            printf("%s\n", mapped);
            sleep(2);
        }
    
        return 0;
    }
    

相关内容