v9fs:适用于 Linux 的 Plan 9 资源共享

关于

v9fs 是 Plan 9 9p 远程文件系统协议的 Unix 实现。

此软件最初由 Ron Minnich <rminnich@sandia.gov> 和 Maya Gokhale 开发。Greg Watson <gwatson@lanl.gov> 和最近的 Eric Van Hensbergen <ericvh@gmail.com>、Latchesar Ionkov <lucho@ionkov.net> 和 Russ Cox <rsc@swtch.com> 进行了额外的开发。

有关 9p 客户端的 Linux 实现和应用的最好的详细说明,请参见 USENIX 论文

其他应用在以下论文中进行了描述

用法

用于远程文件服务器

mount -t 9p 10.10.1.2 /mnt/9

用于 Plan 9 From User Space 应用程序 (https://9fans.github.io/plan9port/)

mount -t 9p `namespace`/acme /mnt/9 -o trans=unix,uname=$USER

用于在带有 virtio 传输的 QEMU 主机上运行的服务器

mount -t 9p -o trans=virtio <mount_tag> /mnt/9

其中 mount_tag 是服务器为每个导出的挂载点生成的标记。客户端将每个 9P 导出视为具有关联“mount_tag”属性的 virtio 设备。可通过读取 /sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag 文件来查看可用的挂载标记。

USBG 用法

要在运行时通过 gadget 挂载 USB 主机上可访问的 9p FS

mount -t 9p -o trans=usbg,aname=/path/to/fs <device> /mnt/9

要将 9p FS 作为根文件系统挂载在通过 gadget 可访问的 USB 主机上

root=<device> rootfstype=9p rootflags=trans=usbg,cache=loose,uname=root,access=0,dfltuid=0,dfltgid=0,aname=/path/to/rootfs

其中 <device> 是 usb gadget 传输关联的标记。它由 configfs 实例名称定义。

USBG 示例

USB 主机导出文件系统,而 USB 设备端的 gadget 使其可挂载。

Diod (9pfs 服务器) 和转发器位于开发主机上,实际存储根文件系统。该 gadget 在嵌入式板上启动期间(或之后)初始化。然后,转发器将在 USB 总线上找到它并开始转发请求。

在这种情况下,9p 请求来自设备并由主机处理。原因是 USB 设备端口通常在 PC 上不可用,因此在另一个方向上的连接将不起作用。

使用 usbg 传输时,目前没有能够处理来自 gadget 驱动程序的请求的原生 usb 主机服务。为此,我们必须使用 tools/usb 中的额外 python 工具 p9_fwd.py。

只需启动支持 9pfs 的网络服务器,例如 diod/nfs-ganesha,例如

$ diod -f -n -d 0 -S -l 0.0.0.0:9999 -e $PWD

如果存在多个 usbg gadget,可以选择扫描总线以查找其路径

$ python $kernel_dir/tools/usb/p9_fwd.py list

Bus | Addr | Manufacturer     | Product          | ID        | Path
--- | ---- | ---------------- | ---------------- | --------- | ----
  2 |   67 | unknown          | unknown          | 1d6b:0109 | 2-1.1.2
  2 |   68 | unknown          | unknown          | 1d6b:0109 | 2-1.1.3

然后启动 python 传输

$ python $kernel_dir/tools/usb/p9_fwd.py --path 2-1.1.2 connect -p 9999

之后,可以按照上述方式使用 gadget 驱动程序。

一种用例是在嵌入式 Linux 设备开发期间将其用作 NFS 根启动的替代方案。

选项

trans=name

选择一个替代传输。目前有效的选项是

unix

指定命名管道挂载点

tcp

指定常规 TCP/IP 连接

fd

用于传递文件描述符以进行连接(请参见 rfdno 和 wfdno)

virtio

连接到下一个可用的 virtio 通道(来自带有 trans_virtio 模块的 QEMU)

rdma

连接到指定的 RDMA 通道

usbg

连接到指定的 usb gadget 通道

uname=name

尝试以远程服务器上的用户身份挂载的用户名。服务器可能会覆盖或忽略此值。某些用户名可能需要身份验证。

aname=name

aname 指定服务器提供多个导出的文件系统时要访问的文件树。

cache=mode

指定缓存策略。默认情况下,不使用任何缓存。可以按位掩码或使用预先存在的常用“快捷方式”来指定模式。位掩码描述如下:(未指定的位保留)

0b00000000

禁用所有缓存,禁用 mmap

0b00000001

启用文件缓存

0b00000010

启用元数据缓存

0b00000100

回写行为(相对于直写)

0b00001000

松散缓存(与服务器没有显式一致性)

0b10000000

启用 fscache 以进行持久缓存

当前快捷方式及其关联的位掩码为

none

0b00000000(不缓存)

readahead

0b00000001(仅预读文件缓存)

mmap

0b00000101(预读 + 回写文件缓存)

loose

0b00001111(非一致性文件和元数据缓存)

fscache

0b10001111(持久松散缓存)

注意:目前仅测试了这些快捷方式的操作模式,因此不确定其他位模式组合是否有效。正在进行对更好缓存支持的工作。

重要提示:松散缓存(以及目前的 fscache)不一定会验证服务器上的缓存值。换句话说,不能保证服务器上的更改会反映在客户端系统上。只有在具有独占挂载并且服务器不会在您下面修改文件系统的情况下才使用此操作模式。

debug=n

指定调试级别。调试级别是一个位掩码。

0x01

显示详细的错误消息

0x02

开发人员调试 (DEBUG_CURRENT)

0x04

显示 9p 跟踪

0x08

显示 VFS 跟踪

0x10

显示编组调试

0x20

显示 RPC 调试

0x40

显示传输调试

0x80

显示分配调试

0x100

显示协议消息调试

0x200

显示 Fid 调试

0x400

显示数据包调试

0x800

显示 fscache 跟踪调试

rfdno=n

用于使用 trans=fd 进行读取的文件描述符

wfdno=n

用于使用 trans=fd 进行写入的文件描述符

msize=n

用于 9p 数据包有效负载的字节数

port=n

连接到远程服务器上的端口

noextend

强制传统模式(没有 9p2000.u 或 9p2000.L 语义)

version=name

选择 9P 协议版本。有效选项为

9p2000

传统模式(与 noextend 相同)

9p2000.u

使用 9P2000.u 协议

9p2000.L

使用 9P2000.L 协议

dfltuid

尝试以特定 uid 挂载

dfltgid

尝试以特定 gid 挂载

afid

安全通道 - 由 Plan 9 身份验证协议使用

nodevmap

不映射特殊文件 - 将它们表示为普通文件。这可用于在主机之间共享设备/命名管道/套接字。此功能将在以后的版本中扩展。

directio

绕过所有读/写操作的页面缓存

ignoreqv

忽略 qid.version==0 作为忽略缓存的标记

noxattr

不在此挂载上提供 xattr 功能。

access

有四种访问模式。
user

如果用户首次尝试访问 v9fs 文件系统上的文件,v9fs 会为该用户发送一个附加命令 (Tattach)。这是默认模式。

<uid>

只允许 uid=<uid> 的用户访问挂载的文件系统上的文件

any

v9fs 执行单次附加并将所有操作作为一名用户执行

clien

在 9p 客户端上基于 ACL 的访问检查以进行访问验证

cachetag

用于使用指定的持久缓存的缓存标记。现有缓存会话的缓存标记可以在 /sys/fs/9p/caches 中列出。(仅适用于 cache=fscache)

行为

本节旨在描述可能与本地文件系统行为不同的 9p“怪癖”。

  • 在文件上设置 O_NONBLOCK 将使客户端读取在服务器返回某些数据时尽早返回,而不是尝试用请求的字节数或文件结尾填充读取缓冲区。

资源

协议规范在 github 上维护:http://ericvh.github.com/9p-rfc/

9p 客户端和服务器实现列在 http://9p.cat-v.org/implementations

LLNL 正在开发 9p2000.L 服务器,可以在 http://code.google.com/p/diod/ 找到

用户和开发人员邮件列表可通过 sourceforge 上的 v9fs 项目获得 (http://sourceforge.net/projects/v9fs)。

新闻和其他信息在 Wiki 上维护。(http://sf.net/apps/mediawiki/v9fs/index.php)。

错误报告最好通过邮件列表发出。

有关 Plan 9 操作系统的信息,请查看 http://plan9.bell-labs.com/plan9

有关 Plan 9 from User Space(移植到 Linux/BSD/OSX/等的 Plan 9 应用程序和库)的信息,请查看 https://9fans.github.io/plan9port/