共享文件系统框架(或虚拟文件系统框架)使在虚拟机 (VM) 中运行的Guest能够访问 QNX Hypervisor Host共享的目录中的文件。
本章假设您已经熟悉以下文档中介绍的概念:
- QNX Hypervisor User’s Guide
- The virtualization frameworks architecture
该框架提供了一个虚拟设备 (vdev) virtio-fs
,它使Guest应用程序可以通过虚拟文件系统访问Host目录。
vdev 遵循的设计不属于任何 VirtIO 规范,而是 Linux、QEMU、FUSE 和 Kata Containers 社区中单独开源项目的一部分。
更多信息,参阅https://virtio-fs.gitlab.io/design.html。
我们的 vdev 与各种 Linux 内核版本兼容。
基于virtio-fs
的文件系统为 guest 虚拟机提供本地文件系统语义,允许多个 guest 虚拟机共享相同的挂载点,并通过提供快速一致性(fast coherency
)来利用在同一台计算机上运行的 VM。
Filesystem sharing
Host在其自己的本地文件系统中管理Guest和共享目录之间的所有交互:
- hypervisor Host拥有存储它可以共享的目录的物理设备,并通过对其本地文件系统的 POSIX 调用与其内容(文件)进行交互。
- 如果 VM 中的 guest 虚拟机需要访问某些Host目录,VM 会向 guest 虚拟机提供
virtio-fs
vdev,并且 guest 虚拟机运行 VirtIO 文件系统驱动程序以与 vdev 交互。 - vdev 配置命名将与Guest共享的特定Host目录。
要共享多个Host目录,您可以指定不同的
virtio-fs
vdev 实例,每个要共享的目录对应一个实例。
下图说明了由hypervisor Host管理的Guest和共享Host目录之间的交互。
有关 QNX Hypervisor 中设备共享的更多信息,请参阅QNX Hypervisor User’s Guide中的“Understanding QNX Virtual Environments”一章中的“Devices”部分。
Filesystem virtualization
虚拟文件系统框架使Host目录的共享对于Guest和Host中的应用程序透明。
启动时,GUest发出挂载命令以使共享主机目录出现在本地(Guest)文件系统中的某个位置。
当Guest应用程序访问该挂载点处的文件时,Guest操作系统会识别出访问虚拟文件系统的尝试,并向 VirtIO 文件系统驱动程序发送请求。
驱动程序使用 USerspace 文件系统 (FUSE) 协议封装请求。
这是 virtio-fs
所基于的众所周知的协议。
对于 Android guest,为了确保其挂载命令成功,您可能需要编辑用于构建Guest 镜像的配置文件。 有关详细信息,请参阅下一节。
FUSE 请求使用 virtqueues
发送到 virtio-fs
vdev(为了简洁起见,图中未显示)。
在Host上,vdev 然后将这些请求发送到 FUSE 守护进程,该守护进程解释 FUSE 协议消息并与主机文件系统配合执行相应的操作。
操作完成后,守护进程将结果发送到 vdev,vdev 通过 virtqueues
将结果传回 guest 虚拟机。
我们的 FUSE 守护进程基于 FUSE 协议版本 3.9。
在Host上,启动时,vdev 使用 VM 外部的辅助实用程序,fuse_launcher
,来启动 FUSE 守护程序。
vdev 将其一些配置选项传递给 fusion_launcher
,以便它可以使用要共享的Host目录以及是否启用直接 I/O 的所需设置来运行守护程序。
成功启动守护进程后,fuse_launcher
将关闭。
守护程序服务称为passthrough
,因为它镜像或通过Host文件系统传递给Guest。
尽管Guest选择的挂载点与共享Host目录的路径无关,但该挂载点的内容(其文件和子目录)看起来与Host上的完全相同。
Guest应用程序不需要额外的权限来访问这些文件; 如果他们可以访问挂载点,他们就可以访问Host目录文件。
Host应用程序甚至不知道Guest应用程序正在访问给定目录。 他们可以像往常一样使用 POSIX 文件系统调用对本地文件执行读取、写入等操作。 尽管如此,Guest应用程序对此目录文件所做的任何更新都将被Host应用程序看到。
编辑Android配置以确保挂载成功
我们的 virtio-fs
实现当前不支持从 QNX Host共享的文件或目录的扩展属性 (xattr)。
如果 Android Guest的安全增强型 (SE) Linux 配置指定将扩展属性用于 virtio-fs
,则Guest的 mount 命令将失败并出现以下错误:
Operation not supported on transport endpoint.
为了防止出现此错误,请检查生成Guest映像的 Android 版本的 .../system/sepolicy/private/fs_use
配置文件。
如有必要,请从此文件中删除以下行:
fs_use_xattr virtiofs u:object_r:labeledfs:s0;
我们的 virtio-fs
实现支持常规文件属性; 不支持扩展属性。