summaryrefslogtreecommitdiffstats
path: root/USAGE-MKSQUASHFS-4.6
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 17:23:08 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 17:23:08 +0000
commitdd76e45c20acc3f352ffe8257208cc617ba33eba (patch)
treec50c016a4182a27fd1ece9ec7ba4abf405f19e5f /USAGE-MKSQUASHFS-4.6
parentInitial commit. (diff)
downloadsquashfs-tools-dd76e45c20acc3f352ffe8257208cc617ba33eba.tar.xz
squashfs-tools-dd76e45c20acc3f352ffe8257208cc617ba33eba.zip
Adding upstream version 1:4.6.1.upstream/1%4.6.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'USAGE-MKSQUASHFS-4.6')
-rw-r--r--USAGE-MKSQUASHFS-4.61069
1 files changed, 1069 insertions, 0 deletions
diff --git a/USAGE-MKSQUASHFS-4.6 b/USAGE-MKSQUASHFS-4.6
new file mode 100644
index 0000000..37dab44
--- /dev/null
+++ b/USAGE-MKSQUASHFS-4.6
@@ -0,0 +1,1069 @@
+ MKSQUASHFS - a tool to create Squashfs filesystems
+
+As Squashfs is a read-only filesystem, the Mksquashfs program must be used to
+create populated squashfs filesystems.
+
+SYNTAX:mksquashfs source1 source2 ... FILESYSTEM [OPTIONS] [-e list of
+exclude dirs/files]
+
+Filesystem compression options:
+-b <block_size> set data block to <block_size>. Default 128 Kbytes.
+ Optionally a suffix of K or M can be given to specify
+ Kbytes or Mbytes respectively
+-comp <comp> select <comp> compression
+ Compressors available:
+ gzip (default)
+ lzo
+ lz4
+ xz
+ zstd
+-noI do not compress inode table
+-noId do not compress the uid/gid table (implied by -noI)
+-noD do not compress data blocks
+-noF do not compress fragment blocks
+-noX do not compress extended attributes
+-no-compression do not compress any of the data or metadata. This is
+ equivalent to specifying -noI -noD -noF and -noX
+
+Filesystem build options:
+-tar read uncompressed tar file from standard in (stdin)
+-no-strip act like tar, and do not strip leading directories
+ from source files
+-tarstyle alternative name for -no-strip
+-cpiostyle act like cpio, and read file pathnames from standard in
+ (stdin)
+-cpiostyle0 like -cpiostyle, but filenames are null terminated. Can
+ be used with find -print0 action
+-reproducible build filesystems that are reproducible (default)
+-not-reproducible build filesystems that are not reproducible
+-mkfs-time <time> set filesystem creation timestamp to <time>. <time> can
+ be an unsigned 32-bit int indicating seconds since the
+ epoch (1970-01-01) or a string value which is passed to
+ the "date" command to parse. Any string value which the
+ date command recognises can be used such as "now",
+ "last week", or "Wed Feb 15 21:02:39 GMT 2023"
+-all-time <time> set all file timestamps to <time>. <time> can be an
+ unsigned 32-bit int indicating seconds since the epoch
+ (1970-01-01) or a string value which is passed to the
+ "date" command to parse. Any string value which the date
+ command recognises can be used such as "now", "last
+ week", or "Wed Feb 15 21:02:39 GMT 2023"
+-root-time <time> set root directory time to <time>. <time> can be an
+ unsigned 32-bit int indicating seconds since the epoch
+ (1970-01-01) or a string value which is passed to the
+ "date" command to parse. Any string value which the date
+ command recognises can be used such as "now", "last
+ week", or "Wed Feb 15 21:02:39 GMT 2023"
+-root-mode <mode> set root directory permissions to octal <mode>
+-root-uid <value> set root directory owner to specified <value>,
+ <value> can be either an integer uid or user name
+-root-gid <value> set root directory group to specified <value>,
+ <value> can be either an integer gid or group name
+-all-root make all files owned by root
+-force-uid <value> set all file uids to specified <value>, <value> can be
+ either an integer uid or user name
+-force-gid <value> set all file gids to specified <value>, <value> can be
+ either an integer gid or group name
+-pseudo-override make pseudo file uids and gids override -all-root,
+ -force-uid and -force-gid options
+-no-exports do not make filesystem exportable via NFS (-tar default)
+-exports make filesystem exportable via NFS (default)
+-no-sparse do not detect sparse files
+-no-tailends do not pack tail ends into fragments (default)
+-tailends pack tail ends into fragments
+-no-fragments do not use fragments
+-no-duplicates do not perform duplicate checking
+-no-hardlinks do not hardlink files, instead store duplicates
+-keep-as-directory if one source directory is specified, create a root
+ directory containing that directory, rather than the
+ contents of the directory
+
+Filesystem filter options:
+-p <pseudo-definition> add pseudo file definition. The definition should
+ be quoted
+-pf <pseudo-file> add list of pseudo file definitions from <pseudo-file>,
+ use - for stdin. Pseudo file definitions should not be
+ quoted
+-sort <sort_file> sort files according to priorities in <sort_file>. One
+ file or dir with priority per line. Priority -32768 to
+ 32767, default priority 0
+-ef <exclude_file> list of exclude dirs/files. One per line
+-wildcards allow extended shell wildcards (globbing) to be used in
+ exclude dirs/files
+-regex allow POSIX regular expressions to be used in exclude
+ dirs/files
+-max-depth <levels> descend at most <levels> of directories when scanning
+ filesystem
+-one-file-system do not cross filesystem boundaries. If a directory
+ crosses the boundary, create an empty directory for
+ each mount point. If a file crosses the boundary
+ ignore it
+-one-file-system-x do not cross filesystem boundaries. Like
+ -one-file-system option except directories are also
+ ignored if they cross the boundary
+
+Filesystem extended attribute (xattrs) options:
+-no-xattrs do not store extended attributes
+-xattrs store extended attributes (default)
+-xattrs-exclude <regex> exclude any xattr names matching <regex>. <regex> is a
+ POSIX regular expression, e.g. -xattrs-exclude '^user.'
+ excludes xattrs from the user namespace
+-xattrs-include <regex> include any xattr names matching <regex>. <regex> is a
+ POSIX regular expression, e.g. -xattrs-include '^user.'
+ includes xattrs from the user namespace
+-xattrs-add <name=val> add the xattr <name> with <val> to files. If an
+ user xattr it will be added to regular files and
+ directories (see man 7 xattr). Otherwise it will be
+ added to all files. <val> by default will be treated as
+ binary (i.e. an uninterpreted byte sequence), but it can
+ be prefixed with 0s, where it will be treated as base64
+ encoded, or prefixed with 0x, where val will be treated
+ as hexidecimal. Additionally it can be prefixed with
+ 0t where this encoding is similar to binary encoding,
+ except backslashes are specially treated, and a
+ backslash followed by 3 octal digits can be used to
+ encode any ASCII character, which obviously can be used
+ to encode control codes. The option can be repeated
+ multiple times to add multiple xattrs
+
+Mksquashfs runtime options:
+-version print version, licence and copyright message
+-exit-on-error treat normally ignored errors as fatal
+-quiet no verbose output
+-info print files written to filesystem
+-no-progress do not display the progress bar
+-progress display progress bar when using the -info option
+-percentage display a percentage rather than the full progress bar.
+ Can be used with dialog --gauge etc.
+-throttle <percentage> throttle the I/O input rate by the given percentage.
+ This can be used to reduce the I/O and CPU consumption
+ of Mksquashfs
+-limit <percentage> limit the I/O input rate to the given percentage.
+ This can be used to reduce the I/O and CPU consumption
+ of Mksquashfs (alternative to -throttle)
+-processors <number> use <number> processors. By default will use number of
+ processors available
+-mem <size> use <size> physical memory for caches. Use K, M or G to
+ specify Kbytes, Mbytes or Gbytes respectively
+-mem-percent <percent> use <percent> physical memory for caches. Default 25%
+-mem-default print default memory usage in Mbytes
+
+Filesystem append options:
+-noappend do not append to existing filesystem
+-root-becomes <name> when appending source files/directories, make the
+ original root become a subdirectory in the new root
+ called <name>, rather than adding the new source items
+ to the original root
+-no-recovery do not generate a recovery file
+-recovery-path <name> use <name> as the directory to store the recovery file
+-recover <name> recover filesystem data using recovery file <name>
+
+Filesystem actions options:
+-action <action@expr> evaluate <expr> on every file, and execute <action>
+ if it returns TRUE
+-log-action <act@expr> as above, but log expression evaluation results and
+ actions performed
+-true-action <act@expr> as above, but only log expressions which return TRUE
+-false-action <act@exp> as above, but only log expressions which return FALSE
+-action-file <file> as action, but read actions from <file>
+-log-action-file <file> as -log-action, but read actions from <file>
+-true-action-file <f> as -true-action, but read actions from <f>
+-false-action-file <f> as -false-action, but read actions from <f>
+
+Tar file only options:
+-default-mode <mode> tar files often do not store permissions for
+ intermediate directories. This option sets the default
+ directory permissions to octal <mode>, rather than 0755.
+ This also sets the root inode mode
+-default-uid <uid> tar files often do not store uids for intermediate
+ directories. This option sets the default directory
+ owner to <uid>, rather than the user running Mksquashfs.
+ This also sets the root inode uid
+-default-gid <gid> tar files often do not store gids for intermediate
+ directories. This option sets the default directory
+ group to <gid>, rather than the group of the user
+ running Mksquashfs. This also sets the root inode gid
+-ignore-zeros allow tar files to be concatenated together and fed to
+ Mksquashfs. Normally a tarfile has two consecutive 512
+ byte blocks filled with zeros which means EOF and
+ Mksquashfs will stop reading after the first tar file on
+ encountering them. This option makes Mksquashfs ignore
+ the zero filled blocks
+
+Expert options (these may make the filesystem unmountable):
+-nopad do not pad filesystem to a multiple of 4K
+-offset <offset> skip <offset> bytes at the beginning of FILESYSTEM.
+ Optionally a suffix of K, M or G can be given to specify
+ Kbytes, Mbytes or Gbytes respectively.
+ Default 0 bytes
+-o <offset> synonym for -offset
+
+Miscellaneous options:
+-fstime <time> alternative name for -mkfs-time
+-always-use-fragments alternative name for -tailends
+-root-owned alternative name for -all-root
+-noInodeCompression alternative name for -noI
+-noIdTableCompression alternative name for -noId
+-noDataCompression alternative name for -noD
+-noFragmentCompression alternative name for -noF
+-noXattrCompression alternative name for -noX
+
+-help output this options text to stdout
+-h output this options text to stdout
+
+-Xhelp print compressor options for selected compressor
+
+Pseudo file definition format:
+"filename d mode uid gid" create a directory
+"filename m mode uid gid" modify filename
+"filename b mode uid gid major minor" create a block device
+"filename c mode uid gid major minor" create a character device
+"filename f mode uid gid command" create file from stdout of command
+"filename s mode uid gid symlink" create a symbolic link
+"filename i mode uid gid [s|f]" create a socket (s) or FIFO (f)
+"filename x name=val" create an extended attribute
+"filename l linkname" create a hard-link to linkname
+"filename L pseudo_filename" same, but link to pseudo file
+"filename D time mode uid gid" create a directory with timestamp time
+"filename M time mode uid gid" modify a file with timestamp time
+"filename B time mode uid gid major minor"
+ create block device with timestamp time
+"filename C time mode uid gid major minor"
+ create char device with timestamp time
+"filename F time mode uid gid command" create file with timestamp time
+"filename S time mode uid gid symlink" create symlink with timestamp time
+"filename I time mode uid gid [s|f]" create socket/fifo with timestamp time
+
+
+Source1 source2 ... are the source directories/files containing the
+files/directories that will form the squashfs filesystem. If a single
+directory is specified (i.e. mksquashfs source image.sqfs) the squashfs
+filesystem will consist of that directory, with the top-level root
+directory containing the contents.
+
+If multiple source directories or files are specified, Mksquashfs will merge
+the specified sources into a single filesystem, with the root directory
+containing each of the source files/directories. The name of each directory
+entry will be the basename of the source path. If more than one source
+entry maps to the same name, the conflicts are named xxx_1, xxx_2, etc. where
+xxx is the original name.
+
+To make this clear, take two example directories. Source directory
+"/home/phillip/test" contains "file1", "file2" and "dir1".
+Source directory "goodies" contains "goodies1", "goodies2" and "goodies3".
+
+usage example 1:
+
+% mksquashfs /home/phillip/test image.sqfs
+
+This will generate a squashfs filesystem with root entries
+"file1", "file2" and "dir1".
+
+example 2:
+
+% mksquashfs /home/phillip/test goodies image.sqfs
+
+This will create a squashfs filesystem with the root containing
+entries "test" and "goodies" corresponding to the source
+directories "/home/phillip/test" and "goodies".
+
+example 3:
+
+% mksquashfs /home/phillip/test goodies test image.sqfs
+
+This is the same as the previous example, except a third
+source directory "test" has been specified. This conflicts
+with the first directory named "test" and will be renamed "test_1".
+
+Multiple sources allow filesystems to be generated without needing to
+copy all source files into a common directory. This simplifies creating
+filesystems.
+
+The -keep-as-directory option can be used when only one source directory
+is specified, and you wish the root to contain that directory, rather than
+the contents of the directory. For example:
+
+example 4:
+
+% mksquashfs /home/phillip/test image.sqfs -keep-as-directory
+
+This is the same as example 1, except for -keep-as-directory.
+This will generate a root directory containing directory "test",
+rather than the "test" directory contents "file1", "file2" and "dir1".
+
+If you want the full path to retained (like TAR behaviour), you can specify the
+-no-strip option.
+
+example 5:
+
+% mksquashfs /home/phillip/test image.sqfs -no-strip
+
+This will make a filesystem with "home", "home/phillip" and "home/phillip/test"
+directories, see section 4 for more details.
+
+The Dest argument is the destination where the squashfs filesystem will be
+written. This can either be a conventional file or a block device. If the file
+doesn't exist it will be created, if it does exist and a squashfs
+filesystem exists on it, Mksquashfs will append. The -noappend option will
+write a new filesystem irrespective of whether an existing filesystem is
+present. See section 12 for more details about appending.
+
+1. CHANGING COMPRESSION ALGORITHM AND COMPRESSION SPECIFIC OPTIONS
+------------------------------------------------------------------
+
+By default Mksquashfs will compress using the GZIP compression algorithm. This
+algorithm offers a good trade-off between compression ratio, and memory and time
+taken to decompress.
+
+Squashfs also supports LZ4, LZO, XZ and ZSTD compression. LZO offers worse
+compression ratio than GZIP, but is faster to decompress. XZ offers better
+compression ratio than GZIP, but at the expense of greater memory and time
+to decompress (and significantly more time to compress). LZ4 is similar
+to LZO. ZSTD has been developed by Facebook, and aims to compress well and
+be fast to decompress. You should experiment with the compressors to
+see which is best for you.
+
+If you're not building the squashfs-tools and kernel from source, then the tools
+and kernel may or may not have been built with support for LZ4, LZO, XZ or ZSTD
+compression. The compression algorithms supported by the build of Mksquashfs
+can be found by typing mksquashfs -help.
+
+The full list of compressors available and their compression specific options
+are:
+
+Compressors available and compressor specific options:
+ gzip (default)
+ -Xcompression-level <compression-level>
+ <compression-level> should be 1 .. 9 (default 9)
+ -Xwindow-size <window-size>
+ <window-size> should be 8 .. 15 (default 15)
+ -Xstrategy strategy1,strategy2,...,strategyN
+ Compress using strategy1,strategy2,...,strategyN in turn
+ and choose the best compression.
+ Available strategies: default, filtered, huffman_only,
+ run_length_encoded and fixed
+ lzo
+ -Xalgorithm <algorithm>
+ Where <algorithm> is one of:
+ lzo1x_1
+ lzo1x_1_11
+ lzo1x_1_12
+ lzo1x_1_15
+ lzo1x_999 (default)
+ -Xcompression-level <compression-level>
+ <compression-level> should be 1 .. 9 (default 8)
+ Only applies to lzo1x_999 algorithm
+ lz4
+ -Xhc
+ Compress using LZ4 High Compression
+ xz
+ -Xbcj filter1,filter2,...,filterN
+ Compress using filter1,filter2,...,filterN in turn
+ (in addition to no filter), and choose the best compression.
+ Available filters: x86, arm, armthumb, powerpc, sparc, ia64
+ -Xdict-size <dict-size>
+ Use <dict-size> as the XZ dictionary size. The dictionary size
+ can be specified as a percentage of the block size, or as an
+ absolute value. The dictionary size must be less than or equal
+ to the block size and 8192 bytes or larger. It must also be
+ storable in the xz header as either 2^n or as 2^n+2^(n+1).
+ Example dict-sizes are 75%, 50%, 37.5%, 25%, or 32K, 16K, 8K
+ etc.
+ zstd
+ -Xcompression-level <compression-level>
+ <compression-level> should be 1 .. 22 (default 15)
+
+If the compressor offers compression specific options (all the compressors now
+have compression specific options except the deprecated lzma1 compressor)
+then these options are also displayed (.i.e. in the above XZ is shown with two
+compression specific options). The compression specific options are, obviously,
+specific to the compressor in question, and the compressor documentation and
+web sites should be consulted to understand their behaviour. In general
+the Mksquashfs compression defaults for each compressor are optimised to
+give the best performance for each compressor, where what constitutes
+best depends on the compressor. For GZIP/XZ best means highest compression,
+for LZO/LZ4 best means a tradeoff between compression and (de)-compression
+overhead (LZO/LZ4 by definition are intended for weaker processors).
+
+
+2. REDUCING CPU AND I/O USAGE
+-----------------------------
+
+By default Mksquashfs will use all the CPUs available to compress and create the
+filesystem, and will read from the source files and write to the output
+filesystem as fast as possible. This maximises both CPU usage and I/O.
+
+Sometimes you don't want Mksquashfs to use all CPU and I/O bandwidth. For those
+cases Mksquashfs supports two complementary options, -processors and -throttle.
+
+The -processors option can be used to reduce the number of parallel compression
+threads used by Mksquashfs. Reducing this to 1 will create the minimum number
+of threads, and this will reduce CPU usage, and that in turn will reduce I/O
+(because CPUs are normally the bottleneck).
+
+The -throttle option reduces the speed Mksquashfs reads from the source files.
+The value is a percentage (obviously from 1 - 100), and 50 will reduce the
+read rate by half (the read thread will spend half its time idling), and 75
+by three quarters. Reducing the speed of I/O will also reduce the CPU
+usage as there is insufficient data rate to use all cores.
+
+Which option should you use? Both will effectively reduce CPU and I/O in
+normal cases where intensive use is being made of both I/O and CPUs. But
+in edge cases there can be an imbalance where reducing one has no effect, or
+it can't be reduced any further. For instance when there is only 1 or 2 cores
+available, setting -processors to the minimum of 1 may still use too much
+CPU. Additionally if your input source is slow Mksquashfs may still max it out
+with -processors set to the minimum of 1. In this case you can use -throttle
+in addition to -processors or on its own.
+
+
+3. CHANGING GLOBAL COMPRESSION DEFAULTS USED IN MKSQUASHFS
+----------------------------------------------------------
+
+There are a large number of options that can be used to control the
+compression in Mksquashfs. By and large the defaults are the most
+optimum settings and should rarely need to be changed.
+
+Note, this does not apply to the block size, increasing the block size from the
+default of 128 Kbytes will increase compression (especially for the XZ and ZSTD
+compressors) and should increase I/O performance too. However, a block size of
+greater than 128 Kbytes may increase latency in certain cases (where the
+filesystem contains lots of fragments, and no locality of reference is
+observed). For this reason the block size default is configured to the less
+optimal 128 Kbytes. Users should experiment with 256 Kbyte sizes or above.
+
+The -b option allows the block size to be selected, both "K" and "M" postfixes
+are supported, this can be either 4K, 8K, 16K, 32K, 64K, 128K, 256K, 512K or
+1M bytes.
+
+The -noI, -noD, -noF and -noX options can be used to force Mksquashfs to not
+compress inodes/directories, data, fragments and extended attributes
+respectively. Giving all options generates an uncompressed filesystem.
+
+The -no-fragments option tells Mksquashfs to not generate fragment blocks. A
+fragment block consists of multiple small files (all smaller than the block
+size) packed and compressed together. This produces much better compression
+than storing and compressing these files separately. It also typically
+improves I/O as multiple files in the same directory are read at the same time.
+You don't want to enable this option unless you fully understand the effects.
+
+The -tailends option tells Mksquashfs to always generate fragments for files
+irrespective of the file length. By default only small files less than the data
+block size are packed into fragment blocks. The tail ends of files which do not
+fit fully into a block, are NOT by default packed into fragments. This is a
+legacy setting when hard disks were mechanical, and had slow seek times. In
+general setting this option will gain a little more compression, without
+affecting I/O performance.
+
+The -no-duplicates option tells Mksquashfs to not check the files being added to
+the filesystem for duplicates. This can result in quicker filesystem
+generation although obviously compression will suffer badly if there is a lot
+of duplicates.
+
+
+4. TAR STYLE HANDLING OF SOURCE PATHNAMES IN MKSQUASHFS
+-------------------------------------------------------
+
+Mksquashfs has always stripped the leading directories of any source pathnames
+given on the command line.
+
+For example given the command line
+
+% mksquashfs dir-a/dir-b/dir-c/file1 dir-A/dir-B/file2 sqfs
+
+Mksquashfs will strip the leading directories, and put file1 and file2 into
+the same root directory. If file1 and file2 are directories it will place the
+directories into the same root directory, but, if only one directory is
+specified, it will put the contents of that directory into the root directory.
+Obviously, for a lot of the time this is what you want. But, if it isn't what
+you want it can be quite difficult to get Mksquashfs to do something different.
+
+A lot of people don't like this, and would prefer Mksquashfs acted like "tar",
+which does not strip leading directories. This allows you to create a directory
+hierarchy from the pathnames of the supplied files. In the above example, the
+tar archive would contain the pathnames "dir-a/dir-b/dir-c/file1" and
+"dir-A/dir-B/file2".
+
+Mksquashfs will act like tar if given the option -no-strip, or -tarstyle.
+
+
+5. CPIO STYLE HANDLING OF SOURCE PATHNAMES IN MKSQUASHFS
+--------------------------------------------------------
+
+Mksquashfs allows you to pipe the set of files to be added to the filesystem to
+standard in (stdin), if the -cpiostyle option is given.
+
+As with cpio, directories are not recursively scanned and their contents added.
+Evey file to be added to the filesystem must be explicitly specified.
+
+Typically the list of files to be added will be produced via find, or a similar
+utility.
+
+For example
+
+% find /home/phillip/squashfs-tools | mksquashfs - img.sqfs -cpiostyle
+
+Will create an image containing everything in squashfs-tools and its
+sub-directories. Note, "-" is given as the source pathname in Mksquashfs, and
+indicates no commmand line sources.
+
+The following will add just the files ending in .c, .h and .o.
+
+% find /home/phillip/squashfs-tools -name "*.[cho]" | mksquashfs - img.sqfs -cpiostyle
+
+
+6. SPECIFYING THE UIDs/GIDs USED IN THE FILESYSTEM
+--------------------------------------------------
+
+By default files in the generated filesystem inherit the UID and GID ownership
+of the original file. However, Mksquashfs provides a number of options which
+can be used to override the ownership.
+
+The -all-root option forces all file uids/gids in the generated Squashfs
+filesystem to be root. This allows root owned filesystems to be built without
+root access on the host machine.
+
+The "-force-uid uid" option forces all files in the generated Squashfs
+filesystem to be owned by the specified uid. The uid can be specified either by
+name (i.e. "root") or by number.
+
+The "-force-gid gid" option forces all files in the generated Squashfs
+filesystem to be group owned by the specified gid. The gid can be specified
+either by name (i.e. "root") or by number.
+
+
+7. EXCLUDING FILES FROM THE FILESYSTEM
+--------------------------------------
+
+The -e and -ef options allow files/directories to be specified which are
+excluded from the output filesystem. The -e option takes the exclude
+files/directories from the command line, the -ef option takes the
+exlude files/directories from the specified exclude file, one file/directory
+per line.
+
+Two styles of exclude file matching are supported: basic exclude matching, and
+extended wildcard matching. Basic exclude matching is a legacy feature
+retained for backwards compatibility with earlier versions of Mksquashfs.
+Extended wildcard matching should be used in preference.
+
+7.1 BASIC EXCLUDE MATCHING
+--------------------------
+
+Each exclude file is treated as an exact match of a file/directory in
+the source directories. If an exclude file/directory is absolute (i.e.
+prefixed with /, ../, or ./) the entry is treated as absolute, however, if an
+exclude file/directory is relative, it is treated as being relative to each of
+the sources in turn, i.e.
+
+% mksquashfs /tmp/source1 source2 output_fs -e ex1 /tmp/source1/ex2 out/ex3
+
+Will generate exclude files /tmp/source1/ex2, /tmp/source1/ex1, source2/ex1,
+/tmp/source1/out/ex3 and source2/out/ex3.
+
+7.2 EXTENDED EXCLUDE FILE HANDLING
+----------------------------------
+
+Extended exclude file matching treats each exclude file as a wildcard or
+regex expression. To enable wildcard matching specify the -wildcards
+option, and to enable regex matching specify the -regex option. In most
+cases the -wildcards option should be used rather than -regex because wildcard
+matching behaviour is significantly easier to understand!
+
+In addition to wildcards/regex expressions, exclude files can be "anchored" or
+"non-anchored". An anchored exclude is one which matches from the root of the
+directory and nowhere else, a non-anchored exclude matches anywhere. For
+example given the directory hierarchy "a/b/c/a/b", the anchored exclude
+"a/b" will match "a/b" at the root of the directory hierarchy, but
+it will not match the "/a/b" sub-directory within directory "c", whereas a
+non-anchored exclude would.
+
+A couple of examples should make this clearer.
+
+Anchored excludes
+
+ 1. mksquashfs example image.sqsh -wildcards -e 'test/*.gz'
+
+ Exclude all files matching "*.gz" in the top level directory "test".
+
+ 2. mksquashfs example image.sqsh -wildcards -e '*/[Tt]est/example*'
+
+ Exclude all files beginning with "example" inside directories called
+ "Test" or "test", that occur inside any top level directory.
+
+ Using extended wildcards, negative matching is also possible.
+
+ 3. mksquashfs example image.sqsh -wildcards -e 'test/!(*data*).gz'
+
+ Exclude all files matching "*.gz" in top level directory "test",
+ except those with "data" in the name.
+
+Non-anchored excludes
+
+ By default excludes match from the top level directory, but it is
+ often useful to exclude a file matching anywhere in the source directories.
+ For this non-anchored excludes can be used, specified by pre-fixing the
+ exclude with "...".
+
+ Examples:
+
+ 1. mksquashfs example image.sqsh -wildcards -e '... *.gz'
+
+ Exclude files matching "*.gz" anywhere in the source directories.
+ For example this will match "example.gz", "test/example.gz", and
+ "test/test/example.gz".
+
+ 2. mksquashfs example image.sqsh -wildcards -e '... [Tt]est/*.gz'
+
+ Exclude files matching "*.gz" inside directories called "Test" or
+ "test" that occur anywhere in the source directories.
+
+ Again, using extended wildcards, negative matching is also possible.
+
+ 3. mksquashfs example image.sqsh -wildcards -e '... !(*data*).gz'
+
+ Exclude all files matching "*.gz" anywhere in the source directories,
+ except those with "data" in the name.
+
+
+8. FILTERING AND ADDING EXTENDED ATTRIBUTES (XATTRs)
+----------------------------------------------------
+
+Mksquashfs has a number of options which allow extended attributes (xattrs) to
+be filtered from the source files or added to the created Squashfs filesystem.
+
+The -no-xattrs option removes any extended attributes which may exist in the
+source files, and creates a filesystem without any extended attributes.
+
+The -xattrs-exclude option specifies a regular expression (regex), which
+removes any extended attribute that matches the regular expression from all
+files. For example the regex '^user.' will remove all User extended attributes.
+
+The -xattrs-include option instead specifies a regular expression (regex)
+which includes any extended attribute that matches, and removes anything
+that does't match. For example the regex '^user.' will only keep User
+extended attributes and anything else will be removed.
+
+Mksquashfs also allows you to add extended attributes to files in the Squashfs
+filesystem using the -xattrs-add option. This option takes an xattr name and
+value pair separated by the '=' character.
+
+The extended attribute name can be any valid name and can be in the namespaces
+security, system, trusted, or user. User extended attributes are added to files
+and directories (see man 7 xattr for explanation), and the others are added to
+all files.
+
+The extended attribute value by default will be treated as binary (i.e. an
+uninterpreted byte sequence), but it can be prefixed with 0s, where it will be
+treated as base64 encoded, or prefixed with 0x, where it will be treated as
+hexidecimal.
+
+Obviously using base64 or hexidecimal allows values to be used that cannot be
+entered on the command line such as non-printable characters etc. But it
+renders the string non-human readable. To keep readability and to allow
+non-printable characters to be entered, the 0t prefix is supported. This
+encoding is similar to binary encoding, except backslashes are specially
+treated, and a backslash followed by three octal digits can be used to encode
+any ASCII character, which obviously can be used to encode non-printable values.
+The following four command lines are equivalent
+
+mksquashfs dir image.sqfs -xattrs-add "user.comment=hello world"
+mksquashfs dir image.sqfs -xattrs-add "user.comment=0saGVsbG8gd29ybGQ="
+mksquashfs dir image.sqfs -xattrs-add "user.comment=0x68656c6c6f20776f726c64"
+mksquashfs dir image.sqfs -xattrs-add "user.comment=0thello world"
+
+Obviously in the above example there are no non-printable characters and so
+the 0t prefixed string is identical to the first line. The following three
+command lines are identical, but where the space has been replaced by the
+non-printable NUL '\0' (null character).
+
+mksquashfs dir image.sqfs -xattrs-add "user.comment=0thello\000world"
+mksquashfs dir image.sqfs -xattrs-add "user.comment=0saGVsbG8Ad29ybGQ="
+mksquashfs dir image.sqfs -xattrs-add "user.comment=0x68656c6c6f00776f726c64"
+
+9. PSEUDO FILE SUPPORT
+----------------------
+
+Mksquashfs supports pseudo files, these allow files, directories, character
+devices, block devices, fifos, symbolic links, hard links and extended
+attributes to be specified and added to the Squashfs filesystem being built,
+rather than requiring them to be present in the source files. This, for
+example, allows device nodes to be added to the filesystem without requiring
+root access.
+
+Pseudo files also support "dynamic pseudo files" and a modify operation.
+Dynamic pseudo files allow files to be dynamically created when Mksquashfs
+is run, their contents being the result of running a command or piece of
+shell script. The modify operation allows the mode/uid/gid of an existing
+file in the source filesystem to be modified.
+
+Two Mksquashfs options are supported, -p allows one pseudo file to be specified
+on the command line, and -pf allows a pseudo file to be specified containing a
+list of pseduo definitions, one per line.
+
+9.1 CREATING A DYNAMIC FILE
+---------------------------
+
+Pseudo definition
+
+Filename f mode uid gid command
+
+mode is the octal mode specifier, similar to that expected by chmod.
+
+uid and gid can be either specified as a decimal number, or by name.
+
+command can be an executable or a piece of shell script, and it is executed
+by running "/bin/sh -c command". The stdout becomes the contents of
+"Filename".
+
+Examples:
+
+Running a basic command
+-----------------------
+
+/somedir/dmesg f 444 root root dmesg
+
+creates a file "/somedir/dmesg" containing the output from dmesg.
+
+Executing shell script
+----------------------
+
+RELEASE f 444 root root \
+ if [ ! -e /tmp/ver ]; then \
+ echo 0 > /tmp/ver; \
+ fi; \
+ ver=`cat /tmp/ver`; \
+ ver=$((ver +1)); \
+ echo $ver > /tmp/ver; \
+ echo -n `cat /tmp/release`; \
+ echo "-dev #"$ver `date` "Build host" `hostname`
+
+Creates a file RELEASE containing the release name, date, build host, and
+an incrementing version number. The incrementing version is a side-effect
+of executing the shell script, and ensures every time Sqfstar is run a
+new version number is used without requiring any other shell scripting.
+
+The above example also shows that commands can be split across multiple lines
+using "\". Obviously as the script will be presented to the shell as a single
+line, a semicolon is need to separate individual shell commands within the
+shell script.
+
+Reading from a device (or fifo/named socket)
+--------------------------------------------
+
+input f 444 root root dd if=/dev/sda1 bs=1024 count=10
+
+Copies 10K from the device /dev/sda1 into the file input. Ordinarily Sqfstar
+given a device, fifo, or named socket will place that special file within the
+Squashfs filesystem, the above allows input from these special files to be
+captured and placed in the Squashfs filesystem.
+
+9.2 CREATING A BLOCK OR CHARACTER DEVICE
+----------------------------------------
+
+Pseudo definition
+
+Filename type mode uid gid major minor
+
+Where type is either
+ b - for block devices, and
+ c - for character devices
+
+mode is the octal mode specifier, similar to that expected by chmod.
+
+uid and gid can be either specified as a decimal number, or by name.
+
+For example:
+
+/dev/chr_dev c 666 root root 100 1
+/dev/blk_dev b 666 0 0 200 200
+
+creates a character device "/dev/chr_dev" with major:minor 100:1 and
+a block device "/dev/blk_dev" with major:minor 200:200, both with root
+uid/gid and a mode of rw-rw-rw.
+
+9.3 CREATING A DIRECTORY
+-------------------------
+
+Pseudo definition
+
+Filename d mode uid gid
+
+mode is the octal mode specifier, similar to that expected by chmod.
+
+uid and gid can be either specified as a decimal number, or by name.
+
+For example:
+
+/pseudo_dir d 666 root root
+
+creates a directory "/pseudo_dir" with root uid/gid and mode of rw-rw-rw.
+
+9.4 CREATING A SYMBOLIC LINK
+-----------------------------
+
+Pseudo definition
+
+Filename s mode uid gid symlink
+
+uid and gid can be either specified as a decimal number, or by name.
+
+Note mode is ignored, as symlinks always have "rwxrwxrwx" permissions.
+
+For example:
+
+symlink s 0 root root example
+
+8reates a symlink "symlink" to file "example" with root uid/gid.
+
+9.5 CREATING HARD LINKS (FILE REFERENCES)
+-----------------------------------------
+
+The "f" Pseudo definition allows a regular file to be created from the output of
+a command (or shell). Often this is used to reference a file outside the source
+directories by executing "cat", e.g.
+
+README f 0555 0 0 cat /home/phillip/latest-version/README
+
+Because this is a quite frequent use of the definition, an alternative faster
+"File reference" or Hard Link Pseudo definition exists:
+
+README l /home/phillip/latest-version/README
+
+Will create a reference to "/home/phillip/latest-version/README",
+and obviously the timestamp/mode and owership will be used.
+
+The definition also be used to create additional references to
+files within the source directories. For instance if "phillip/latest/README"
+was a file being added to the filesystem, then
+
+README l phillip/latest/README
+
+Will create a Hard Link (and increment the nlink count on the inode).
+
+In both cases, the path to the file being referenced is the system
+filesystem path, and can be absolute (prefixed with /), or relative
+to the current working directory.
+
+There is an additional 'L' Pseudo definition, which closes a loophole in
+the above 'l' definition. The 'l' Pseudo definition cannot create references
+or Hard Links to files created by Pseudo definitions, because by
+definition they do not exist in the system filesystem.
+
+with 'L' the referenced file is expected to be a Pseudo file, and in this case
+the path is taken to be from the root of the Squashfs filesystem being created,
+e.g.
+
+char-dev c 0555 0 0 1 2
+
+link L char-dev
+
+Will create a Hard Link named "link" to the character device called "char-dev"
+created by the previous Pseudo definition.
+
+9.6 CREATING SOCKETS/FIFOS
+---------------------------
+
+Pseudo definition
+
+filename i mode uid gid [s|f]
+
+To create a Unix domain socket, 's' should be used, i.e.
+
+filename i 0777 root root s
+
+and to create a FIFO, 'f' should be used, i.e.
+
+filename i 0777 root root f
+
+9.7 ADDING EXTENDED ATTRIBUTES TO FILES
+---------------------------------------
+
+Pseudo definition
+
+filename x name=val
+
+Will add the extended attribute <name> to <filename> with <val> contents. See
+Section 7 for a description of the <val> formats supported.
+
+9.8 MODIFYING ATTRIBUTES OF AN EXISTING FILE
+--------------------------------------------
+
+Pseudo definition
+
+Filename m mode uid gid
+
+mode is the octal mode specifier, similar to that expected by chmod.
+
+uid and gid can be either specified as a decimal number, or by name.
+
+For example:
+
+dmesg m 666 root root
+
+Changes the attributes of the file "dmesg" in the filesystem to have
+root uid/gid and a mode of rw-rw-rw, overriding the attributes obtained
+from the source filesystem.
+
+10. EXTENDED PSEUDO FILE DEFINITIONS WITH TIMESTAMPS
+----------------------------------------------------
+
+The Pseudo file definitions described above do not allow the timestamp
+of the created file to be specified, and the files will be timestamped
+with the current time.
+
+Extended versions of the Pseudo file definitions are supported which
+take a <time> timestamp. These are distinquished from the previous
+definitions by using an upper-case type character. For example the "D"
+definition is identical to the "d" definition, but it takes a <time>
+timestamp.
+
+The list of extended definitions are:
+
+ filename F time mode uid gid command
+ filename D time mode uid gid
+ filename B time mode uid gid major minor
+ filename C time mode uid gid major minor
+ filename S time mode uid gid symlink
+ filename I time mode uid gid [s|f]
+ filename M time mode uid gid
+
+<time> can be either an unsigned decimal integer (which represents the
+seconds since the epoch of 1970-01-01 00:00 UTC), or a "date string"
+which is parsed and converted into an integer since the epoch, by calling
+the "date" command.
+
+Because most date strings have spaces, they will need to be quoted, and if
+entered on the command line, these quotes will need to be protected from the
+shell by backslashes, i.e.
+
+% mksquashfs dir image.sqsh -p "file D \"1 jan 1980\" 0777 phillip phillip"
+
+Obviously anything "date" accepts as a valid string can be used, such as
+"yesterday", "last week" etc.
+
+
+11. APPENDING TO SQUASHFS FILESYSTEMS
+-------------------------------------
+
+Running Mksquashfs with the destination directory containing an existing
+filesystem will add the source items to the existing filesystem. By default,
+the source items are added to the existing root directory.
+
+To make this clear... An existing filesystem "image" contains root entries
+"old1", and "old2". Source directory "/home/phillip/test" contains "file1",
+"file2" and "dir1".
+
+example 1:
+
+% mksquashfs /home/phillip/test image
+
+Will create a new "image" with root entries "old1", "old2", "file1", "file2" and
+"dir1"
+
+example 2:
+
+% mksquashfs /home/phillip/test image -keep-as-directory
+
+Will create a new "image" with root entries "old1", "old2", and "test".
+As shown in the previous section, for single source directories
+'-keep-as-directory' adds the source directory rather than the
+contents of the directory.
+
+example 3:
+
+% mksquashfs /home/phillip/test image -keep-as-directory -root-becomes
+original-root
+
+Will create a new "image" with root entries "original-root", and "test". The
+'-root-becomes' option specifies that the original root becomes a subdirectory
+in the new root, with the specified name.
+
+The append option with file duplicate detection, means squashfs can be
+used as a simple versioning archiving filesystem. A squashfs filesystem can
+be created with for example the linux-2.4.19 source. Appending the linux-2.4.20
+source will create a filesystem with the two source trees, but only the
+changed files will take extra room, the unchanged files will be detected as
+duplicates.
+
+12. APPENDING RECOVERY FILE FEATURE
+-----------------------------------
+
+Recovery files are created when appending to existing Squashfs
+filesystems. This allows the original filesystem to be recovered
+if Mksquashfs aborts unexpectedly (i.e. power failure).
+
+The recovery files are called squashfs_recovery_xxx_yyy, where
+"xxx" is the name of the filesystem being appended to, and "yyy" is a
+number to guarantee filename uniqueness (the PID of the parent Mksquashfs
+process).
+
+Normally if Mksquashfs exits correctly the recovery file is deleted to
+avoid cluttering the filesystem. If Mksquashfs aborts, the "-recover"
+option can be used to recover the filesystem, giving the previously
+created recovery file as a parameter, i.e.
+
+mksquashfs dummy image.sqsh -recover squashfs_recovery_image.sqsh_1234
+
+The writing of the recovery file can be disabled by specifying the
+"-no-recovery" option.
+
+
+13. MKSQUASHFS ACTIONS INTRODUCTION
+-----------------------------------
+
+The Mksquashfs Actions code allows an "action" to be executed on a file if one
+or more "tests" succeed. If you're familiar with the "find" command, then an
+action is similar to "-print", and a test is similar to say "-name" or "-type".
+
+To illustrate this it is useful to give two concrete examples.
+
+example 1: the fragment action
+
+% mksquashfs /home/phillip/github github.sqsh -action "fragment(cfiles) @ name(*.[ch])" -action "fragment(ofiles) @ name(*.o)"
+
+This example defines two "fragment actions" which control the packing of files
+within fragments. Specifically, it creates a specialised fragment called
+"cfiles" which packs files matching the wildcard name "*.[ch]".
+
+It also creates another specialised fragment called "ofiles" which packs files
+matching the wilcard name "*.o".
+
+Producing specialised fragments which only pack files which match a range of
+tests, can produce better compression and/or I/O performance as it can optimise
+similarity or access patterns. But it can also produce worse compression, and
+so you should always test the effect.
+
+Additionally, you should be able to see that an action definition is split into
+an action function before the "@", and one or more test functions after the @.
+Quoting is necessary here to protect it from interpretation by the shell. Also
+the spacing before and after the "@" isn't necessary and is used here for added
+readability.
+
+example 2: the uncompressed action
+
+% mksquashfs /home/phillip backup.sqsh -action "uncompressed @ ( name(*.jpg) || name(*.mpg) ) || ( name(*.img) && filesize(+1G) )"
+
+This is a more complex example. It tells Mksquashfs to not try and compress any
+file which matches the wildcard names "*.jpg" and "*.mpg". But it also tells
+Mksquashfs not to try and compress files which match the wildcard name "*.img"
+and are also 1 Gigabyte in size or larger.
+
+This example introduces the fact that tests can be combined using the logical
+operators && (and), || (or) and ! (not), and can be bracketed.
+
+Please see the ACTIONS-README file for syntax and extra information.
+
+
+14. MISCELLANEOUS OPTIONS
+------------------------
+
+The -info option displays the files/directories as they are compressed and
+added to the filesystem. The original uncompressed size of each file
+is printed, along with DUPLICATE if the file is a duplicate of a
+file in the filesystem.
+
+The -nopad option informs Mksquashfs to not pad the filesystem to a 4K multiple.
+This is performed by default to enable the output filesystem file to be mounted
+by loopback, which requires files to be a 4K multiple. If the filesystem is
+being written to a block device, or is to be stored in a bootimage, the extra
+pad bytes are not needed.