virtio-blk请求发起

本文深入探讨virtio-blk在使用blk-mq模型下的请求处理流程,从virtio_queue_rq函数开始,详细解析了blk_rq_map_sg、__blk_bios_map_sg等函数的作用,涉及硬件队列设置、请求结构及scatterlist的构建。通过对内核源码3.19.3的分析,揭示了virtio-blk请求从发起到完成的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vitrio-blk请求发起

source code:3.19.3
较新的内核中(从哪个版本开始的没去考证)virtio-blk使用了blk-mq模型,先看一下virtio-blk初始化的时候的和blk-mq相关的设置(在virtblk_probe函数中):
1.blk-mq回调函数族:

        vblk->tag_set.ops = &virtio_mq_ops;

ops是blk-mq模型中关键的一组回调函数,至少要保证设置其中的queue_rq和map_queue
queue_rq函数简单来说就是指明如何处理请求
map_queue函数负责sw queue到hw queue的映射
而virtio_mq_ops中将两者分别设置为* virtio_queue_rq函数 blk_mq_map_queue函数*,前者是我们需要关注的,后者是blk-mq中提供的一种默认映射(目前基本上都是使用这种映射关系)

2.队列深度:

        vblk->tag_set.queue_depth = virtblk_queue_depth;

queue_depth表示硬件队列的深度,这里将其设置为virtblk_queue_depth,而它又和virtqueue结构的num_free有关系(只是和初始化时期的num_free有关系,因为后面在请求处理过程中num_free会变化):

    /* Default queue sizing is to fill the ring. */
    if (!virtblk_queue_depth) {
        virtblk_queue_depth = vblk->vqs[0].vq->num_free;
        /* ... but without indirect descs, we use 2 descs per req */
        if (!virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC))
            virtblk_queue_depth /= 2;
    }

3.“请求”额外所需大小:

在虚拟化环境中,`virtio-blk` 设备是一种用于模拟块设备(如硬盘)的虚拟设备驱动。它允许虚拟机访问存储资源,并支持常见的磁盘操作,包括格式化。 要对 `virtio-blk` 设备进行格式化操作,可以按照以下步骤进行: ### 格式化 virtio-blk 设备 1. **确认设备路径** 在虚拟机内部,首先需要确认 `virtio-blk` 设备的设备路径。通常情况下,该设备会被识别为 `/dev/vdX`,其中 `X` 是字母标识符(例如 `/dev/vda`、`/dev/vdb` 等)。可以通过以下命令查看系统中可用的块设备: ```bash lsblk ``` 或者使用 `fdisk` 查看详细信息: ```bash fdisk -l ``` 2. **创建文件系统** 在确认设备路径后,可以使用 `mkfs` 命令来格式化设备并创建文件系统。例如,若希望将设备格式化为 ext4 文件系统,可执行以下命令: ```bash mkfs.ext4 /dev/vdX ``` 请将 `/dev/vdX` 替换为实际的设备名称。此操作会清除设备上的所有数据,请确保已备份重要数据[^1]。 3. **挂载文件系统** 格式化完成后,可以将新创建的文件系统挂载到某个目录以便使用。例如,创建一个挂载点并将设备挂载至该位置: ```bash mkdir /mnt/mydisk mount /dev/vdX /mnt/mydisk ``` 4. **验证挂载状态** 使用以下命令验证设备是否已成功挂载: ```bash df -h ``` 输出结果应显示 `/dev/vdX` 已挂载至 `/mnt/mydisk`。 5. **配置开机自动挂载** 如果希望在系统启动时自动挂载该设备,可以编辑 `/etc/fstab` 文件并添加相应的条目。例如: ```bash /dev/vdX /mnt/mydisk ext4 defaults 0 2 ``` ### 注意事项 - **数据丢失风险**:格式化操作会清除设备上的所有数据,因此在执行前必须确保已做好数据备份。 - **设备兼容性**:确保所使用的镜像格式与 `virtio-blk-data-plane` 兼容。目前仅支持 `raw` 格式的设备使用 `virtio-blk-data-plane` 特性[^2]。 - **虚拟化特性限制**:如果使用了 `virtio-blk-data-plane`,需要注意其对部分虚拟化功能的支持情况,例如存储镜像迁移、热插拔等特性可能受限。 ### 示例代码:自动化格式化脚本 以下是一个简单的 Bash 脚本示例,用于自动化格式化和挂载 `virtio-blk` 设备: ```bash #!/bin/bash DEVICE="/dev/vdX" MOUNT_POINT="/mnt/mydisk" FS_TYPE="ext4" # 格式化设备 mkfs.$FS_TYPE $DEVICE # 创建挂载点 mkdir -p $MOUNT_POINT # 挂载设备 mount $DEVICE $MOUNT_POINT # 验证挂载 df -h | grep $DEVICE ``` 请根据实际情况修改脚本中的变量值后再运行。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值