This answer and email message indicate that something called "OverlayFS" is available in Ubuntu 11.10 and will forcefully replace aufs in Ubuntu 12.04.
How do I use it? Where is its documentation?
This answer and email message indicate that something called "OverlayFS" is available in Ubuntu 11.10 and will forcefully replace aufs in Ubuntu 12.04.
How do I use it? Where is its documentation?
Edit: Since writing this answer, some things have changed in overlayfs, namely the addition of a required parameter
workdir
, see totti's answer below for a detailed description of this new parameter.I finally managed to find it. I found references to it in the kernel source, but for some reason it doesn't appear in the git tree on kernel.org. But! If you pull the Ubuntu kernel source like this:
apt-get source linux-image-3.0.0-16-generic
you can find it inlinux-3.0.0/Documentation/overlayfs.txt
. It is also available in the linux-doc package in/usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz
.As the actual help documentation is more of a "how it works" instead of a "how to mount with it," here's a brief rundown (there is one example in the kernel documentation):
Where [mount options] can be:
One thing that confused me at first, so I should probably clarify, is that mounting an overlayfs does not actually mount a filesystem. I was trying to mount a squashfs filesystem using an overlayfs mount, but that's not how it works. You must first mount the (in my case squashfs) filesystem to an arbitrary directory, then use overlayfs to merge the mount point (a directory) and another directory onto a tertiary directory (the overlayfs mount point)(edit: this "tertiary" directory can actually be the upperdir= directory). The tertiary directory is where you will see the merged filesystems (or directory trees - it's flexible).
Example 1, overlaying the root filesystem
I've been working on an Ubuntu hybrid boot disk where the base Ubuntu system exists as filesystem.squashfs and I have files called ubuntu.overlay kubuntu.overlay xubuntu.overlay and lubuntu.overlay. The .overlay files are base installs of said systems with the contents of filesystem.squashfs pruned (to save space). Then I modified the init scripts to overlay the correct distro's .overlay file (from a boot parameter) using overlayfs and the above options and it works like a charm!
These are the lines that I used in my init scripts (once all variables are translated):
Note that filesystem.squashfs above is a directory created by casper, not a file.
These three statements create an
/overlay
directory, mount a squashfs filesystem on the/overlay
directory and then use OverlayFS to essentially merge the contents of/overlay
over/
.Example 2, transparent merging of two directories
In the process of re-building my live USB for each release, I use OverlayFS to save a bunch of time. I start off with a directory called ubuntu-base which contains the contents of the ubuntu-core image which is the most basic install. I will then create directories called ubuntu, kubuntu, lubuntu, and xubuntu.
Then, I use OverlayFS to make the files from the ubuntu-base show up in the individual directories. I would use something like this:
This makes the files from ubuntu-base show up in the kubuntu folder. Then, I can
chroot
to the kubuntu folder and do something likeapt-get install kubuntu-desktop
. Any changes that are made while in this OverlayFS mount will remain in the upper directory, in this case the kubuntu folder. Then, once I unmount the OverlayFS mount the files that really exist in ubuntu-base but are "mirrored" into the kubuntu folder vanish unless they have been changed. This keeps me from having to have multiple copies of the files in ubuntu-base while still being able to use them as if they physically exist in each location.From https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt:
I have extended these artikels to include a Script for overlayfs that sets up a read-only root fs.
Hope it helps.
Minimal runnable example
GitHub upstream.
Output of the first
ls
with the mount:Output of the second
ls
without the mount:Interpretation:
work/
directory) we should not care aboutExample adapted from: Example OverlayFS Usage
Here is a more complex example with multiple lower layers: Overlayfs reload with multiple layers (migration away from aufs)
Tested on Ubuntu 18.04, Linux kernel 4.15.0.
Mounting OverlayFS in fstab
Above answers have explained how to mount overlay filesystem from cmd line and/or script. It is also possible to mount OverlayFS from fstab.
There is inherent problem with mounting OverlayFS. Since we mount directories, those directories must be present and/or ready. Present means that filesystem on which particular directory is located is already mounted, while ready means that particular directory is "populated". Example of later is mounting of ISO image to particular directory, or mounting network share (of any type).
Mounting directory which is not present, will fail, while mounting not yet "populated" directory will not fail, since OverlayFS has no way to know, if directory is ready.
When mounting filesystems from fstab, that is particularly a problem, since all mounting is done in parallel, thus we can not ensure that everything is prepared for OverlayFS.
However, if Linux distribution uses systemd, than mounting of filesystems is handled by it. Systemd reads fstab file, and creates mount units on the fly. After that all mounting is processed by systemd. Systemd unit files have options: require, after, before, which can be used to control the order and dependency of mounts defined in fstab, thus ensuring that mounting of OverlayFS will not fail (at least not, because of wrong order).
To set order/dependency of mounts in fstab file, we will declare systemd option "require" using syntax: x-systemd.require. Argument for this option is mount point of the mount which should be successfully mounted before given mount (defined in fstab).
Example:
To show an example (and syntax of fstab entries), we will show case, where we will overlay directory on which iso image is mounted, while this particular image file will be stored on separate hdd, which will have to be mounted before we access image file. Thus forming required ordered of events:
For given case fstab entries would look like:
If any mounts in chain fail, dependent one(s) will not be executed.
Note:
On Arch Linux Wiki there is example of using fstab to mount OverlayFS in which following options are used:
This will have effect, that overlay filesystem will be simply not mounted at boot time (noauto option), avoiding possible failure if previous mounts are not ready. On first access to overlay directory, the filesystem will be mounted (x-systemd.automount option). This approach has two weaknesses:
We can avoid later, by adding x-systemd.require to the options list.