~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/filesystems/squashfs.rst

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0
  2 
  3 =======================
  4 Squashfs 4.0 Filesystem
  5 =======================
  6 
  7 Squashfs is a compressed read-only filesystem for Linux.
  8 
  9 It uses zlib, lz4, lzo, or xz compression to compress files, inodes and
 10 directories.  Inodes in the system are very small and all blocks are packed to
 11 minimise data overhead. Block sizes greater than 4K are supported up to a
 12 maximum of 1Mbytes (default block size 128K).
 13 
 14 Squashfs is intended for general read-only filesystem use, for archival
 15 use (i.e. in cases where a .tar.gz file may be used), and in constrained
 16 block device/memory systems (e.g. embedded systems) where low overhead is
 17 needed.
 18 
 19 Mailing list: squashfs-devel@lists.sourceforge.net
 20 Web site: www.squashfs.org
 21 
 22 1. Filesystem Features
 23 ----------------------
 24 
 25 Squashfs filesystem features versus Cramfs:
 26 
 27 ==============================  =========               ==========
 28                                 Squashfs                Cramfs
 29 ==============================  =========               ==========
 30 Max filesystem size             2^64                    256 MiB
 31 Max file size                   ~ 2 TiB                 16 MiB
 32 Max files                       unlimited               unlimited
 33 Max directories                 unlimited               unlimited
 34 Max entries per directory       unlimited               unlimited
 35 Max block size                  1 MiB                   4 KiB
 36 Metadata compression            yes                     no
 37 Directory indexes               yes                     no
 38 Sparse file support             yes                     no
 39 Tail-end packing (fragments)    yes                     no
 40 Exportable (NFS etc.)           yes                     no
 41 Hard link support               yes                     no
 42 "." and ".." in readdir         yes                     no
 43 Real inode numbers              yes                     no
 44 32-bit uids/gids                yes                     no
 45 File creation time              yes                     no
 46 Xattr support                   yes                     no
 47 ACL support                     no                      no
 48 ==============================  =========               ==========
 49 
 50 Squashfs compresses data, inodes and directories.  In addition, inode and
 51 directory data are highly compacted, and packed on byte boundaries.  Each
 52 compressed inode is on average 8 bytes in length (the exact length varies on
 53 file type, i.e. regular file, directory, symbolic link, and block/char device
 54 inodes have different sizes).
 55 
 56 2. Using Squashfs
 57 -----------------
 58 
 59 As squashfs is a read-only filesystem, the mksquashfs program must be used to
 60 create populated squashfs filesystems.  This and other squashfs utilities
 61 can be obtained from http://www.squashfs.org.  Usage instructions can be
 62 obtained from this site also.
 63 
 64 The squashfs-tools development tree is now located on kernel.org
 65         git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git
 66 
 67 2.1 Mount options
 68 -----------------
 69 ===================    =========================================================
 70 errors=%s              Specify whether squashfs errors trigger a kernel panic
 71                        or not
 72 
 73                        ==========  =============================================
 74                          continue  errors don't trigger a panic (default)
 75                             panic  trigger a panic when errors are encountered,
 76                                    similar to several other filesystems (e.g.
 77                                    btrfs, ext4, f2fs, GFS2, jfs, ntfs, ubifs)
 78 
 79                                    This allows a kernel dump to be saved,
 80                                    useful for analyzing and debugging the
 81                                    corruption.
 82                        ==========  =============================================
 83 threads=%s             Select the decompression mode or the number of threads
 84 
 85                        If SQUASHFS_CHOICE_DECOMP_BY_MOUNT is set:
 86 
 87                        ==========  =============================================
 88                            single  use single-threaded decompression (default)
 89 
 90                                    Only one block (data or metadata) can be
 91                                    decompressed at any one time. This limits
 92                                    CPU and memory usage to a minimum, but it
 93                                    also gives poor performance on parallel I/O
 94                                    workloads when using multiple CPU machines
 95                                    due to waiting on decompressor availability.
 96                             multi  use up to two parallel decompressors per core
 97 
 98                                    If you have a parallel I/O workload and your
 99                                    system has enough memory, using this option
