v9fs:Plan 9 Linux 资源共享

关于

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> 进行了额外开发。

关于 Linux 实现和 9p 客户端应用的最好的详细解释,可以参考一篇 USENIX 论文

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

用法

用于远程文件服务器

mount -t 9p 10.10.1.2 /mnt/9

用于 Plan 9 用户空间应用程序 (http://swtch.com/plan9)

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 用法

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

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 执行单次附加,并以一个用户的身份执行所有操作

client

基于 ACL 的 9p 客户端访问检查,用于访问验证

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(移植到 Linux/BSD/OSX/等上的 Plan 9 应用程序和库)的信息,请查看 https://9fans.github.io/plan9port/