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 论文
其他应用在以下论文中描述
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 用户空间应用程序 (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/