趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

54 | 存储虚拟化(下):如何建立自己保管的单独档案库?

virtio_blk_req_complete
virtqueue_get_buf_ctx
virtqueue_get_buf
virtio_blk_done
vring_interrupt
vp_interrupt
virtio_notify
virtio_blk_req_complete
virtio_blk_rw_complete
Coroutine
blk_aio_prwv
blk_aio_pwritev
BlockBackend
blk_aio_pwritev
virtio_blk_handle_request
virtio_blk_get_request
中断处理函数(vp_interrupt)
make_request_fn
request queue
virtio_blk_handle_vq
块设备驱动(virtio_blk)
I/O调度层
通用块设备层
VFS
存储虚拟化的写入过程
virtio_blk_handle_output
内核处理
write系统调用
总结时刻
QEMU
虚拟机内部
存储虚拟化场景下整个写入过程

该思维导图由 AI 生成,仅供参考

上一节,我们讲了 qemu 启动过程中的存储虚拟化。好了,现在 qemu 启动了,硬盘设备文件已经打开了。那如果我们要往虚拟机的一个进程写入一个文件,该怎么做呢?最终这个文件又是如何落到宿主机上的硬盘文件的呢?这一节,我们一起来看一看。

前端设备驱动 virtio_blk

虚拟机里面的进程写入一个文件,当然要通过文件系统。整个过程和咱们在文件系统那一节讲的过程没有区别。只是到了设备驱动层,我们看到的就不是普通的硬盘驱动了,而是 virtio 的驱动。
virtio 的驱动程序代码在 Linux 操作系统的源代码里面,文件名叫 drivers/block/virtio_blk.c。
static int __init init(void)
{
int error;
virtblk_wq = alloc_workqueue("virtio-blk", 0, 0);
major = register_blkdev(0, "virtblk");
error = register_virtio_driver(&virtio_blk);
......
}
module_init(init);
module_exit(fini);
MODULE_DEVICE_TABLE(virtio, id_table);
MODULE_DESCRIPTION("Virtio block driver");
MODULE_LICENSE("GPL");
static struct virtio_driver virtio_blk = {
......
.driver.name = KBUILD_MODNAME,
.driver.owner = THIS_MODULE,
.id_table = id_table,
.probe = virtblk_probe,
.remove = virtblk_remove,
......
};
前面我们介绍过设备驱动程序,从这里的代码中,我们能看到非常熟悉的结构。它会创建一个 workqueue,注册一个块设备,并获得一个主设备号,然后注册一个驱动函数 virtio_blk。
当一个设备驱动作为一个内核模块被初始化的时候,probe 函数会被调用,因而我们来看一下 virtblk_probe。
static int virtblk_probe(struct virtio_device *vdev)
{
struct virtio_blk *vblk;
struct request_queue *q;
......
vdev->priv = vblk = kmalloc(sizeof(*vblk), GFP_KERNEL);
vblk->vdev = vdev;
vblk->sg_elems = sg_elems;
INIT_WORK(&vblk->config_work, virtblk_config_changed_work);
......
err = init_vq(vblk);
......
vblk->disk = alloc_disk(1 << PART_BITS);
memset(&vblk->tag_set, 0, sizeof(vblk->tag_set));
vblk->tag_set.ops = &virtio_mq_ops;
vblk->tag_set.queue_depth = virtblk_queue_depth;
vblk->tag_set.numa_node = NUMA_NO_NODE;
vblk->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
vblk->tag_set.cmd_size =
sizeof(struct virtblk_req) +
sizeof(struct scatterlist) * sg_elems;
vblk->tag_set.driver_data = vblk;
vblk->tag_set.nr_hw_queues = vblk->num_vqs;
err = blk_mq_alloc_tag_set(&vblk->tag_set);
......
q = blk_mq_init_queue(&vblk->tag_set);
vblk->disk->queue = q;
q->queuedata = vblk;
virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN);
vblk->disk->major = major;
vblk->disk->first_minor = index_to_minor(index);
vblk->disk->private_data = vblk;
vblk->disk->fops = &virtblk_fops;
vblk->disk->flags |= GENHD_FL_EXT_DEVT;
vblk->index = index;
......
device_add_disk(&vdev->dev, vblk->disk);
err = device_create_file(disk_to_dev(vblk->disk), &dev_attr_serial);
......
}
在 virtblk_probe 中,我们首先看到的是 struct request_queue,这是每一个块设备都有的一个队列。还记得吗?它有两个函数,一个是 make_request_fn 函数,用于生成 request;另一个是 request_fn 函数,用于处理 request。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了存储虚拟化场景下的数据写入过程及相关技术细节。在虚拟化环境中,数据的写入涉及虚拟机和宿主机之间的复杂协调和管理,包括数据传输、缓存处理和文件系统操作等多个环节。存储虚拟化技术通过虚拟磁盘驱动程序和文件系统缓存的协同工作,实现了虚拟机和宿主机之间的高效数据交互,体现了其高效性和灵活性。文章还介绍了在客户机前端和qemu后端之间传递数据的支持,包括设备驱动程序的初始化和队列的设置,以及virtqueue的初始化和管理。通过详细讲解virtio队列的管理和配置过程,读者可以深入了解存储虚拟化技术的重要细节。文章内容涵盖了虚拟磁盘驱动程序、PCI设备配置、队列的格式等多个方面,为读者提供了全面的技术参考。文章内容涵盖了虚拟磁盘驱动程序、PCI设备配置、队列的格式等多个方面,为读者提供了全面的技术参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 没心没肺
    每次看到文中说还记得什么什么吗,我心里总是默默回答:不 记 得😂

    作者回复: 的确,体系比较复杂,关联性很强

    2019-07-31
    2
    15
  • Adam Lau
    坦白说,这是极客上技术含量最好的专栏了,听不懂了,但是表示敬意。

    作者回复: 谢谢,加油

    2020-04-17
    12
  • williamcai
    调用链条好长,突然来个回马枪,一下子杀到开始的地方
    2019-12-23
    3
  • shangyu
    老师能不能解释下这种特殊的驱动模式与直接翻译write请求的性能差异
    2019-12-23
    3
  • 追风筝的人
    好复杂鸭
    2019-11-26
    1
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部