一、virtio_blk基础知识介绍
1. 块设备简介
这里首先简单介绍一下块设备的相关概念。
在Linux操作系统有三类主要的设备文件:字符设备、网络设备、块设备。其中的字符设备是以字节为单位进行顺序I/O操作的设备;网络设备主要提供网络数据相关的通信服务;块设备以块单位输入输出的,对于I/O请求有对应的缓冲区,可以随机访问,块设备的访问位置必须能够在介质的不同区间前后移动。在块设备中,最小的可寻址单元是扇区,扇区的大小一般是2的整数倍,常见的大小为512个字节;
块的含义是由Linux制定对内核或文件系统等数据处理的基本单位。一般1个块由1个或多个扇区组成。
扇区的含义是任何块设备硬件对数据处理的基本单位。一般情况1个扇区的大小为512byte,也有以4096byte大小为基本单位。
2. virtio_blk简介
virtio-blk是KVM-Qemu虚拟化生态中的虚拟化块存储的一种实现方式,利用了virtio共享内存的机制,提供了一种高效的块存储挂载的方法。Virtio-blk设备在虚拟机以一个磁盘的方式呈现。Guest OS内核通过加载virtio-blk驱动,实现对后端的块存储的读写,无需额外的厂家专用驱动。
virtio-blk驱动使用Virtio机制为Guest提供了一个高性能的块设备I/O的方法。
在KVM平台中,qemu程序负责模拟一台PC的整个工作过程。
qemu对设备的模拟可以分成全模拟和半模拟。其中全模拟,不需要提供专门针对虚拟化场景的设备驱动,可以复用物理环境下的驱动程序。不过全模拟时,虚拟机内部驱动会频繁访问虚拟机IO端口,KVM平台下会产生大量的陷入和陷出操作。此外虚拟机内外数据传输时拷贝方式只能以字节为单位进行,无法直接采用共享内存的方式,因此大大降低访问性能。而半摸拟技术中,虚拟化设备配合前端驱动,采用全新的事件通知和数据传递机制,进而大幅提升性能,例如以virtio-blk实现访问磁盘的行为中,采用io_event_fd进行前端到后端通知,采用中断注入方式实现后端到前端的通知,并通过IO环(Vring)进行数据的共享。
现在业界,Virtio通过硬件加速已经是行业的一个通用的做法。因此,在智能网卡中,实现virtio_blk硬件加速,也是必然趋势。将virtio-blk到后端映射到远端磁盘上,这样不需要在主机系统中挂载很多的远端磁盘,由智能网卡直接完成映射,更加安全。