9pfs

本章节中,主要对 9p 协议进行了简要的介绍,以及如何在 RuxOS 上使用 9pfs 进行了简要的说明。

9PFS 即 9p-filesystem,是一种基于 9P 协议实现对 server 端文件系统读写的文件系统。

在 RuxOS 中,9pfs 对应于两个不同的特性(feature),即 virtio-9pnet-9p。其中 virtio-9p 是基于 hypervisor 中的 virtio-9p 虚拟设备进行通信来控制 host 文件系统的读写,而 net-9p 则通过网络 TCP 协议实现连接通信并控制 server 端文件系统的读写。这两个不同特性可以同时启用并正常工作。

9P 事实上是一种用来进行文件读写的通信协议,它只是在会话层的。这就意味着在本质上9P与物理层、数据链路层等无关。9P通信协议的版本存在 9P20009P2000.L9P2000.u 三种,其协议内容可以参考以下链接:

virtio-9p

使用 virtio-9p需要在 APP 添加该 feature。

对于 C APP,是在 APP 目录下的 features.txt 下加入一行:

virtio-9p

对于 rust APP,则需要在 APP 目录下的 Cargo.toml 的 axstd 特性中加入 virtio-9p 特性,具体如下(该例子是 application/fs/shell 中的Cargo.toml):

axstd = { path = "../../../ulib/axstd", features = ["alloc", "fs", "virtio-9p"], optional = true }

然后,为了使得 host(当前是 qemu-system-aarch64)启用 virtio-9p 的后端,需要在 make 命令行中加入参数 V9P=y

例如:

make A=xxxx LOG=error V9P=y V9P_PATH=xxxx ARCH=xxxx

V9P_PATH 是一个环境变量,对应于 host 的文件目录映射路径,如果不设置该参数则为为当前目录 ./

完成以上步骤在理论上即可在根目录下创建一个 v9fs 的目录(或者作为根文件系统加载),该目录应当包含host后端所映射的文件目录。举例来说,当V9P_PATH=./temp/时,v9fs(或根文件)目录将和 ./temp 目录保持一致。

此外,virtio-9p 涉及到了一些可设置的环境变量。这些环境变量都存在一个默认值,有时并不需要显示的设置,这些环境变量及其默认值分别为:

V9P_PATH ?= ./           # 对应于host的文件目录映射路径,默认为当前目录
ANAME_9P ?= ./           # 对应与tattach时的aname路径参数,在当前版本下的qemu可以设置为任意值,但某些情况(host存在多个映射路径)下可能需要设置为选择的对应host文件目录路径
PROTOCOL_9P ?= 9P2000.L  # 默认选择的9P协议,如`9P2000.L`和`9P2000.u`,区分大小写

net-9p

使用 net-9p 需要在 APP 添加该 feature。

对于 C APP,是在APP目录下的 features.txt 下加入一行:

net-9p

对于 rust APP,则需要在 APP 目录下的 Cargo.toml 的 axstd 特性中加入 net-9p 特性,具体如下(该例子是 application/fs/shell中的 Cargo.toml):

axstd = { path = "../../../ulib/axstd", features = ["alloc", "fs", "net-9p"], optional = true }

然后,net-9p 需要通过 TCP 网络协议实现通信,因此需要在 make 命令行中加入参数 NET=y

例如:

make A=xxxx LOG=error NET=y ARCH=xxxx

完成以上步骤在理论上即可在根目录下创建一个 v9fs 的目录(或者作为根文件系统加载),该目录应当包含host后端所映射的文件目录。net-9p 后端映射的具体路径可能需要通过 ANAME_9P 进行控制,但这具体取决于 server 端的设计(亦可能是在启动server时传入参数或更改部分server端代码)。

此外,net-9p 涉及到了一些可设置的环境变量。这些环境变量都存在一个默认值,有时并不需要显示的设置,这些环境变量及其默认值分别为:

NET_9P_ADDR ?= 127.0.0.1:564 # 9P sever端的IP地址和PORT端口号,默认值为 127.0.0.1:564。
ANAME_9P ?= ./           # 对应与tattach时的aname路径参数,能需要设置为具体选择的对应host文件目录路径
PROTOCOL_9P ?= 9P2000.L  # 默认选择的9P协议,如`9P2000.L`和`9P2000.u`,区分大小写