框架结构

Posted by Underdog Linux on November 6, 2023

共享文件系统框架(或虚拟文件系统框架)使在虚拟机 (VM) 中运行的Guest能够访问 QNX Hypervisor Host共享的目录中的文件。

本章假设您已经熟悉以下文档中介绍的概念:

该框架提供了一个虚拟设备 (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目录之间的交互。

shared_filesystem_framework_arch.png

有关 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 实现支持常规文件属性; 不支持扩展属性。