本文概述了virtio-fs,这是一种与来宾和OSV共享主机文件系统的新方法,OSV是一种专门的、轻量级的云操作系统(Unikernel),本文将介绍这两种文件系统是如何结合在一起的。
Virtio-fs是一种新的主机-来宾共享文件系统,专门为本地文件系统语义和性能而构建。为此,它充分利用了主机和来宾主机在同一台物理机上的位置,这与基于网络的工作不同,比如virtio-9p。
顾名思义,virtio-fs构建在virtio之上以提供高效的传输:它作为一种新设备包含在virtio规范(目前的草案将成为v1.2)中。该设备使用的协议是FUSE的略微扩展版本,为Linux上原生的所有文件系统操作提供了坚实的基础。在实现方面,在QEMU端,它采取在客户接口(由QEMU处理)和主机文件系统接口(设备“后端”)之间拆分的方法。后者由virtiofsd(“virtio-fs daemon”)处理,作为单独的进程运行,利用vhost-user协议与qemu通信。
Virtio-fs的一个突出性能特征是DAX(直接访问)窗口。它是主机和来宾之间的一个共享内存窗口,作为设备内存(一个PCI条)暴露给第二个来宾。根据请求,主机(QEMU)将文件内容映射到来宾可以直接访问的窗口。这是由于将VMEXIT移出读/写数据路径并绕过Linux上的来宾页面缓存,而不计入VM内存(因为它只是主机上管理的设备内存),所以具有很高的性能。
Virtio-fs正在积极开发中,其社区专注于QEMU中的两个设备实现和Linux中的设备驱动程序。这两个组件在最初的迭代中都已经在上游可用,而上游还在继续,例如通过DAX窗口支持。
应用程序专门化:单核是一个可执行的机器镜像,由应用程序和支持代码(驱动程序、内存管理、运行时等)组成。链接在一起,在单个地址空间中运行(通常在来宾“内核模式”下)。
库操作系统:每个单内核只包含其应用程序在非应用程序代码方面要求的功能,即不包含未使用的驱动程序,甚至不包含整个子系统(例如,如果应用程序不使用网络,则为网络)。
OSV尤其使用动态链接器努力实现与Linux的二进制兼容性。这意味着为Linux构建的应用程序应该作为OSV单核运行,而不需要修改甚至重建,至少在大多数情况下是这样。当然,并不是整个Linux ABI都被支持,在所有缺乏进程概念的单核中,像fork()和relatis这样的系统调用在设计上都是缺失的。尽管有这个限制,但OSV功能相当齐全,完全支持SMP、虚拟内存、虚拟文件系统(以及许多文件系统实现,包括ZFS)以及基于FreeBSD源代码的成熟网络堆栈。
在这一点上,人们肯定会问:“为什么要为单一内核操心呢?”引入它们最初要解决的问题是现代云计算中臃肿的软件堆栈。在已经负责隔离并提供标准设备模型的管理程序之上,将通用操作系统作为来宾运行,通常用于单个应用程序/服务,这意味着重复,以及效率损失。这就是我们引入的统一内核,基于它们在一个虚拟机内执行的假设,试图只支持单个应用程序,并且尽可能轻量级。下面是通用操作系统、单内核和容器之间的比较(作为解决相同问题的另一种方法,为了完整性)。
例如,从容器世界中可以明显看出,在隔离环境(例如容器或单内核,甚至更多)中运行的应用程序需要主机文件系统访问是非常常见的。因此,共享主机内核的容器具有通向主机文件系统的明显的、可控的路径,而对于单内核,情况则更为复杂:所有解决方案都有些重量级,需要网络链接或通过网络协议间接连接。然后,Virtio-fs提供了一条更有吸引力的路线:直接映射关闭操作(通过FUSE),重用现有的virtio传输并降低性能,而不需要很高的内存开销。
当在QEMU下执行时,OSV社区很快发现了机会,并提出了仅限区域的实现。这强调了在复杂性方面是轻量级的,同时满足了许多应用程序的需求(它们是无状态的,可以认为是无服务器的)。值得注意的是,它包括对DAX窗口的支持(甚至在它被合并到上游QEMU之前),提供了卓越的性能,可以直接与本地(非共享)的同类产品相媲美,比如ZFS和ROFS(一种特定于OSv的只读文件系统)。
一个中心点是OSV支持从virtio-fs引导:这使得无需重新构建镜像即可部署修改后的版本或整个新的应用程序,只需在主机上调整其根文件系统内容即可。最后,由于DAX窗口实际上提供了对主机页面缓存的低开销访问,因此可扩展性也有望出类拔萃,这是一个普遍关注的问题,因为每个主机的单内核密度可能很高。
例如,要使用核心OSV构建系统构建可从virtio-fs引导的cli OSV镜像:
这会产生一个最小的图像(只有initramfs),而根文件系统的内容则放在主机上的一个目录中(默认情况下,这里是构建/导出)。
运行上面的镜像只有一步之遥(可能需要使用QEMU的virtio-fs开发版本,例如用于DAXWindow支持):
这将使用build/export的内容作为根文件系统来协调virtiofsd和qemu的运行。直接从主机对此目录所做的任何更改都将在来宾系统中可见,而无需重新运行前面的构建步骤。
OSV获得了一个突出的新特性,由virtio-fs及其QEMU实现提供支持。得益于本地Virtio传输、FUSE协议和DAX窗口架构的使用,这允许高效、轻量级和高性能地访问主机的文件系统。反过来,它支持像erapid单内核重新配置这样的用例。