在虚拟机中访问host文件的过程

本文探讨了在虚拟机中通过QEMU和KVM进行文件访问的过程,涉及virtio-9p协议、libaio库以及非根模式与根模式的切换。在启用加密功能的VM中,由于内存加密,DMA操作需要通过swiotlb进行解密和映射,影响了读写流程。此外,详细介绍了AIO在用户程序、内核和QEMU间的交互,以及aio_commit系统调用的处理过程。
摘要由CSDN通过智能技术生成

基本配置信息:

虚拟机是由qemu启动,qemu使用kernel kvm启动虚拟机,VM是普通的linux系统。

qemu通过virtio-9p在host和guest之间共享文件

qemu 参数:
-fsdev local,id=exp1,path=/tmp/,security_model=none
-device virtio-9p-pci,fsdev=exp1,mount_tag=v_tmp

On the client it can be mounted with:
$ mount -t 9p -o trans=virtio v_tmp /mnt

在VM中通过linux aio访问文件,用户程序使用libaio,如下

const char* content1 = "hello world!";

int main(void)
{
    int               output_fd;
    struct iocb       io, *p=&io;
    io_context_t      ctx;
    const char        content[]="hello world again!";
	
    char *content2 = malloc(SIZE_TEST);
    snprintf(content2, sizeof(content2), "%s", "hello again\n");

    memset(&ctx, 0, sizeof(ctx));
    io_setup(10, &ctx);
    
   output_fd=open("foobar.txt", O_CREAT|O_WRONLY, 0644))
#if LOG_TO_FILE
    io_prep_pwrite(&io, output_fd, (void*)content, strlen(content), 0);
    //io.data = content;
#endif
    io_submit(ctx, 1, &p)

    // 4. wait IO finish.
    io_getevents(ctx, 0, 1, &e, &timeout);

    io_destroy(ctx);
    return 0;
}

用户程序的一个write设计的大概过程是,用户程序->aio_commit syscall->guest kernel process-> aio_commit->vfs->9p fs driver->virtio->switch from non-root mode (guest) to root mode (host)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚拟主机是指在一台物理服务器上同时运行多个域名的网站,每个网站都拥有独立的域名、IP地址、文档根目录和访问权限等特征,相互之间互不干扰。使用虚拟主机技术,可以在一台物理服务器上同时运行多个网站,提高服务器的资源利用率,降低网站运维成本。 根据实现方式的不同,虚拟主机可以分为以下两种类型: 1. 基于IP的虚拟主机:每个虚拟主机都有独立的IP地址,服务器通过监听不同的IP地址来实现虚拟主机的划分。这种方式需要占用大量的IP地址,不适合大规模的虚拟主机环境。 2. 基于名称的虚拟主机:每个虚拟主机都绑定在同一个IP地址上,服务器通过解析访问的域名来判断需要访问哪个虚拟主机。这种方式需要使用DNS来解析域名,相对于基于IP的虚拟主机更加节约IP资源,适合大规模的虚拟主机环境。 在实际应用,通常使用基于名称的虚拟主机方式。为了实现基于名称的虚拟主机,需要在Apache服务器配置每个虚拟主机的信息,包括域名、文档根目录、访问权限等。可以通过在Apache主配置文件(httpd.conf)添加VirtualHost块来配置虚拟主机。例如: ``` <VirtualHost *:80> ServerName www.example.com DocumentRoot /var/www/example <Directory /var/www/example> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost> ``` 这段配置代码表示为www.example.com配置一个虚拟主机,文档根目录为/var/www/example,访问权限为Indexes、FollowSymLinks、None和all granted。可以根据需要配置多个虚拟主机,以实现在一台物理服务器上同时运行多个网站的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值