diff options
| author | Neil Brown <neilb@suse.de> | 2011-06-01 04:57:15 -0400 |
|---|---|---|
| committer | Leann Ogasawara <leann.ogasawara@canonical.com> | 2011-08-30 13:17:34 -0400 |
| commit | 0d9f38ceaefbe456768eb9e162160cae4746c756 (patch) | |
| tree | 359f716f6bbadd546cc084b7d5435f2b4ea11d1b /Documentation/filesystems | |
| parent | 5b4152ab30cffad224f72a26b2f7bf1277d1f51c (diff) | |
UBUNTU: ubuntu: overlayfs -- overlay: overlay filesystem documentation
Document the overlay filesystem.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Andy Whitcroft <apw@canonical.com>
Diffstat (limited to 'Documentation/filesystems')
| -rw-r--r-- | Documentation/filesystems/overlayfs.txt | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/Documentation/filesystems/overlayfs.txt b/Documentation/filesystems/overlayfs.txt new file mode 100644 index 00000000000..4bc0b343398 --- /dev/null +++ b/Documentation/filesystems/overlayfs.txt | |||
| @@ -0,0 +1,167 @@ | |||
| 1 | Written by: Neil Brown <neilb@suse.de> | ||
| 2 | |||
| 3 | Overlay Filesystem | ||
| 4 | ================== | ||
| 5 | |||
| 6 | This document describes a prototype for a new approach to providing | ||
| 7 | overlay-filesystem functionality in Linux (sometimes referred to as | ||
| 8 | union-filesystems). An overlay-filesystem tries to present a | ||
| 9 | filesystem which is the result over overlaying one filesystem on top | ||
| 10 | of the other. | ||
| 11 | |||
| 12 | The result will inevitably fail to look exactly like a normal | ||
| 13 | filesystem for various technical reasons. The expectation is that | ||
| 14 | many use cases will be able to ignore these differences. | ||
| 15 | |||
| 16 | This approach is 'hybrid' because the objects that appear in the | ||
| 17 | filesystem do not all appear to belong to that filesystem. In many | ||
| 18 | cases an object accessed in the union will be indistinguishable | ||
| 19 | from accessing the corresponding object from the original filesystem. | ||
| 20 | This is most obvious from the 'st_dev' field returned by stat(2). | ||
| 21 | |||
| 22 | While directories will report an st_dev from the overlay-filesystem, | ||
| 23 | all non-directory objects will report an st_dev from the lower or | ||
| 24 | upper filesystem that is providing the object. Similarly st_ino will | ||
| 25 | only be unique when combined with st_dev, and both of these can change | ||
| 26 | over the lifetime of a non-directory object. Many applications and | ||
| 27 | tools ignore these values and will not be affected. | ||
| 28 | |||
| 29 | Upper and Lower | ||
| 30 | --------------- | ||
| 31 | |||
| 32 | An overlay filesystem combines two filesystems - an 'upper' filesystem | ||
| 33 | and a 'lower' filesystem. When a name exists in both filesystems, the | ||
| 34 | object in the 'upper' filesystem is visible while the object in the | ||
| 35 | 'lower' filesystem is either hidden or, in the case of directories, | ||
| 36 | merged with the 'upper' object. | ||
| 37 | |||
| 38 | It would be more correct to refer to an upper and lower 'directory | ||
| 39 | tree' rather than 'filesystem' as it is quite possible for both | ||
| 40 | directory trees to be in the same filesystem and there is no | ||
| 41 | requirement that the root of a filesystem be given for either upper or | ||
| 42 | lower. | ||
| 43 | |||
| 44 | The lower filesystem can be any filesystem supported by Linux and does | ||
| 45 | not need to be writable. The lower filesystem can even be another | ||
| 46 | overlayfs. The upper filesystem will normally be writable and if it | ||
| 47 | is it must support the creation of trusted.* extended attributes, and | ||
| 48 | must provide valid d_type in readdir responses, at least for symbolic | ||
| 49 | links - so NFS is not suitable. | ||
| 50 | |||
| 51 | A read-only overlay of two read-only filesystems may use any | ||
| 52 | filesystem type. | ||
| 53 | |||
| 54 | Directories | ||
| 55 | ----------- | ||
| 56 | |||
| 57 | Overlaying mainly involved directories. If a given name appears in both | ||
| 58 | upper and lower filesystems and refers to a non-directory in either, | ||
| 59 | then the lower object is hidden - the name refers only to the upper | ||
| 60 | object. | ||
| 61 | |||
| 62 | Where both upper and lower objects are directories, a merged directory | ||
| 63 | is formed. | ||
| 64 | |||
| 65 | At mount time, the two directories given as mount options are combined | ||
| 66 | into a merged directory: | ||
| 67 | |||
| 68 | mount -t overlayfs overlayfs -olowerdir=/lower,upperdir=/upper /overlay | ||
| 69 | |||
| 70 | Then whenever a lookup is requested in such a merged directory, the | ||
| 71 | lookup is performed in each actual directory and the combined result | ||
| 72 | is cached in the dentry belonging to the overlay filesystem. If both | ||
| 73 | actual lookups find directories, both are stored and a merged | ||
| 74 | directory is created, otherwise only one is stored: the upper if it | ||
| 75 | exists, else the lower. | ||
| 76 | |||
| 77 | Only the lists of names from directories are merged. Other content | ||
| 78 | such as metadata and extended attributes are reported for the upper | ||
| 79 | directory only. These attributes of the lower directory are hidden. | ||
| 80 | |||
| 81 | whiteouts and opaque directories | ||
| 82 | -------------------------------- | ||
| 83 | |||
| 84 | In order to support rm and rmdir without changing the lower | ||
| 85 | filesystem, an overlay filesystem needs to record in the upper filesystem | ||
| 86 | that files have been removed. This is done using whiteouts and opaque | ||
| 87 | directories (non-directories are always opaque). | ||
| 88 | |||
| 89 | The overlay filesystem uses extended attributes with a | ||
| 90 | "trusted.overlay." prefix to record these details. | ||
| 91 | |||
| 92 | A whiteout is created as a symbolic link with target | ||
| 93 | "(overlay-whiteout)" and with xattr "trusted.overlay.whiteout" set to "y". | ||
| 94 | When a whiteout is found in the upper level of a merged directory, any | ||
| 95 | matching name in the lower level is ignored, and the whiteout itself | ||
| 96 | is also hidden. | ||
| 97 | |||
| 98 | A directory is made opaque by setting the xattr "trusted.overlay.opaque" | ||
| 99 | to "y". Where the upper filesystem contains an opaque directory, any | ||
| 100 | directory in the lower filesystem with the same name is ignored. | ||
| 101 | |||
| 102 | readdir | ||
| 103 | ------- | ||
| 104 | |||
| 105 | When a 'readdir' request is made on a merged directory, the upper and | ||
| 106 | lower directories are each read and the name lists merged in the | ||
| 107 | obvious way (upper is read first, then lower - entries that already | ||
| 108 | exist are not re-added). This merged name list is cached in the | ||
| 109 | 'struct file' and so remains as long as the file is kept open. If the | ||
| 110 | directory is opened and read by two processes at the same time, they | ||
| 111 | will each have separate caches. A seekdir to the start of the | ||
| 112 | directory (offset 0) followed by a readdir will cause the cache to be | ||
| 113 | discarded and rebuilt. | ||
| 114 | |||
| 115 | This means that changes to the merged directory do not appear while a | ||
| 116 | directory is being read. This is unlikely to be noticed by many | ||
| 117 | programs. | ||
| 118 | |||
| 119 | seek offsets are assigned sequentially when the directories are read. | ||
| 120 | Thus if | ||
| 121 | - read part of a directory | ||
| 122 | - remember an offset, and close the directory | ||
| 123 | - re-open the directory some time later | ||
| 124 | - seek to the remembered offset | ||
| 125 | |||
| 126 | there may be little correlation between the old and new locations in | ||
| 127 | the list of filenames, particularly if anything has changed in the | ||
| 128 | directory. | ||
| 129 | |||
| 130 | Readdir on directories that are not merged is simply handled by the | ||
| 131 | underlying directory (upper or lower). | ||
| 132 | |||
| 133 | |||
| 134 | Non-directories | ||
| 135 | --------------- | ||
| 136 | |||
| 137 | Objects that are not directories (files, symlinks, device-special | ||
| 138 | files etc.) are presented either from the upper or lower filesystem as | ||
| 139 | appropriate. When a file in the lower filesystem is accessed in a way | ||
| 140 | the requires write-access, such as opening for write access, changing | ||
| 141 | some metadata etc., the file is first copied from the lower filesystem | ||
| 142 | to the upper filesystem (copy_up). Note that creating a hard-link | ||
| 143 | also requires copy_up, though of course creation of a symlink does | ||
| 144 | not. | ||
| 145 | |||
| 146 | The copy_up process first makes sure that the containing directory | ||
| 147 | exists in the upper filesystem - creating it and any parents as | ||
| 148 | necessary. It then creates the object with the same metadata (owner, | ||
| 149 | mode, mtime, symlink-target etc.) and then if the object is a file, the | ||
| 150 | data is copied from the lower to the upper filesystem. Finally any | ||
| 151 | extended attributes are copied up. | ||
| 152 | |||
| 153 | Once the copy_up is complete, the overlay filesystem simply | ||
| 154 | provides direct access to the newly created file in the upper | ||
| 155 | filesystem - future operations on the file are barely noticed by the | ||
| 156 | overlay filesystem (though an operation on the name of the file such as | ||
| 157 | rename or unlink will of course be noticed and handled). | ||
| 158 | |||
| 159 | Changes to underlying filesystems | ||
| 160 | --------------------------------- | ||
| 161 | |||
| 162 | Offline changes, when the overlay is not mounted, are allowed to either | ||
| 163 | the upper or the lower trees. | ||
| 164 | |||
| 165 | Changes to the underlying filesystems while part of a mounted overlay | ||
| 166 | filesystem are not allowed. This is not yet enforced, but will be in | ||
| 167 | the future. | ||