100                                    may improve overall I/O performance. It
101                                    dynamically allocates decompressors on a
102                                    demand basis.
103                            percpu  use a maximum of one decompressor per core
104 
105                                    It uses percpu variables to ensure
106                                    decompression is load-balanced across the
107                                    cores.
108                         1|2|3|...  configure the number of threads used for
109                                    decompression
110 
111                                    The upper limit is num_online_cpus() * 2.
112                        ==========  =============================================
113 
114                        If SQUASHFS_CHOICE_DECOMP_BY_MOUNT is **not** set and
115                        SQUASHFS_DECOMP_MULTI, SQUASHFS_MOUNT_DECOMP_THREADS are
116                        both set:
117 
118                        ==========  =============================================
119                           2|3|...  configure the number of threads used for
120                                    decompression
121 
122                                    The upper limit is num_online_cpus() * 2.
123                        ==========  =============================================
124 
125 ===================    =========================================================
126 
127 3. Squashfs Filesystem Design
128 -----------------------------
129 
130 A squashfs filesystem consists of a maximum of nine parts, packed together on a
131 byte alignment::
132 
133          ---------------
134         |  superblock   |
135         |---------------|
136         |  compression  |
137         |    options    |
138         |---------------|
139         |  datablocks   |
140         |  & fragments  |
141         |---------------|
142         |  inode table  |
143         |---------------|
144         |   directory   |
145         |     table     |
146         |---------------|
147         |   fragment    |
148         |    table      |
149         |---------------|
150         |    export     |
151         |    table      |
152         |---------------|
153         |    uid/gid    |
154         |  lookup table |
155         |---------------|
156         |     xattr     |
157         |     table     |
158          ---------------
159 
160 Compressed data blocks are written to the filesystem as files are read from
161 the source directory, and checked for duplicates.  Once all file data has been
162 written the completed inode, directory, fragment, export, uid/gid lookup and
163 xattr tables are written.
164 
165 3.1 Compression options
166 -----------------------
167 
168 Compressors can optionally support compression specific options (e.g.
169 dictionary size).  If non-default compression options have been used, then
170 these are stored here.
171 
172 3.2 Inodes
173 ----------
174 
175 Metadata (inodes and directories) are compressed in 8Kbyte blocks.  Each
176 compressed block is prefixed by a two byte length, the top bit is set if the
177 block is uncompressed.  A block will be uncompressed if the -noI option is set,
178 or if the compressed block was larger than the uncompressed block.
179 
180 Inodes are packed into the metadata blocks, and are not aligned to block
181 boundaries, therefore inodes overlap compressed blocks.  Inodes are identified
182 by a 48-bit number which encodes the location of the compressed metadata block
183 containing the inode, and the byte offset into that block where the inode is
184 placed (<block, offset>).
185 
186 To maximise compression there are different inodes for each file type
187 (regular file, directory, device, etc.), the inode contents and length
188 varying with the type.
189 
190 To further maximise compression, two types of regular file inode and
191 directory inode are defined: inodes optimised for frequently occurring
192 regular files and directories, and extended types where extra
193 information has to be stored.
194 
195 3.3 Directories
196 ---------------
197 
198 Like inodes, directories are packed into compressed metadata blocks, stored
199 in a directory table.  Directories are accessed using the start address of
200 the metablock containing the directory and the offset into the
201 decompressed block (<block, offset>).
202 
203 Directories are organised in a slightly complex way, and are not simply
204 a list of file names.  The organisation takes advantage of the
205 fact that (in most cases) the inodes of the files will be in the same
206 compressed metadata block, and therefore, can share the start block.
207 Directories are therefore organised in a two level list, a directory
208 header containing the shared start block value, and a sequence of directory
209 entries, each of which share the shared start block.  A new directory header
210 is written once/if the inode start block changes.  The directory
211 header/directory entry list is repeated as many times as necessary.
212 
213 Directories are sorted, and can contain a directory index to speed up
214 file lookup.  Directory indexes store one entry per metablock, each entry
215 storing the index/filename mapping to the first directory header
216 in each metadata block.  Directories are sorted in alphabetical order,
217 and at lookup the index is scanned linearly looking for the first filename
218 alphabetically larger than the filename being looked up.  At this point the
219 location of the metadata block the filename is in has been found.
220 The general idea of the index is to ensure only one metadata block needs to be
221 decompressed to do a lookup irrespective of the length of the directory.
222 This scheme has the advantage that it doesn't require extra memory overhead
223 and doesn't require much extra storage on disk.
224 
225 3.4 File data
226 -------------
227 
228 Regular files consist of a sequence of contiguous compressed blocks, and/or a
229 compressed fragment block (tail-end packed block).   The compressed size
230 of each datablock is stored in a block list contained within the
231 file inode.
232 
233 To speed up access to datablocks when reading 'large' files (256 Mbytes or
234 larger), the code implements an index cache that caches the mapping from
235 block index to datablock location on disk.
236 
237 The index cache allows Squashfs to handle large files (up to 1.75 TiB) while
238 retaining a simple and space-efficient block list on disk.  The cache
239 is split into slots, caching up to eight 224 GiB files (128 KiB blocks).
240 Larger files use multiple slots, with 1.75 TiB files using all 8 slots.
241 The index cache is designed to be memory efficient, and by default uses
242 16 KiB.
243 
244 3.5 Fragment lookup table
245 -------------------------
246 
247 Regular files can contain a fragment index which is mapped to a fragment
248 location on disk and compressed size using a fragment lookup table.  This
249 fragment lookup table is itself stored compressed into metadata blocks.
250 A second index table is used to locate these.  This second index table for
251 speed of access (and because it is small) is read at mount time and cached
252 in memory.
253 
254 3.6 Uid/gid lookup table
255 ------------------------
256 
257 For space efficiency regular files store uid and gid indexes, which are
258 converted to 32-bit uids/gids using an id look up table.  This table is
259 stored compressed into metadata blocks.  A second index table is used to
260 locate these.  This second index table for speed of access (and because it
261 is small) is read at mount time and cached in memory.
262 
263 3.7 Export table
264 ----------------
265 
266 To enable Squashfs filesystems to be exportable (via NFS etc.) filesystems
267 can optionally (disabled with the -no-exports Mksquashfs option) contain
268 an inode number to inode disk location lookup table.  This is required to
269 enable Squashfs to map inode numbers passed in filehandles to the inode
270 location on disk, which is necessary when the export code reinstantiates
271 expired/flushed inodes.
272 
273 This table is stored compressed into metadata blocks.  A second index table is
274 used to locate these.  This second index table for speed of access (and because
275 it is small) is read at mount time and cached in memory.
276 
277 3.8 Xattr table
278 ---------------
279 
280 The xattr table contains extended attributes for each inode.  The xattrs
281 for each inode are stored in a list, each list entry containing a type,
282 name and value field.  The type field encodes the xattr prefix
283 ("user.", "trusted." etc) and it also encodes how the name/value fields
284 should be interpreted.  Currently the type indicates whether the value
285 is stored inline (in which case the value field contains the xattr value),
286 or if it is stored out of line (in which case the value field stores a
287 reference to where the actual value is stored).  This allows large values
288 to be stored out of line improving scanning and lookup performance and it
289 also allows values to be de-duplicated, the value being stored once, and
290 all other occurrences holding an out of line reference to that value.
291 
292 The xattr lists are packed into compressed 8K metadata blocks.
293 To reduce overhead in inodes, rather than storing the on-disk
294 location of the xattr list inside each inode, a 32-bit xattr id
295 is stored.  This xattr id is mapped into the location of the xattr
296 list using a second xattr id lookup table.
297 
298 4. TODOs and Outstanding Issues
299 -------------------------------
300 
301 4.1 TODO list
302 -------------
303 
304 Implement ACL support.
305 
306 4.2 Squashfs Internal Cache
307 ---------------------------
308 
309 Blocks in Squashfs are compressed.  To avoid repeatedly decompressing
310 recently accessed data Squashfs uses two small metadata and fragment caches.
311 
312 The cache is not used for file datablocks, these are decompressed and cached in
313 the page-cache in the normal way.  The cache is used to temporarily cache
314 fragment and metadata blocks which have been read as a result of a metadata
315 (i.e. inode or directory) or fragment access.  Because metadata and fragments
316 are packed together into blocks (to gain greater compression) the read of a
317 particular piece of metadata or fragment will retrieve other metadata/fragments
318 which have been packed with it, these because of locality-of-reference may be
319 read in the near future. Temporarily caching them ensures they are available
320 for near future access without requiring an additional read and decompress.
321 
322 In the future this internal cache may be replaced with an implementation which
323 uses the kernel page cache.  Because the page cache operates on page sized
324 units this may introduce additional complexity in terms of locking and
325 associated race conditions.

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php