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 论文
其他应用在以下论文中进行了描述
XCPU & 集群 http://xcpu.org/papers/xcpu-talk.pdf
KVMFS:KVM 的控制文件系统 http://xcpu.org/papers/kvmfs.pdf
CellFS:Cell BE 的新编程模型 http://xcpu.org/papers/cellfs-talk.pdf
PROSE I/O:使用 9p 启用应用程序分区 http://plan9.escet.urjc.es/iwp9/cready/PROSE_iwp9_2006.pdf
VirtFS:一种虚拟化感知文件系统传递 https://linuxkernel.org.cn/doc/ols/2010/ols2010-pages-109-120.pdf
用法¶
用于远程文件服务器
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/