xref: /linux/Documentation/filesystems/9p.rst (revision bba2c3615bd6cfee7456d1130f2e6b01b3f4e9ba)
1.. SPDX-License-Identifier: GPL-2.0
2
3=======================================
4v9fs: Plan 9 Resource Sharing for Linux
5=======================================
6
7About
8=====
9
10v9fs is a Unix implementation of the Plan 9 9p remote filesystem protocol.
11
12This software was originally developed by Ron Minnich <rminnich@sandia.gov>
13and Maya Gokhale.  Additional development by Greg Watson
14<gwatson@lanl.gov> and most recently Eric Van Hensbergen
15<ericvh@gmail.com>, Latchesar Ionkov <lucho@ionkov.net> and Russ Cox
16<rsc@swtch.com>.
17
18The best detailed explanation of the Linux implementation and applications of
19the 9p client is available in the form of a USENIX paper:
20
21   https://www.usenix.org/events/usenix05/tech/freenix/hensbergen.html
22
23Other applications are described in the following papers:
24
25	* XCPU & Clustering
26	* KVMFS: control file system for KVM
27	* CellFS: A New Programming Model for the Cell BE
28	* PROSE I/O: Using 9p to enable Application Partitions
29	  http://web.archive.org/web/20110101152020/http://plan9.escet.urjc.es/iwp9/cready/PROSE_iwp9_2006.pdf
30	* VirtFS: A Virtualization Aware File System pass-through
31	  https://kernel.org/doc/ols/2010/ols2010-pages-109-120.pdf
32
33Usage
34=====
35
36For remote file server::
37
38	mount -t 9p 10.10.1.2 /mnt/9
39
40For Plan 9 From User Space applications (https://9fans.github.io/plan9port/)::
41
42	mount -t 9p `namespace`/acme /mnt/9 -o trans=unix,uname=$USER
43
44For server running on QEMU host with virtio transport::
45
46	mount -t 9p -o trans=virtio <mount_tag> /mnt/9
47
48where mount_tag is the tag generated by the server to each of the exported
49mount points. Each 9P export is seen by the client as a virtio device with an
50associated "mount_tag" property. Available mount tags can be
51seen by reading /sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag files.
52
53USBG Usage
54==========
55
56To mount a 9p FS on a USB Host accessible via the gadget at runtime::
57
58	mount -t 9p -o trans=usbg,aname=/path/to/fs <device> /mnt/9
59
60To mount a 9p FS on a USB Host accessible via the gadget as root filesystem::
61
62	root=<device> rootfstype=9p rootflags=trans=usbg,cache=loose,uname=root,access=0,dfltuid=0,dfltgid=0,aname=/path/to/rootfs
63
64where <device> is the tag associated by the usb gadget transport.
65It is defined by the configfs instance name.
66
67USBG Example
68============
69
70The USB host exports a filesystem, while the gadget on the USB device
71side makes it mountable.
72
73Diod (9pfs server) and the forwarder are on the development host, where
74the root filesystem is actually stored. The gadget is initialized during
75boot (or later) on the embedded board. Then the forwarder will find it
76on the USB bus and start forwarding requests.
77
78In this case the 9p requests come from the device and are handled by the
79host. The reason is that USB device ports are normally not available on
80PCs, so a connection in the other direction would not work.
81
82When using the usbg transport, for now there is no native usb host
83service capable to handle the requests from the gadget driver. For
84this we have to use the extra python tool p9_fwd.py from tools/usb.
85
86Just start the 9pfs capable network server like diod/nfs-ganesha e.g.::
87
88        $ diod -f -n -d 0 -S -l 0.0.0.0:9999 -e $PWD
89
90Optionally scan your bus if there are more then one usbg gadgets to find their path::
91
92        $ python $kernel_dir/tools/usb/p9_fwd.py list
93
94        Bus | Addr | Manufacturer     | Product          | ID        | Path
95        --- | ---- | ---------------- | ---------------- | --------- | ----
96          2 |   67 | unknown          | unknown          | 1d6b:0109 | 2-1.1.2
97          2 |   68 | unknown          | unknown          | 1d6b:0109 | 2-1.1.3
98
99Then start the python transport::
100
101        $ python $kernel_dir/tools/usb/p9_fwd.py --path 2-1.1.2 connect -p 9999
102
103After that the gadget driver can be used as described above.
104
105One use-case is to use it as an alternative to NFS root booting during
106the development of embedded Linux devices.
107
108Options
109=======
110
111  ============= ===============================================================
112  trans=name	select an alternative transport.  Valid options are
113  		currently:
114
115			========  ============================================
116			unix 	  specifying a named pipe mount point
117			tcp	  specifying a normal TCP/IP connection
118			fd   	  used passed file descriptors for connection
119                                  (see rfdno and wfdno)
120			virtio	  connect to the next virtio channel available
121				  (from QEMU with trans_virtio module)
122			rdma	  connect to a specified RDMA channel
123			usbg	  connect to a specified usb gadget channel
124			========  ============================================
125
126  uname=name	user name to attempt mount as on the remote server.  The
127  		server may override or ignore this value.  Certain user
128		names may require authentication.
129
130  aname=name	aname specifies the file tree to access when the server is
131  		offering several exported file systems.
132
133  cache=mode	specifies a caching policy.  By default, no caches are used.
134		The mode can be specified as a bitmask or by using one of the
135		preexisting common 'shortcuts'.
136		The bitmask is described below: (unspecified bits are reserved)
137
138			==========  ====================================================
139			0b00000000  all caches disabled, mmap disabled
140			0b00000001  file caches enabled
141			0b00000010  meta-data caches enabled
142			0b00000100  writeback behavior (as opposed to writethrough)
143			0b00001000  loose caches (no explicit consistency with server)
144			0b10000000  fscache enabled for persistent caching
145			==========  ====================================================
146
147		The current shortcuts and their associated bitmask are:
148
149			=========   ====================================================
150			none        0b00000000 (no caching)
151			readahead   0b00000001 (only read-ahead file caching)
152			mmap        0b00000101 (read-ahead + writeback file cache)
153			loose       0b00001111 (non-coherent file and meta-data caches)
154			fscache     0b10001111 (persistent loose cache)
155			=========   ====================================================
156
157		NOTE: only these shortcuts are tested modes of operation at the
158		moment, so using other combinations of bit-patterns is not
159		known to work.  Work on better cache support is in progress.
160
161		IMPORTANT: loose caches (and by extension at the moment fscache)
162		do not necessarily validate cached values on the server.  In other
163		words changes on the server are not guaranteed to be reflected
164		on the client system.  Only use this mode of operation if you
165		have an exclusive mount and the server will not modify the
166		filesystem underneath you.
167
168  debug=n	specifies debug level.  The debug level is a bitmask.
169
170			=====   ================================
171			0x01    display verbose error messages
172			0x02    developer debug (DEBUG_CURRENT)
173			0x04    display 9p trace
174			0x08    display VFS trace
175			0x10    display Marshalling debug
176			0x20    display RPC debug
177			0x40    display transport debug
178			0x80    display allocation debug
179			0x100   display protocol message debug
180			0x200   display Fid debug
181			0x400   display packet debug
182			0x800   display fscache tracing debug
183			=====   ================================
184
185  rfdno=n	the file descriptor for reading with trans=fd
186
187  wfdno=n	the file descriptor for writing with trans=fd
188
189  msize=n	the number of bytes to use for 9p packet payload
190
191  port=n	port to connect to on the remote server
192
193  noextend	force legacy mode (no 9p2000.u or 9p2000.L semantics)
194
195  version=name	Select 9P protocol version. Valid options are:
196
197			========        ==============================
198			9p2000          Legacy mode (same as noextend)
199			9p2000.u        Use 9P2000.u protocol
200			9p2000.L        Use 9P2000.L protocol
201			========        ==============================
202
203  dfltuid	attempt to mount as a particular uid
204
205  dfltgid	attempt to mount with a particular gid
206
207  afid		security channel - used by Plan 9 authentication protocols
208
209  nodevmap	do not map special files - represent them as normal files.
210  		This can be used to share devices/named pipes/sockets between
211		hosts.  This functionality will be expanded in later versions.
212
213  directio	bypass page cache on all read/write operations
214
215  ignoreqv	ignore qid.version==0 as a marker to ignore cache
216
217  noxattr	do not offer xattr functions on this mount.
218
219  access	there are four access modes.
220			user
221				if a user tries to access a file on v9fs
222			        filesystem for the first time, v9fs sends an
223			        attach command (Tattach) for that user.
224				This is the default mode.
225			<uid>
226				allows only user with uid=<uid> to access
227				the files on the mounted filesystem
228			any
229				v9fs does single attach and performs all
230				operations as one user
231			clien
232				 ACL based access check on the 9p client
233			         side for access validation
234
235  cachetag	cache tag to use the specified persistent cache.
236		cache tags for existing cache sessions can be listed at
237		/sys/fs/9p/caches. (applies only to cache=fscache)
238
239  negtimeout    the duration (in milliseconds) that negative dentries (paths
240                that do not actually exist) are retained in the cache. If
241                set to a negative value, those entries are kept indefinitely
242                until evicted by the buffer cache management system
243  ============= ===============================================================
244
245Behavior
246========
247
248This section aims at describing 9p 'quirks' that can be different
249from a local filesystem behaviors.
250
251 - Setting O_NONBLOCK on a file will make client reads return as early
252   as the server returns some data instead of trying to fill the read
253   buffer with the requested amount of bytes or end of file is reached.
254
255Resources
256=========
257
258Protocol specifications are maintained on github:
259http://ericvh.github.com/9p-rfc/
260
2619p client and server implementations are listed on
262http://9p.cat-v.org/implementations
263
264A 9p2000.L server is being developed by LLNL and can be found
265at http://code.google.com/p/diod/
266
267There are user and developer mailing lists available through the v9fs project
268on sourceforge (http://sourceforge.net/projects/v9fs).
269
270News and other information is maintained on a Wiki.
271(http://sf.net/apps/mediawiki/v9fs/index.php).
272
273Bug reports are best issued via the mailing list.
274
275For more information on the Plan 9 Operating System check out
276http://plan9.bell-labs.com/plan9
277
278For information on Plan 9 from User Space (Plan 9 applications and libraries
279ported to Linux/BSD/OSX/etc) check out https://9fans.github.io/plan9port/
280