blob: 250deaaa594f451ab3a4012cab85189b033bc6d2 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>V9FS &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/design-tabs.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="NuttX libraries" href="../libs/index.html" />
<link rel="prev" title="Special Files and Device Numbers" href="special_files_dev_num.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../latest" selected="selected">latest</option>
<option value="../../../10.0.0" >10.0.0</option>
<option value="../../../10.0.1" >10.0.1</option>
<option value="../../../10.1.0" >10.1.0</option>
<option value="../../../10.2.0" >10.2.0</option>
<option value="../../../10.3.0" >10.3.0</option>
<option value="../../../11.0.0" >11.0.0</option>
<option value="../../../12.0.0" >12.0.0</option>
<option value="../../../12.1.0" >12.1.0</option>
<option value="../../../12.2.0" >12.2.0</option>
<option value="../../../12.2.1" >12.2.1</option>
<option value="../../../12.3.0" >12.3.0</option>
<option value="../../../12.4.0" >12.4.0</option>
<option value="../../../12.5.0" >12.5.0</option>
<option value="../../../12.5.1" >12.5.1</option>
<option value="../../../12.6.0" >12.6.0</option>
<option value="../../../12.7.0" >12.7.0</option>
<option value="../../../12.8.0" >12.8.0</option>
<option value="../../../12.9.0" >12.9.0</option>
<option value="../../../12.10.0" >12.10.0</option>
<option value="../../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/index.html">Device Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">NuttX File System</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="index.html#virtual-file-system-vfs">Virtual File System (VFS)</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="index.html#file-systems">File systems</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="aio.html">Asynchronous I/O support</a></li>
<li class="toctree-l4"><a class="reference internal" href="binfs.html">BINFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="cromfs.html">CROMFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="fat.html">FAT</a></li>
<li class="toctree-l4"><a class="reference internal" href="hostfs.html">Host File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="littlefs.html">LITTLEFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="mmap.html">File mapping emulation (mmap)</a></li>
<li class="toctree-l4"><a class="reference internal" href="mnemofs.html">MNEMOFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nfs.html">NFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxffs.html">NXFFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="partition.html">Partition Table</a></li>
<li class="toctree-l4"><a class="reference internal" href="procfs.html">PROCFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="romfs.html">ROMFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="rpmsgfs.html">RPMSG File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="smartfs.html">SMARTFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="shmfs.html">Shared Memory File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="spiffs.html">SPIFFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="tmpfs.html">TMPFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="unionfs.html">Union File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="userfs.html">User file system</a></li>
<li class="toctree-l4"><a class="reference internal" href="zipfs.html">ZipFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="inotify.html">Inotify</a></li>
<li class="toctree-l4"><a class="reference internal" href="nuttxfs.html">Nuttx FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxflat.html">NuttX FLAT Binary Format (NXFLAT)</a></li>
<li class="toctree-l4"><a class="reference internal" href="pseudofs.html">Pseudo File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="special_files_dev_num.html">Special Files and Device Numbers</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">V9FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="#adding-v9fs-to-the-nuttx-configuration">Adding V9FS to the NuttX Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="#nfs-mount-command">NFS Mount Command</a><ul>
<li class="toctree-l5"><a class="reference internal" href="#qemu-virtio">Qemu + VIRTIO</a></li>
<li class="toctree-l5"><a class="reference internal" href="#socket">Socket</a></li>
<li class="toctree-l5"><a class="reference internal" href="#result">Result</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="index.html#fs-categories">FS Categories</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../debugging/index.html">Debugging</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../_tags/tagsindex.html">Tags</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">OS Components</a></li>
<li class="breadcrumb-item"><a href="index.html">NuttX File System</a></li>
<li class="breadcrumb-item active">V9FS</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/components/filesystem/v9fs.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="v9fs">
<h1>V9FS<a class="headerlink" href="#v9fs" title="Permalink to this heading"></a></h1>
<p>V9FS is a remote file system based on the 9P2000.L protocol.</p>
</section>
<section id="adding-v9fs-to-the-nuttx-configuration">
<h1>Adding V9FS to the NuttX Configuration<a class="headerlink" href="#adding-v9fs-to-the-nuttx-configuration" title="Permalink to this heading"></a></h1>
<p>The V9FS client is easy to add to your configuration. Just add
<code class="docutils literal notranslate"><span class="pre">CONFIG_FS_V9FS</span></code> to <code class="docutils literal notranslate"><span class="pre">nuttx/.config</span></code>.</p>
<p>In order to fully run V9FS, you also need to select a transport layer
driver. The two currently available are:</p>
<blockquote>
<div><ul class="simple">
<li><p><strong>VIRTIO</strong> -&gt; <code class="docutils literal notranslate"><span class="pre">CONFIG_V9FS_VIRTIO_9P=y</span></code></p></li>
<li><p><strong>SOCKET</strong> -&gt; <code class="docutils literal notranslate"><span class="pre">CONFIG_V9FS_SOCKET_9P=y</span></code></p></li>
</ul>
</div></blockquote>
</section>
<section id="nfs-mount-command">
<h1>NFS Mount Command<a class="headerlink" href="#nfs-mount-command" title="Permalink to this heading"></a></h1>
<p>In V9FS, we have some special parameters</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">uname</span></code>. Used to indicate the user identity of the client</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">aname</span></code>. Optional, it specifies the file tree that the client requests to access</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">trans</span></code>. Selects the transport layer (virtio/socket)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">msize</span></code>. The maximum size of the message</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">tag</span></code>. The tag of the mount point</p></li>
</ul>
</div></blockquote>
<p>Different transport layers have different requirements for parameter
passing. Here are some examples:</p>
<section id="qemu-virtio">
<h2>Qemu + VIRTIO<a class="headerlink" href="#qemu-virtio" title="Permalink to this heading"></a></h2>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">mount -t v9fs -o trans=virtio,tag=&lt;mount_tag&gt; /dir</span>
</pre></div>
</div>
<p>Similarly, we need to bring the corresponding parameters in qemu</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">-fsdev local,security_model=none,id=fsdev1,path=&lt;share-path&gt; \</span>
<span class="go">-device virtio-9p-device,id=fs1,fsdev=fsdev1,mount_tag=&lt;mount_tag&gt;</span>
</pre></div>
</div>
<p>For how to start virtio-9p in QEMU, please refer to the document:</p>
<blockquote>
<div><ul class="simple">
<li><p><a class="reference external" href="https://wiki.qemu.org/Documentation/9psetup">https://wiki.qemu.org/Documentation/9psetup</a></p></li>
</ul>
</div></blockquote>
</section>
<section id="socket">
<h2>Socket<a class="headerlink" href="#socket" title="Permalink to this heading"></a></h2>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">mount -t v9fs -o trans=socket,tag=&lt;IP Address&gt;:[Port Default 563],aname=[path] /dir</span>
</pre></div>
</div>
<p>There are many types of 9P socket servers. Here we use R9-fileserver
(a cross-platform 9p server based on Rust
<a class="reference external" href="https://github.com/crafcat7/R9-fileserver">https://github.com/crafcat7/R9-fileserver</a>)</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">sudo ./ya-vm-file-server --network-address &lt;IP Address&gt;:&lt;Server Port&gt; --mount-point &lt;share-path&gt;</span>
</pre></div>
</div>
</section>
<section id="result">
<h2>Result<a class="headerlink" href="#result" title="Permalink to this heading"></a></h2>
<div class="highlight-fish notranslate"><div class="highlight"><pre><span></span>NuttShell <span class="o">(</span>NSH<span class="o">)</span>
nsh&gt; mkdir mnt
nsh&gt;
nsh&gt; ls mnt
/mnt:
nsh&gt; mount -t v9fs -o <span class="nv">trans</span><span class="o">=</span>virtio,tag<span class="o">=</span>hostshare /mnt/v9fs
nsh&gt;
nsh&gt; ls /mnt/v9fs
/mnt/v9fs:
sdcard/
mnt/
nsh&gt;
nsh&gt; <span class="k">echo</span> <span class="s2">&quot;This is a test&quot;</span> <span class="o">&gt;</span>/mnt/v9fs/testfile.txt
nsh&gt; ls -l /mnt/v9fs
/mnt/v9fs:
drwxrwxrwx <span class="m">1000</span> <span class="m">1000</span> <span class="m">4096</span> sdcard/
-rw-rw-rw- <span class="m">1000</span> <span class="m">1000</span> <span class="m">15</span> testfile.txt
drwxrwxrwx <span class="m">1000</span> <span class="m">1000</span> <span class="m">4096</span> mnt/
nsh&gt;
nsh&gt; cat /mnt/v9fs/testfile.txt
This is a <span class="k">test</span>
nsh&gt;
</pre></div>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="special_files_dev_num.html" class="btn btn-neutral float-left" title="Special Files and Device Numbers" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="../libs/index.html" class="btn btn-neutral float-right" title="NuttX libraries" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>