blob: 4b055fa26b9dd27fc1090acefe160af8c1a36edb [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>Union File System &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/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/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="User file system" href="userfs.html" />
<link rel="prev" title="TMPFS" href="tmpfs.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 current"><a class="current reference internal" href="#">Union File System</a><ul>
<li class="toctree-l5"><a class="reference internal" href="#overview">Overview</a></li>
<li class="toctree-l5"><a class="reference internal" href="#uses-of-the-union-file-system">Uses of the Union File System</a></li>
<li class="toctree-l5"><a class="reference internal" href="#prefixes">Prefixes</a></li>
<li class="toctree-l5"><a class="reference internal" href="#example-configurations">Example Configurations</a></li>
</ul>
</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"><a class="reference internal" href="v9fs.html">V9FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html#adding-v9fs-to-the-nuttx-configuration">Adding V9FS to the NuttX Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html#nfs-mount-command">NFS Mount Command</a></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="../../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>
</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">Union File System</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/components/filesystem/unionfs.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="union-file-system">
<h1>Union File System<a class="headerlink" href="#union-file-system" title="Permalink to this heading"></a></h1>
<section id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading"></a></h2>
<p>This directory contains the NuttX Union File System. The Union file
system is provides a mechanism to overlay two different, mounted file
systems so that they appear as one. In general this works like this:</p>
<blockquote>
<div><ol class="arabic simple">
<li><p>Mount file system 1 at some location, say <code class="docutils literal notranslate"><span class="pre">/mnt/file1</span></code></p></li>
<li><p>Mount file system 2 at some location, say <code class="docutils literal notranslate"><span class="pre">/mnt/file2</span></code></p></li>
<li><p>Call <code class="docutils literal notranslate"><span class="pre">mount()</span></code> to combine and overly <code class="docutils literal notranslate"><span class="pre">/mnt/file1</span></code> and <code class="docutils literal notranslate"><span class="pre">mnt/file2</span></code>
as a new mount point, say <code class="docutils literal notranslate"><span class="pre">/mnt/unionfs</span></code>.</p></li>
</ol>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">/mnt/file1</span></code> and <code class="docutils literal notranslate"><span class="pre">/mnt/file2</span></code> will disappear and be replaced by the single
mountpoint <code class="docutils literal notranslate"><span class="pre">/mnt/unionfs</span></code>. The previous contents under <code class="docutils literal notranslate"><span class="pre">/mnt/file1</span></code> and
<code class="docutils literal notranslate"><span class="pre">/mnt/file2</span></code> will appear merged under <code class="docutils literal notranslate"><span class="pre">/mnt/unionfs</span></code>. Files at the same
relative path in file system1 will take presence. If another file of the
same name and same relative location exists in file system 2, it will
not be visible because it will be occluded by the file in file system1.</p>
<p>See <code class="docutils literal notranslate"><span class="pre">include/nutts/unionfs.h</span></code> for additional information.</p>
<p>The Union File System is enabled by selecting the <code class="docutils literal notranslate"><span class="pre">CONFIG_FS_UNIONFS</span></code> option
in the NuttX configuration file.</p>
<p>Disclaimer: This Union File System was certainly inspired by UnionFS
(<a class="reference external" href="http://en.wikipedia.org/wiki/UnionFS">http://en.wikipedia.org/wiki/UnionFS</a>) and the similarity in naming is
unavoidable. However, other than that, the NuttX Union File System
has no relationship with the UnioinFS project in specification, usage,
design, or implementation.</p>
</section>
<section id="uses-of-the-union-file-system">
<h2>Uses of the Union File System<a class="headerlink" href="#uses-of-the-union-file-system" title="Permalink to this heading"></a></h2>
<p>The original motivation for this file was for the use of the built-in
function file system (BINFS) with a web server. In that case, the built
in functions provide CGI programs. But the BINFS file system cannot hold
content. Fixed content would need to be retained in a more standard file
system such as ROMFS. With this Union File System, you can overly the
BINFS mountpoint on the ROMFS mountpoint, providing a single directory
that appears to contain the executables from the BINFS file system along
with the web content from the ROMFS file system.</p>
<p>Another possible use for the Union File System could be to augment or
replace files in a FLASH file system. For example, suppose that you have
a product that ships with content in a ROMFS file system provided by the
on-board FLASH. Later, you overlay that ROMFS file system with additional
files from an SD card by using the Union File System to overlay, and
perhaps replace, the ROMFS files.</p>
<p>Another use case might be to overlay a read-only file system like ROMFS
with a writable file system (like a RAM disk). This should then give
to a readable/write-able file system with some fixed content.</p>
</section>
<section id="prefixes">
<h2>Prefixes<a class="headerlink" href="#prefixes" title="Permalink to this heading"></a></h2>
<p>And optional prefix may be provided with each of the file systems
combined in by the Union File System. For example, suppose that:</p>
<ul class="simple">
<li><p>File system 1 is a ROMFS file system with prefix == NULL,</p></li>
<li><p>File system 2 is a BINFS file system with prefix == “cgin-bin”, and</p></li>
<li><p>The union file system is mounted at <code class="docutils literal notranslate"><span class="pre">/mnt/www</span></code>.</p></li>
</ul>
<p>Then the content in the in the ROMFS file system would appear at
<code class="docutils literal notranslate"><span class="pre">/mnt/www</span></code> and the content of the BINFS file system would appear at
<code class="docutils literal notranslate"><span class="pre">/mnt/www/cgi-gin</span></code>.</p>
</section>
<section id="example-configurations">
<h2>Example Configurations<a class="headerlink" href="#example-configurations" title="Permalink to this heading"></a></h2>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">boards/sim/sim/sim/unionfs</span></code> - This is a simulator configuration that
uses the Union File System test at apps/examples/unionfs. That test
overlays two small ROMFS file systems with many conflicts in
directories and file names. This is a good platform for testing the
Union file System and apps/examples/unionfs is a good example of how to
configure the Union File System.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">boards/arm/lpc17xx_40xx/lincoln60/thttpd-binfs</span></code> - This is an example
using the THTTPD web server. It server up content from a Union File
System with fixed content provided by a ROMFS file system and CGI
content provided by a BINFS file system.</p>
<p>You can see how the Union File System content directory is configured
by logic in apps/example/thttpd/.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">boards/arm/lpc17xx_40xx/olimex-lpc1766stk/thttpd-binfs</span></code> - This is
essentially the same as the lincoln60 configuration. It does not work,
however, because the LPC1766 has insufficient RAM to support the THTTPD
application in this configuration.</p></li>
</ul>
<p>See the documentation pages for each of these board for additional
information about these configurations.</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="tmpfs.html" class="btn btn-neutral float-left" title="TMPFS" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="userfs.html" class="btn btn-neutral float-right" title="User file system" 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>