pax_global_header00006660000000000000000000000064140763503540014521gustar00rootroot0000000000000052 comment=0496d7c3de3e09da37ba492081c86159806ebb07 squashfs-tools-4.5/000077500000000000000000000000001407635035400143645ustar00rootroot00000000000000squashfs-tools-4.5/.gitattributes000066400000000000000000000000551407635035400172570ustar00rootroot00000000000000version.mk export-subst kernel export-ignore squashfs-tools-4.5/ACKNOWLEDGEMENTS000066400000000000000000000136441407635035400166510ustar00rootroot00000000000000 ACKNOWLEDGEMENTS Thanks to everyone who have downloaded Squashfs. I appreciate people using it, and any feedback you have. The following have provided useful feedback, which has guided some of the extra features in squashfs. This is a randomly ordered (roughly in chronological order) list, which is updated when I remember... Acknowledgements for Squashfs 4.3 --------------------------------- Thanks to Bruno Wolff III and Andy Lutomirski for useful feedback during the long development process of Squashfs 4.3. Acknowledgements for Squashfs 4.2 --------------------------------- Thanks to Lasse Collin (http://tukaani.org/xz/) for mainlining XZ decompression support. Acknowledgements for Squashfs 4.1 --------------------------------- Thanks to Chan Jeong and LG for the patches to support LZO compression. Acknowledgements for Squashfs 4.0 --------------------------------- Thanks to Tim Bird and CELF (Consumer Electronics Linux Forum) for helping fund mainstreaming of Squashfs into the 2.6.29 kernel and the changes to the Squashfs tools to support the new 4.0 file system layout. Acknowledgements for Squashfs-3.3 ------------------------------------ Peter Korsgaard and others sent patches updating Squashfs to changes in the VFS interface for 2.6.22/2.6.23/2.6.24-rc1. Peter also sent some small patches for the Squashfs kernel code. Vito Di Leo sent a patch extending Mksquashfs to support regex filters. While his patched worked, it unfortunately made it easy to make Mksquashfs perform unpredictably with poorly choosen regex expressions. It, however, encouraged myself to add support for wildcard pattern matching and regex filters in a different way. Acknowledgements for Squashfs-3.2-r2 ------------------------------------ Junjiro Okajima discovered a couple of SMP issues, thanks. Junjiro Okajima and Tomas Matejicek have produced some good LZMA patches for Squashfs. Acknowledgements for Squashfs-3.2 --------------------------------- Peter Korsgaard sent a patch updating Squashfs to changes in the VFS interface in Linux 2.6.20. Acknowledgements for Squashfs-3.1 --------------------------------- Kenneth Duda and Ed Swierk of Arastra Inc. identified numerous bugs with Squashfs, and provided patches which were the basis for some of the fixes. In particular they identified the fragment rounding bug, the NFS bug, the initrd bug, and helped identify the 4K stack overflow bug. Scott James Remnant (Ubuntu) also identified the fragment rounding bug, and he also provided a patch. Ming Zhang identified the Lseek bug in Mksquashfs. His tests on the performance of Mksquashfs on SMP systems encouraged the rewrite of Mksquashfs. Peter Korsgaard, Daniel Olivera and Zilvinas Valinskas noticed Squashfs 3.0 didn't compile on Linux-2.6.18-rc[1-4] due to changes in the Linux VFS interfaces, and provided patches. Tomas Matejicek (SLAX) suggested the -force option on Unsquashfs, and noticed Unsquashfs didn't return the correct exit status. Yann Le Doare reported a kernel oops and provided a Qemu image that led to the identification of the simultaneously accessing multiply mounted Squashfs filesystems bug. Older acknowledgements ---------------------- Mark Robson - pointed out early on that initrds didn't work Adam Warner - pointed out that greater than 2GB filesystems didn't work. John Sutton - raised the problem when archiving the entire filesystem (/) there was no way to prevent /proc being archived. This prompted exclude files. Martin Mueller (LinuxTV) - noticed that the filesystem length in the superblock doesn't match the output filesystem length. This is due to padding to a 4K boundary. This prompted the addition of the -nopad option. He also reported a problem where 32K block filesystems hung when used as initrds. Arkadiusz Patyk (Polish Linux Distribution - PLD) reported a problem where 32K block filesystems hung when used as a root filesystem mounted as a loopback device. David Fox (Lindows) noticed that the exit codes returned by Mksquashfs were wrong. He also noticed that a lot of time was spent in the duplicate scan routine. Cameron Rich complained that Squashfs did not support FIFOs or sockets. Steve Chadsey and Thomas Weissmuller noticed that files larger than the available memory could not be compressed by Mksquashfs. "Ptwahyu" and "Hoan" (I have no full names and I don't like giving people's email addresses), noticed that Mksquashfs 1.3 SEGV'd occasionally. Even though I had already noticed this bug, it is useful to be informed by other people. Don Elwell, Murray Jensen and Cameron Rich, have all sent in patches. Thanks, I have not had time to do anything about them yet... Drew Scott Daniels has been a good advocate for Squashfs. Erik Andersen has made some nice suggestions, unfortunately, I have not had time to implement anything. Artemiy I. Pavlov has written a useful LDP mini-howto for Squashfs (http://linuxdoc.artemio.net/squashfs). Yves Combe reported the Apple G5 bug, when using Squashfs for his PPC Knoppix-mib livecd project. Jaco Greeff (mklivecd project, and maintainer of the Mandrake squashfs-tools package) suggested the new mksquashfs -ef option, and the standalone build for mksquashfs. Mike Schaudies made a donation. Arkadiusz Patyk from the Polish Linux Distribution reported that Squashfs didn't work on amd64 machines. He gave me an account on a PLD amd64 machine which allowed myself to track down these bugs. Miles Roper, Peter Kjellerstedt and Willy Tarreau reported that release 2.1 did not compile with gcc < 3.x. Marcel J.E. Mol reported lack of kernel memory issues when using Squashfs on small memory embedded systems. This prompted the addition of the embedded system kernel configuration options. Era Scarecrow noticed that Mksquashfs had not been updated to reflect that smaller than 4K blocks are no longer supported. Kenichi Shima reported the Kconfig file had not been updated to 2.2. Aaron Ten Clay made a donation! Tomas Matejicek (SLAX) made a donation! squashfs-tools-4.5/ACTIONS-README000066400000000000000000000533611407635035400163520ustar00rootroot00000000000000 MKSQUASHFS ACTIONS ================== The new 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". Actions add greater flexibility when building images from sources. They can be used to optimise compression, I/O performance, and they also allow more control on the exclusion of files from the source, and allow uid/gid and mode to be changed on a file basis. 1. Specification ================ Actions can be specified on the command line with the -action option. They can also be put into a file, and added with the -action-file option. If put into a file, there is one action per line. But, lines can be extended over many lines with continuation (\). If you want to get a log of what actions were performed, and the values returned by the tests for each file, you can use the -log-action option for the command line and -log-action-file for action files. Similarly there are -true-action (-true-action-file) and -false-action (-false-action-file) options which log if the tests evaluated to TRUE, and vice-versa: 2. Syntax ========= An action consists of two parts, separated by an "@". The action to be executed is placed before the @, and one or more tests are placed afer the @. If the action or tests has an argument, it is given in brackets. Brackets are optional if no argument is needed, e.g. compressed()@name("filename") compressed@name("filename") do exactly the same thing. Arguments can be either numeric or string, depending on the action and test. String arguments can be enclosed in double-quotes ("), to prevent the parser from treating characters within it specially. Within double-quotes only '\' is treatedly specially, and only at the end of a line. Special characters can also be backslashed (\) to prevent interpretation by the parser, e.g. the following is equivalent: compressed@name(file\ name\ with\ \&&\ and\ spaces) compressed@name("file name with && and spaces") Numeric arguments are of the form [range]number[size], where [range] is either '<' or '-', match on less than number '>' or '+', match on greater than number "" (nothing), match on exactly number [size] is either: "" (nothing), number 'k' or 'K', number * 2^10 'm' or 'M', number * 2^20 'g' or 'G', number * 2^30 e.g. the following is equivalent: compressed@filesize(-81920) compressed@filesize(<80K) Both will match on files less than 80K in size. Characters which are treated specially by the parser are * ( ) && || ! , @. Plus whitespace (spaces and tabs). Note: if the action is typed on the command line, then many special characters will be evaluated by the shell, and you should always check what is actually being passed to Mksquashfs. If in doubt use -action-file where the additional complexities of shell evaluation is avoided. For example this action line will work in an action file compressed()@name("file name") But, if typed on the command line, it will need to be: % mksquashfs source image -action "compressed()@name(\"file name\")" 3. Logical operators ==================== Tests can be combined with the logical operators && (and), || (or) and can be negated with the unary ! (not). Expressions thus formed can also be bracketed with "(" and ")", to create nested expressions. Operators do not have precedence and are evaluated strictly left to right. To enforce precedence use brackets, e.g. test1 && test2 || test3 will be evaluated as (test1 && test2) || test3 && and || are short-circuit operators, where the rhs (right hand side) is only evaluated if the lhs (left hand side) has been insufficient to determine the value. For example in the above, test3 will only be evaluated if (test1 && test2) evaluates to FALSE. 4. Test operators ================= The following test operators are supported: 4.1 name(pattern) Returns TRUE if the filename (basename without leading directory components) matches pattern. Pattern can have wildcards. 4.2 pathname(pattern) --------------------- Returns TRUE if the full pathname of the file matches pattern. Pattern can have wildcards. 4.3 subpathname(pattern) ------------------------ Returns TRUE if the directory components of pattern match the first directory components of the pathname. For example, if pattern has one component: subpathname(dir1) will match "dir1/somefile", "dir1/dir2/somefile" etc. If pattern had two components: subpathname(dir1/dir2) will match ""dir1/dir2/somefile" etc. Pattern can have wildcards. 4.4 filesize(value) ------------------- Return TRUE if the size of the file is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Returns FALSE on anything not a file. 4.5 dirsize(value) ------------------ Return TRUE if the size of the directory is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Returns FALSE on anything not a directory. 4.6 size(value) --------------- Return TRUE if the size of the file is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Works on any file type. 4.7 inode(value) ---------------- Return TRUE if the inode number is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. 4.8 nlink(value) ---------------- Return TRUE if the nlink count is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. 4.9 fileblocks(value) --------------------- Return TRUE if the size of the file in blocks (512 bytes) is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Returns FALSE on anything not a file. 4.10 dirblocks(value) --------------------- Return TRUE if the size of the directory in blocks (512 bytes) is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Returns FALSE on anything not a directory. 4.11 blocks(value) ------------------ Return TRUE if the size of the file in blocks (512 bytes) is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Works on any file type. 4.12 uid(value) --------------- Return TRUE if the uid value is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. 4.13 gid(value) --------------- Return TRUE if the gid value is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. 4.14 user(string) ----------------- Return TRUE if the file owner matches . 4.15 group(string) ------------------ Return TRUE if the file group matches . 4.16 depth(value) ----------------- Return TRUE if file is at depth less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Top level directory is depth 1. 4.17 dircount(value) -------------------- Return TRUE if the number of files in the directory is less than, equal to, or larger than , where can be [<-]number, number, [>+]number. Returns FALSE on anything not a directory. 4.18 filesize_range(minimum, maximum) ------------------------------------- Return TRUE if the size of the file is within the range [, ] inclusive. Returns FALSE on anything not a file. 4.19 dirsize_range(minimum, maximum) ------------------------------------ Return TRUE if the size of the directory is within the rang [, ] inclusive. Returns FALSE on anything not a directory. 4.20 size_range(minimum, maximum) --------------------------------- Return TRUE if the size of the file is within the range [, ] inclusive. Works on any file type. 4.21 inode_range(minimum, maximum) ---------------------------------- Return TRUE if the inode number is within the range [, ] inclusive. 4.22 fileblocks_range(minimum, maximum) --------------------------------------- Return TRUE if the size of the file in blocks (512 bytes) is within the range [, ] inclusive. Returns FALSE on anything not a file. 4.23 dirblocks_range(minimum, maximum) -------------------------------------- Return TRUE if the size of the directory in blocks (512 bytes) is within the range [, ] inclusive. Returns FALSE on anything not a directory. 4.24 blocks_range(minimum, maximum) ----------------------------------- Return TRUE if the size of the file in blocks (512 bytes) is within the range [, ] inclusive. Works on any file type. 4.25 uid_range(minimum, maximum) -------------------------------- Return TRUE if the file uid is within the range [, ] inclusive. 4.26 gid_range(minimum, maximum) -------------------------------- Return TRUE if the file gid is within the range [, ] inclusive. 4.27 depth_range(minimum, maximum) ---------------------------------- Return TRUE if file is at depth within the range [, ]. Top level directory is depth 1. 4.28 dircount_range(minimum, maximum) ------------------------------------- Returns TRUE is the number of files in the directory is within the range [, ]. Returns FALSE on anything not a directory. 4.29 type(c) ------------ Returns TRUE if the file matches type . can be f - regular file d - directory l - symbolic link c - character device b - block device p - Named Pipe / FIFO s - socket 4.30 perm(mode) --------------- Return TRUE if file permissions match . is the same as find's -perm option: perm(mode) - TRUE if file's permission bits are exactly . can be octal or symbolic. perm(-mode) - TRUE if all permission bits are set for this file. can be octal or symbolic. perm(/mode) - TRUE if any permission bits are set for this file. can be octal or symbolic. The symbolic mode is of the format [ugoa]*[[+-=]PERMS]+ PERMS = [rwxXst]+ or [ugo] and can be repeated separated with commas. Examples: perm(0644) match on a file with permissions exactly rw-r--r--. perm(u=rw,go=r) as above, but expressed symbolically. perm(/222) match on a file which is writable for any of user, group, other, perm(/u=w,g=w,o=w) as above but expressed symbolically, perm(/ugo=w) as above but specified more concisely. 4.31 file(string) ----------------- Execute "file command" on file, and return TRUE if the output matches the substring , for example file(ASCII text) will return TRUE if the file is ASCII text. Note, this is an expensive test, and should only be run if the file has matched a number of other short-circuit tests. 4.32 exists() ------------- Test if the file pointed to by the symbolic link exists within the output filesystem, that is, whether the symbolic link has a relative path and the relative path can be resolved to an entry within the output filesystem. If the file isn't a symbolic link then the test always returns TRUE. 4.33 absolute() --------------- Test if the symbolic link is absolute, which by definition means it points outside of the output filesystem (unless it is to be mounted as root). If the file isn't a symbolic link then the test always returns FALSE. 4.34 readlink(expression) ------------------------- Follow or dereference the symbolic link, and evaluate in the context of the file pointed to by the symbolic link. All inode attributes, pathname, name and depth all refer to the dereferenced file. If the symbolic link cannot be dereferenced because it points to something not in the output filesystem (see exists() function above), then FALSE is returned. If the file is not a symbolic link, the result is the same as , i.e. readlink() == . Examples: readlink("name(*.[ch])") returns TRUE if the file referenced by the symbolic link matches *.[ch]. Obviously, expressions created with && || etc. can be specified. readlink("depth(1) && filesize(<20K)") returns TRUE if the file referenced by the symbolic link is a regular file less than 20K in size and in the top level directory. Note: in the above tests the embedded expression to be evaluated is enclosed in double-quotes ("), this is to prevent the special characters being evaluated by the parser when parsed at the top-level. Readlink causes re-evaluation of the embedded string. 4.36 eval(path, expression) --------------------------- Follow (arg1), and evaluate the (arg2) in the context of the file discovered by following . All inode attributes, pathname, name and depth all refer to the file discovered by following . This test operation allows you to add additional context to the evaluation of the file being scanned, such as "if the current file is XXX, test if the parent is YYY, and then do ...". Often times you need or want to test a combination of file status. The can be absolute (in which case it is from the root directory of the output filesystem), or it can be relative to the current file. Obviously relative paths are more useful. If the file referenced by does not exist in the output filesystem, then FALSE is returned. Examples of usage: 1. If a directory matches pattern, check that it contains a ".git" directory. This allows you to exclude git repositories, with a double check that it is a git repository by checking for the .git subdirectory. prune@name(*linux*) && type(d) && eval(.git, "type(d)") This action will match on any directory named *linux*, and exclude it if it contains a .git subdirectory. 2. If a file matches a pattern, check that the parent directory matches another pattern. This allows you to delete files if and only if they are in a particular directory. prune@name(*.[ch]) && eval(.., "name(*linux*)") This action will delete *.[ch] files, but, only if they are in a directory matching *linux*. 4.37 false ---------- Always returns FALSE. 4.38 true --------- Always returns TRUE. 5. Actions ========== An action is something which is done (or applied) to a file if the expression (made up of the above test operators) returns TRUE. Different actions are applied in separate phases or gated, rather than being applied all at once. This is to ensure that you know what the overall state of the filesystem is when an action is applied. Or to put it another way, if you have an action that depends on another action having already been processed (for the entire filesystem), you'll want to know that is how they will be applied. 5.1 Actions applied at source filesystem reading (stage 1) ---------------------------------------------------------- 5.1.1 exclude() --------------- This action excludes all files and directories where the expression returns TRUE. Obviously this action allows much greater control over which files are excluded than the current name/pathname matching. Examples: 1. Exclude any files/directories belonging to user phillip exclude@user(phillip) 2. Exclude any regular files larger than 1M exclude@filesize(>1M) 3. Only archive files/directories to a depth of 3 exclude@depth(>3) 4. As above but also exclude directories at the depth of 3 (which will be empty due to the above exclusion) exclude@depth(>3) || (depth(3) && type(d)) Which obviously reduces to exclude@depth(3) && type(d) Note: the following tests do not work in stage 1, and so they can't be used in the exclude() action (see prune() action for explanation and alternative). dircount() dircount_range() exists() absolute() readlink() eval() 5.2 Actions applied at directory scanning (stage 2) --------------------------------------------------- 5.2.1 fragment(name) -------------------- Place all files matching the expression into a specialised fragment named . This can increase compression and/or improve I/O by placing similar fragments together. Examples: 1. fragment(cfiles)@name(*.[ch]) Place all C files into special fragments reserved for them. 2. fragment(phillip)@user(phillip) Place all files owned by user Phillip into special fragments. 5.2.2 fragments() ----------------- Tell Mksquashfs to use fragment packing for the files matching the expression. For obvious reasons this should be used in conjunction with the global Mksquashfs option -no-fragments. By default all files are packed into fragments if they're less than the block size. 5.2.3 no-fragments() -------------------- Tell Mksquashfs to not pack the files matching the expression into fragments. This can be used where you want to optimise I/O latency by not packing certain files into fragments. 5.2.4 tailend() --------------- Tell Mksquashfs to use tail-end packing for the files matching the expression. Normally Mksquashfs does not pack tail-ends into fragments, as it may affect I/O performance because it may produce more disk head seeking. But tail-end packing can increase compression. Additionally with modern solid state media, seeking is not such a major issue anymore. 5.2.5. no-tailend() ------------------- Tell Mksquashfs not to use tail-end packing for the files matching the exppression. For obvious reasons this should be used in conjuction with the global Mksquashfs option -always-use-fragments. By default tail-ends are not packed into fragments. 5.2.6 compressed() ------------------ Tell Mksquashfs to compress the fies matching the expression. For obvious reasons this should be used in conjunction with the global Mksquashfs options -noD and -noF. File are by default compressed. 5.2.7 uncompressed() -------------------- Tell Mksquashfs to not compress the files matching the expression. This action obviously can be used to avoid compressing already compressed files (XZ, GZIP etc.). 5.2.8 uid(uid or user) ---------------------- Set the ownership of the files matching the expression to uid (if arg1 is a number) or user (if arg1 is a string). 5.2.9 gid(gid or group) ----------------------- Set the group of the files matching the expression to gid (if arg1 is a number) or group (if arg1 is a string). 5.2.10 guid(uid/user, gid/group) -------------------------------- Set the uid/user and gid/group of the files matching the expression. 5.2.11 chmod(mode) ------------------ Mode can be octal, or symbolic. If Mode is Octal, the permission bits are set to the octal value. If Mode is Symbolic, permissions can be Set, Added or Removed. The symbolic mode is of the format [ugoa]*[[+-=]PERMS]+ PERMS = [rwxXst]+ or [ugo] and the above sequence can be repeated separated with commas. A combination of the letters ugoa, specify which permission bits will be affected, u means user, g means group, o means other, and a means all or ugo. The next letter is +, - or =. The letter + means add to the existing permission bits, - means remove the bits from the existing permission bits, and = means set the permission bits. The permission bits (PERMS) are a combination of [rwxXst] which sets/adds/removes those bits for the specified ugoa combination. They can alternatively be u, g or o, which takes the permission bits from the user, group or other of the file respectively. Examples: 1. chmod(u+r) Adds the read permission to user. 2. chmod(ug+rw) Adds the read and write permissions to both user and group. 3. chmod(u=rw,go=r) Sets the permissions to rw-r--r--, which is eqivalent to 4. chmod(644) 5. cgmod(ug=o) Sets the user and group permissions to the permissions for other. 5.3 Actions applied at second directory scan (stage 3) ------------------------------------------------------ 5.3.1 prune() The prune() action deletes the file or directory (and everything underneath it) that matches the expression. In that respect it is identical to the exclude() action, except that it takes place in the third stage, rather than the first stage. There are a number of reasons to have a prune() action in addition to an exclude() action. 1. In the first stage Mksquashfs is building an in-memory representation of the filesystem to be compressed. At that point some of the tests don't work because they rely on an in-memory representation having been built. So the following tests don't work in stage 1, and so they can't be used in the exclude() action. dircount() dircount_range() exists() absolute() readlink() eval() If you want to use these tests, you have to use the prune() action. 2. Many exclusion/pruning operations may only be easily applied after transformation actions have been applied in stages 1 & 2. For example, you may change the ownership and permissions of matching files in stage 2, and then want to delete files based on some criteria which relies on this having taken place. 5.4. Actions applied at third directory scan (stage 4) ------------------------------------------------------ 5.4.1 empty(reason) The empty() action deletes any directory which matches the expression, and which is also empty for . is one of "excluded", "source" and "all". If no argument is given, empty() defaults to "all". The reason "excluded" means the directory has become empty due to the exclude() or prune() actions or by exclusion on the command line. The reason "source" means the directory was empty in the source filesystem. The reason "all" means it is empty for either one of the above two reasons. This action is often useful when exclusion has produced an empty directory, or a hierarchy of directories which are empty but for a sub-directory which is empty but for a sub-directory until an empty directory is reached. Example 1. Exclude any file which isn't a directory, and then clean-up any directories which are empty as a result. exclude@!type(d) empty(excluded)@true This will produce an empty filesystem, unless there were some directories that were originally empty. Changing the empty action to exclude@!type(d) empty@true Will produce an empty filesystem. squashfs-tools-4.5/CHANGES000066400000000000000000000754451407635035400153760ustar00rootroot00000000000000 SQUASHFS CHANGE LOG 4.5 22 JUL 2021 Major improvements including: Actions, Sqfstar, tar and cpio style reading of input sources, Sqfscat 1. Mksquashfs improvements 1.1 Mksquashfs now supports "Actions". These are modelled on "find" and allow compression, fragment packing, file exclusion and file attributes to be changed. 1.2 New sqfstar command which will create a Squashfs image from a tar archive. 1.3 Tar style handling of source pathnames in Mksquashfs. 1.4 Cpio style handling of source pathnames in Mksquashfs. 1.5 New option to throttle the amount of CPU and I/O. 1.6 New Pseudo file definitions which support timestamps. 1.7 New Pseudo file definitions to create File references. 1.8 New Pseudo file definitions to create Sockets/Fifos. 1.9 Mksquashfs now allows no source directory to be specified. 1.10 New Pseudo file "R" definition which allows a Regular file to be created with data stored within the Pseudo file. 2. Major improvements in Unsquashfs 2.1 Sqfscat command which outputs files to stdout. 2.2 Symbolic links are now followed in extract files (using -follow-symlinks or -missing-symlinks). 2.3 Unsquashfs now supports "exclude" files. 2.4 Max depth traversal option added. 2.5 Unsquashfs can now output a "Pseudo file" representing the input Squashfs filesystem. 3. Minor improvements and bug fixes 3.1 The progress bar is now displayed and updated whilst the input is being scanned. 3.2 New -one-file-system option in Mksquashfs. 3.3 New -no-hardlinks option in Mksquashfs. 3.4 New -help options in Mksquashfs and Unsquashfs which output to standard out. 3.5 New -root-uid option in Mksquashfs. 3.6 New -root-gid option in Mksquashfs. 3.7 New -root-time option in Mksquashfs. 3.8 -no-exit-code option added to Unsquashfs which makes it not output an error exit code. 3.9 Exit code in Unsquashfs changed to distinguish between non-fatal errors (exit 2), and fatal errors (exit 1). 3.10 Mksquashfs when appending, now writes the recovery file to the home directory, rather than the current directory. 3.11 New -recovery-path option. 3.12 Xattr id count added in Unsquashfs "-stat" output. 3.13 Unsquashfs "write outside directory" exploit fixed. 3.14 Error handling in Unsquashfs writer thread fixed. 3.15 Fix failure to truncate destination if appending aborted. 3.16 Prevent Mksquashfs reading the destination file. 4.4 29 AUG 2019 Reproducible builds, new compressors, CVE fixes, security hardening and new options for Mksquashfs/Unsquashfs. 1. Overall improvements: 1.1 Mksquashfs now generates reproducible images by default. 1.2 Mkfs time and file timestamps can also be specified. 1.3 Support for the Zstandard (ZSTD) compression algorithm. 1.4 CVE-2015-4645 and CVE-2015-4646 have been fixed. 2. Mksquashfs improvements and major bug fixes: 2.1 Pseudo files now support symbolic links. 2.2 New -mkfs-time option. 2.3 New -all-time option. 2.4 New -root-mode option. 2.5 New -quiet option. 2.6 New -noId option. 2.7 New -offset option. 2.8 Update lz4 wrapper to use new functions introduced in 1.7.0. 2.9 Bug fix, don't allow "/" pseudo filenames. 2.10 Bug fix, allow quoting of pseudo files, to better handle filenames with spaces. 2.11 Fix compilation with glibc 2.25+. 3. Unsquashfs improvements and major bug fixes: 3.1 CVE-2015-4645 and CVE-2015-4646 have been fixed. 3.2 Unsquashfs has been further hardened against corrupted filestems. 3.3 Unsquashfs is now more strict about error handling. 3.4 New -ignore-errors option. 3.5 New -strict-errors option. 3.6 New -lln[umeric] option. 3.7 New -lc option. 3.8 New -llc option. 3.9 New -mkfs-time option. 3.10 New -UTC option. 3.11 New -offset option. 3.12 New -quiet option. 3.13 Update lz4 wrapper to use new functions introduced in 1.7.0. 3.14 Bug fix, fatal and non-fatal errors now set the exit code to 1. 3.15 Bug fix, fix time setting for symlinks. 3.16 Bug fix, try to set sticky-bit when running as a user process. 3.17 Fix compilation with glibc 2.25+. 4.3 12 MAY 2014 New compressor options, new Mksquashfs/Unsquashfs functionality, duplicate checking optimisations, stability improvements (option/file parsing, buffer/memory overflow checks, filesystem hardening on corrupted filesystems), CVE fixes. Too many changes to do the traditional custom changelog. But, this is now unnecessary, so instead list most significant 15% of commits from git changelog in chronological order. - unsquashfs: add checks for corrupted data in opendir functions - unsquashfs: completely empty filesystems incorrectly generate an error - unsquashfs: fix open file limit - mksquashfs: Use linked list to store directory entries rather - mksquashfs: Remove qsort and add a bottom up linked list merge sort - mksquashfs: optimise lookup_inode2() for dirs - pseudo: fix handling of modify pseudo files - pseudo: fix handling of directory pseudo files - xattr: Fix ERROR() so that it is synchronised with the progress bar - mksquashfs/sort: Fix INFO() so that it is synced with the progress bar - mksquashfs: Add -progress to force progress bar when using -info - error.h: consolidate the various error macros into one header file - mksquashfs: fix stack overflow in write_fragment_table() - mksquashfs: move list allocation from off the stack - unsquashfs: fix oversight in directory permission setting - mksquashfs: dynamically allocate recovery_file - mksquashfs: dynamically allocate buffer in subpathname() - mksquashfs: dynamically allocate buffer in pathname() - unsquashfs: fix CVE-2012-4024 - unsquashfs: fix CVE-2012-4025 - mksquashfs: fix potential stack overflow in get_component() - mksquashfs: add parse_number() helper for numeric command line options - mksquasfs: check return value of fstat() in reader_read_file() - mksquashfs: dynamically allocate filename in old_add_exclude() - unsquashfs: dynamically allocate pathname in dir_scan() - unsquashfs: dynamically allocate pathname in pre_scan() - sort: dynamically allocate filename in add_sort_list() - mksquashfs: fix dir_scan() exit if lstat of source directory fails - pseudo: fix memory leak in read_pseudo_def() if exec_file() fails - pseudo: dynamically allocate path in dump_pseudo() - mksquashfs: dynamically allocate path in display_path2() - mksquashfs: dynamically allocate b_buffer in getbase() - pseudo: fix potential stack overflow in get_component() - pseudo: avoid buffer overflow in read_pseudo_def() using sscanf() - pseudo: dynamically allocate filename in exec_file() - pseudo: avoid buffer overflow in read_sort_file() using fscanf() - sort: tighten up sort file parsing - unsquashfs: fix name under-allocation in process_extract_files() - unsquashfs: avoid buffer overflow in print_filename() using sprintf() - Fix some limits in the file parsing routines - pseudo: Rewrite pseudo file processing - read_fs: fix small memory leaks in read_filesystem() - mksquashfs: fix fclose leak in reader_read_file() on I/O error - mksquashfs: fix frag struct leak in write_file_{process|blocks|frag} - unsquashfs_xattr: fix memory leak in write_xattr() - read_xattrs: fix xattr free in get_xattr() in error path - unsquashfs: add -user-xattrs option to only extract user.xxx xattrs - unsquashfs: add code to only print "not superuser" error message once - unsquashfs: check for integer overflow in user input - mksquashfs: check for integer overflow in user input - mksquashfs: fix "new" variable leak in dir_scan1() - read_fs: prevent buffer {over|under}flow in read_block() with corrupted filesystems - read_fs: check metadata blocks are expected size in scan_inode_table() - read_fs: check the root inode block is found in scan_inode_table() - read_fs: Further harden scan_inode_table() against corrupted filesystems - unsquashfs: prevent buffer {over|under}flow in read_block() with corrupted filesystems - read_xattrs: harden xattr data reading against corrupted filesystems - unsquash-[23]: harden frag table reading against corrupted filesystems - unsquash-4.c: harden uid/gid & frag table reading against corruption - unsquashfs: harden inode/directory table reading against corruption - mksquashfs: improve out of space in output filesystem handling - mksquashfs: flag lseek error in writer as probable out of space - mksquashfs: flag lseek error in write_destination as probable out of space - mksquashfs: print file being squashed when ^\ (SIGQUIT) typed - mksquashfs: make EXIT_MKSQUASHFS() etc restore via new restore thread - mksquashfs: fix recursive restore failure check - info: dump queue and cache status if ^\ hit twice within one second - mksquashfs: fix rare race condition in "locked fragment" queueing - lz4: add experimental support for lz4 compression - lz4: add support for lz4 "high compression" - lzo_wrapper: new implementation with compression options - gzip_wrapper: add compression options - mksquashfs: redo -comp parsing - mksquashfs: display compressor options when -X option isn't recognised - mksquashfs: add -Xhelp option - mksquashfs/unsquashfs: fix mtime signedness - Mksquashfs: optimise duplicate checking when appending - Mksquashfs: introduce additional per CPU fragment process threads - Mksquashfs: significantly optimise fragment duplicate checking - read_fs: scan_inode_table(), fix memory leak on filesystem corruption - pseudo: add_pseudo(), fix use of freed variable - mksquashfs/unsquashfs: exclude/extract/pseudo files, fix handling of leaf name - mksquashfs: rewrite default queue size so it's based on physical mem - mksquashfs: add a new -mem option - mksquashfs: fix limit on the number of dynamic pseudo files - mksquashfs: make -mem take a normal byte value, optionally with a K, M or G 4.2 28 FEB 2011 XZ compression, and compression options support 1. Filesystem improvements: 1.1 Added XZ compression 1.2 Added compression options support 2. Miscellaneous improvements/bug fixes 1.1 Add missing NO_XATTR filesystem flag to indicate no-xattrs option was specified and no xattrs should be stored when appending. 1.2 Add suppport in Unquashfs -stat option for displaying NO_XATTR flag. 1.3 Remove checkdata entry from Unsquashfs -stat option if a 4.0 filesystem - checkdata is no longer supported. 1.4 Fix appending bug when appending to an empty filesystem - this would be incorrectly treated as an error. 1.5 Use glibc sys/xattr.h include rather than using attr/xattr.h which isn't present by default on some distributions. 1.6 Unsquashfs, fix block calculation error with regular files when file size is between 2^32-block_size+1 and 2^32-1. 1.7 Unsquashfs, fix sparse file writing when holes are larger than 2^31-1. 1.8 Add external CFLAGS and LDFLAGS support to Makefile, and allow build options to be specified on command line. Also don't over-write passed in CFLAGS definition. 4.1 19 SEPT 2010 Major filesystem and tools improvements 1. Filesystem improvements: 1.1 Extended attribute support 1.2 New compression framework 1.3 Support for LZO compression 1.4 Support for LZMA compression (not yet in mainline) 2. Mksquashfs improvements: 1.1 Enhanced pseudo file support 1.2 New options for choosing compression algorithm used 1.3 New options for controlling extended attributes 1.4 Fix misalignment issues with memcpy etc. seen on ARM 1.5 Fix floating point error in progress_bar when max == 0 1.6 Removed use of get_nproc() call unavailable in ulibc 1.7 Reorganised help text 3. Unsquashfs improvements: 1.1 New options for controlling extended attributes 1.2 Fix misalignment issues with memcpy etc. seen on ARM 1.3 Fix floating point error in progress_bar when max == 0 1.4 Removed use of get_nproc() call unavailable in ulibc 4.0 5 APR 2009 Major filesystems improvements 1. Kernel code improvements: 1.1 Fixed little endian layout adopted. All swapping macros removed, and in-line swapping added for big-endian architectures. 1.2 Kernel code substantially improved and restructured. 1.3 Kernel code split into separate files along functional lines. 1.4 Vmalloc usage removed, and code changed to use separately allocated 4K buffers 2. Unsquashfs improvements: 2.1 Support for 4.0 filesystems added. 2.2 Swapping macros rewritten. 2.3 Unsquashfs code restructured and split into separate files. 3. Mksquashfs improvements: 3.1 Swapping macros rewritten. Fixed little-endian layout allows code to be optimised and only added at compile time for big endian systems. 3.2 Support for pseudo files added. 3.4 26 AUG 2008 Performance improvements to Unsquashfs, Mksquashfs and the kernel code. Plus many small bug fixes. 1. Kernel code improvements: 1.1 Internal Squashfs kernel metadata and fragment cache implementations have been merged and optimised. Spinlocks are now used, locks are held for smaller periods and wakeups have been minimised. Small race condition fixed where if two or more processes tried to read the same cache block simultaneously they would both read and decompress it. 10-20%+ speed improvement has been seen on tests. 1.2 NFS export code rewritten following VFS changes in linux-2.6.24. 1.3 New patches for linux-2.6.25, linux-2.6.26, and linux-2.6.27. Fixed patch for linux-2.6.24. 1.4 Fixed small buffer_head leak in squashfs_read_data when handling badly corrupted filesystems. 1.5 Fixed bug in get_dir_index_using_offset. 2. Unsquashfs improvements: 2.1 Unsquashfs has been parallelised. Filesystem reading, writing and decompression is now multi-threaded. Up to 40% speed improvement seen on tests. 2.2 Unsquashfs now has a progress bar. Use -no-progress to disable it. 2.3 Fixed small bug where unistd.h wasn't being included on some distributions, leading to lseek being used rather than lseek64 - which meant on these distributions Unsquashfs couldn't unsquash filesystems larger than 4GB. 3. Mksquashfs improvements: 3.1 Removed some small remaining parallelisation bottlenecks. Depending on source filesystem, up to 10%+ speed improvement. 3.2 Progress bar improved, and moved to separate thread. 3.3 Sparse file handling bug in Mksquashfs 3.3 fixed. 3.4 Two rare appending restore bugs fixed (when ^C hit twice). 3.3 1 NOV 2007 Increase in block size, sparse file support, Mksquashfs and Unsquashfs extended to use pattern matching in exclude/extract files, plus many more improvements and bug fixes. 1. Filesystem improvements: 1.1. Maximum block size has been increased to 1Mbyte, and the default block size has been increased to 128 Kbytes. This improves compression. 1.2. Sparse files are now supported. Sparse files are files which have large areas of unallocated data commonly called holes. These files are now detected by Squashfs and stored more efficiently. This improves compression and read performance for sparse files. 2. Mksquashfs improvements: 2.1. Exclude files have been extended to use wildcard pattern matching and regular expressions. Support has also been added for non-anchored excludes, which means it is now possible to specify excludes which match anywhere in the filesystem (i.e. leaf files), rather than always having to specify exclude files starting from the root directory (anchored excludes). 2.2. Recovery files are now created when appending to existing Squashfs filesystems. This allows the original filesystem to be recovered if Mksquashfs aborts unexpectedly (i.e. power failure). 3. Unsquashfs improvements: 3.1. Multiple extract files can now be specified on the command line, and the files/directories to be extracted can now also be given in a file. 3.2. Extract files have been extended to use wildcard pattern matching and regular expressions. 3.3. Filename printing has been enhanced and Unquashfs can now display filenames with file attributes ('ls -l' style output). 3.4. A -stat option has been added which displays the filesystem superblock information. 3.5. Unsquashfs now supports 1.x filesystems. 4. Miscellaneous improvements/bug fixes: 4.1. Squashfs kernel code improved to use SetPageError in squashfs_readpage() if I/O error occurs. 4.2. Fixed Squashfs kernel code bug preventing file seeking beyond 2GB. 4.3. Mksquashfs now detects file size changes between first phase directory scan and second phase filesystem create. It also deals better with file I/O errors. 3.2-r2 15 JAN 2007 Kernel patch update and progress bar bug fix 1. Kernel patches 2.6.19/2.6.20 have been updated to use const structures and mutexes rather than older semaphores. 2. Minor SMP bug fixes. 3. Progress bar broken on x86-64. Fixed. 3.2 2 JAN 2007 NFS support, improvements to the Squashfs-tools, major bug fixes, lots of small improvements/bug fixes, and new kernel patches. Improvements: 1. Squashfs filesystems can now be exported via NFS. 2. Unsquashfs now supports 2.x filesystems. 3. Mksquashfs now displays a progress bar. 4. Squashfs kernel code has been hardened against accidently or maliciously corrupted Squashfs filesystems. Bug fixes: 5. Race condition occurring on S390 in readpage() fixed. 6. Odd behaviour of MIPS memcpy in read_data() routine worked-around. 7. Missing cache_flush in Squashfs symlink_readpage() added. 3.1-r2 30 AUG 2006 Mksquashfs -sort bug fix A code optimisation after testing unfortunately broke sorting in Mksquashfs. This has been fixed. 3.1 19 AUG 2006 This release has some major improvements to the squashfs-tools, a couple of major bug fixes, lots of small improvements/bug fixes, and new kernel patches. 1. Mksquashfs has been rewritten to be multi-threaded. It has the following improvements 1.1. Parallel compression. By default as many compression and fragment compression threads are created as there are available processors. This significantly speeds up performance on SMP systems. 1.2. File input and filesystem output is peformed in parallel on separate threads to maximise I/O performance. Even on single processor systems this speeds up performance by at least 10%. 1.3. Appending has been significantly improved, and files within the filesystem being appended to are no longer scanned and checksummed. This significantly improves append time for large filesystems. 1.4. File duplicate checking has been optimised, and split into two separate phases. Only files which are considered possible duplicates after the first phase are checksummed and cached in memory. 1.5 The use of swap memory was found to significantly impact performance. The amount of memory used to cache files is now a command line option, by default this is 512 Mbytes. 2. Unsquashfs has the following improvements 2.1 Unsquashfs now allows you to specify the filename or the directory within the Squashfs filesystem that is to be extracted, rather than always extracting the entire filesystem. 2.2 A new -force option has been added which forces Unsquashfs to output to the destination directory even if files and directories already exist in the destination directory. This allows you to update an already existing directory tree, or to Unsquashfs to a partially filled directory tree. Without the -force option Unsquashfs will refuse to output. 3. The following major bug fixes have been made 3.1 A fragment table rounding bug has been fixed in Mksquashfs. Previously if the number of fragments in the filesystem were a multiple of 512, Mksquashfs would generate an incorrect filesystem. 3.2 A rare SMP bug which occurred when simultaneously acccessing multiply mounted Squashfs filesystems has been fixed. 4. Miscellaneous improvements/bug fixes 4.1 Kernel code stack usage has been reduced. This is to ensure Squashfs works with 4K stacks. 4.2 Readdir (Squashfs kernel code) has been fixed to always return 0, rather than the number of directories read. Squashfs should now interact better with NFS. 4.3 Lseek bug in Mksquashfs when appending to larger than 4GB filesystems fixed. 4.4 Squashfs 2.x initrds can now been mounted. 4.5 Unsquashfs exit status fixed. 4.6 New patches for linux-2.6.18 and linux-2.4.33. 3.0 15 MAR 2006 Major filesystem improvements 1. Filesystems are no longer limited to 4 GB. In theory 2^64 or 4 exabytes is now supported. 2. Files are no longer limited to 4 GB. In theory the maximum file size is 4 exabytes. 3. Metadata (inode table and directory tables) are no longer restricted to 16 Mbytes. 4. Hardlinks are now suppported. 5. Nlink counts are now supported. 6. Readdir now returns '.' and '..' entries. 7. Special support for files larger than 256 MB has been added to the Squashfs kernel code for faster read access. 8. Inode numbers are now stored within the inode rather than being computed from inode location on disk (this is not so much an improvement, but a change forced by the previously listed improvements). 2.2-r2 8 SEPT 2005 Second release of 2.2, this release fixes a couple of small bugs, a couple of small documentation mistakes, and adds a patch for kernel 2.6.13. 1. Mksquashfs now deletes the output filesystem image file if an error occurs whilst generating the filesystem. Previously on error the image file was left empty or partially written. 2. Updated mksquashfs so that it doesn't allow you to generate filesystems with block sizes smaller than 4K. Squashfs hasn't supported block sizes less than 4K since 2.0-alpha. 3. Mksquashfs now ignores missing files/directories in sort files. This was the original behaviour before 2.2. 4. Fixed small mistake in fs/Kconfig where the version was still listed as 2.0. 5. Updated ACKNOWLEDGEMENTS file. 2.2 3 JUL 2005 This release has some small improvements, bug fixes and patches for new kernels. 1. Sort routine re-worked and debugged from release 2.1. It now allows you to give Mkisofs style sort files and checks for filenames that don't match anything. Sort priority has also been changed to conform to Mkisofs usage, highest priority files are now placed at the start of the filesystem (this means they will be on the inside of a CD or DVD). 2. New Configure options for embedded systems (memory constrained systems). See INSTALL file for further details. 3. Directory index bug fixed where chars were treated as signed on some architectures. A file would not be found in the rare case that the filename started with a chracter greater than 127. 4. Bug introduced into the read_data() routine when sped up to use data block queueing fixed. If the second or later block resulted in an I/O error this was not checked. 5. Append bug introduced in 2.1 fixed. The code to compute the new compressed and uncompressed directory parts after appending was wrong. 6. Metadata block length read routine altered to not perform a misaligned short read. This was to fix reading on an ARM7 running uCLinux without a misaligned read interrupt handler. 7. Checkdata bug introduced in 2.1 fixed. 2.1-r2 15 DEC 2004 Code changed so it can be compiled with gcc 2.x 1. In some of the code added for release 2.1 I unknowingly used some gcc extensions only supported by 3.x compilers. I have received a couple of reports that the 2.1 release doesn't build on 2.x and so people are clearly still using gcc 2.x. The code has been rewritten to remove these extensions. 2.1 10 DEC 2004 Significantly improved directory handling plus numerous other smaller improvements 1. Fast indexed directories implemented. These speed up directory operations (ls, file lookup etc.) significantly for directories larger than 8 KB. 2. All directories are now sorted in alphabetical order. This again speeds up directory operations, and in some cases it also results in a small compression improvement (greater data similarity between files with alphabetically similar names). 3. Maximum directory size increased from 512 KB to 128 MB. 4. Duplicate fragment checking and appending optimised in mksquashfs, depending on filesystem, this is now up to 25% faster. 5. Mksquashfs help information reformatted and reorganised. 6. The Squashfs version and release date is now printed at kernel boot-time or module insertion. This addition will hopefully help to reduce the growing problem where the Squashfs version supported by a kernel is unknown and the kernel source is unavailable. 7. New PERFORMANCE.README file. 8. New -2.0 mksquashfs option. 9. CHANGES file reorganised. 10. README file reorganised, clarified and updated to include the 2.0 mksquashfs options. 11. New patch for Linux 2.6.9. 12. New patch for Linux 2.4.28. 2.0r2 29 AUG 2004 Workaround for kernel bug in kernels 2.6.8 and newer added 1. New patch for kernel 2.6.8.1. This includes a workaround for a kernel bug introduced in 2.6.7bk14, which is present in all later versions of the kernel. If you're using a 2.6.8 kernel or later then you must use this 2.6.8.1 patch. If you've experienced hangs or oopses using Squashfs with a 2.6.8 or later kernel then you've hit this bug, and this patch will fix it. It is worth mentioning that this kernel bug potentially affects other filesystems. If you receive odd results with other filesystems you may be experiencing this bug with that filesystem. I submitted a patch but this has not yet gone into the kernel, hopefully the bug will be fixed in later kernels. 2.0 13 JULY 2004 A couple of new options, and some bug fixes 1. New mksquashfs -all-root, -root-owned, -force-uid, and -force-gid options. These allow the uids/gids of files in the generated filesystem to be specified, overriding the uids/gids in the source filesystem. 2. Initrds are now supported for kernels 2.6.x. 3. amd64 bug fixes. If you use an amd64, please read the README-AMD64 file. 4. Check-data and gid bug fixes. With 2.0-alpha when mounting 1.x filesystems in certain cases file gids were corrupted. 5. New patch for Linux 2.6.7. 2.0-ALPHA 21 MAY 2004 Filesystem changes and compression improvements 1. Squashfs 2.0 has added the concept of fragment blocks. Files smaller than the file block size and optionally the remainder of files that do not fit fully into a block (i.e. the last 32K in a 96K file) are packed into shared fragments and compressed together. This achieves on average 5 - 20% better compression than Squashfs 1.x. 2. The maximum block size has been increased to 64K (in the ALPHA version of Squashfs 2.0). 3. The maximum number of UIDs has been increased to 256 (from 48 in 1.x). 4. The maximum number of GIDs has been increased to 256 (from 15 in 1.x). 5. Removal of sleep_on() function call in 2.6.x patch, to allow Squashfs to work on the Fedora rc2 kernel. 6. Numerous small bug fixes have been made. 1.3r3 18 JAN 2004 Third release of 1.3, this adds a new mksquashfs option, some bug fixes, and extra patches for new kernels 1. New mksquashfs -ef exclude option. This option reads the exclude dirs/files from an exclude file, one exclude dir/file per line. This avoids the command line size limit when using the -e exclude option, 2. When appending to existing filesystems, if mksquashfs experiences a fatal error (e.g. out of space when adding to the destination), the original filesystem is restored, 3. Mksquashfs now builds standalone, without the kernel needing to be patched. 4. Bug fix in the kernel squashfs filesystem, where the pages being filled were not kmapped. This seems to only have caused problems on an Apple G5, 5. New patch for Linux 2.4.24, 6. New patch for Linux 2.6.1, this replaces the patch for 2.6.0-test7. 1.3r2 14 OCT 2003 Second release of 1.3, bug fixes and extra patches for new kernels 1. Bug fix in routine that adds files to the filesystem being generated in mksquashfs. This bug was introduced in 1.3 (not enough testing...) when I rewrote it to handle files larger than available memory. This bug caused a SEGV, so if you've ever got that, it is now fixed, 2. Long running bug where ls -s and du reported wrong block size fixed. I'm pretty sure this used to work many kernel versions ago (2.4.7) but it broke somewhere along the line since then, 3. New patch for Linux 2.4.22, 4. New patch for 2.6.0-test7, this replaces the patch for 2.6.0-test1. 1.3 29 JUL 2003 FIFO/Socket support added plus optimisations and improvements 1. FIFOs and Socket inodes are now supported, 2. Mksquashfs can now compress files larger than available memory, 3. File duplicate check routine optimised, 4. Exit codes fixed in Mksquashfs, 5. Patch for Linux 2.4.21, 6. Patch for Linux 2.6.0-test1. Hopefully, this will work for the next few releases of 2.6.0-testx, otherwise, I'll be releasing a lot of updates to the 2.6.0 patch... 1.2 13 MAR 2003 Append feature and new mksquashfs options added Mksquashfs can now add to existing squashfs filesystems. Three extra options "-noappend", "-keep-as-directory", and "root-becomes" have been added. 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. See the README file for usage changes. 1.1b 16 JAN 2003 Bug fix release Fixed readpage deadlock bug. This was a rare deadlock bug that happened when pushing pages into the page cache when using greater than 4K blocks. I never got this bug when I tested the filesystem, but two people emailed me on the same day about the problem! I fixed it by using a page cache function that wasn't there when I originally did the work, which was nice :-) 1.1 8 JAN 2003 Added features 1. Kernel squashfs can now mount different byte order filesystems. 2. Additional features added to mksquashfs. Mksquashfs now supports exclude files and multiple source files/directories can be specified. A nopad option has also been added, which informs mksquashfs not to pad filesystems to a multiple of 4K. See README for mksquashfs usage changes. 3. Greater than 2GB filesystems bug fix. Filesystems greater than 2GB can now be created. 1.0c 14 NOV 2002 Bug fix release Fixed bugs with initrds and device nodes 1.0 23 OCT 2002 Initial release squashfs-tools-4.5/COPYING000066400000000000000000000432541407635035400154270ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. squashfs-tools-4.5/INSTALL000066400000000000000000000033231407635035400154160ustar00rootroot00000000000000 INSTALLING SQUASHFS-TOOLS 4.5 1. Kernel support ----------------- This release is for 2.6.29 and newer kernels. Kernel patching is not necessary. Extended attribute support requires 2.6.35 or newer kernels. But file systems with extended attributes can be mounted on 2.6.29 and newer kernels (the extended attributes will be ignored with a warning). LZO compression support requires 2.6.36 or newer kernels. XZ compression support requires 2.6.38 or newer kernels. LZ4 compression support requires 3.11 or newer kernels. ZSTD compression support requires 4.14 or newer kernels. 2. Building squashfs tools -------------------------- The squashfs-tools directory contains the source code for the Mksquashfs, and Unsquashfs programs. These can be compiled by typing "make". This will also create symbolic links sqfstar and sqfscat. They can be installed, along with the symbolic links sqfstar and sqfscat, to /usr/local/bin by typing "sudo make install". 2.1 Compressors supported By default the Makefile is configured to build Mksquashfs and Unsquashfs with GZIP suppport. Read the Makefile in squashfs-tools for instructions on building LZO, LZ4, XZ and ZSTD compression support. 2.2 Extended attribute support By default the Makefile is configured to build Mksquashfs and Unsquashfs with extended attribute support. Read the Makefile in squashfs-tools for instructions on how to disable extended attribute support, if not supported by your distribution/C library, or if it is not needed. 2.3 Reproducible builds By default the Makefile is configured to build Mksquashfs with reproducible output as default. Read the Makefile in squashfs-tools for instructions on how to disable reproducible output as default if desired. squashfs-tools-4.5/README000066400000000000000000000003021407635035400152370ustar00rootroot00000000000000Squashfs-Tools Release 4.5 (2021-07-22) Please read README-4.5 for information on the new features and improvements. INSTALL gives information about configuring and installing Squashfs-Tools. squashfs-tools-4.5/README-4.5000066400000000000000000000742531407635035400155630ustar00rootroot00000000000000 SQUASHFS-TOOLS 4.5 - A squashed read-only filesystem for Linux Copyright 2002-2021 Phillip Lougher Released under the GPL licence (version 2 or later). Welcome to Squashfs-Tools 4.5. The last release was just under 2 years ago, and there are substantial improvements to the tools in this release. Please see the INSTALL file for instructions on installing the tools, and the USAGE file for additional documentation on how to use the tools. Summary of changes (and sections below) --------------------------------------- 1. Major improvements in Mksquashfs =================================== 1.1 Mksquashfs now supports "Actions". These are modelled on "find" and allow compression, fragment packing, file exclusion and file attributes to be changed on a per-file basis (see section 4). 1.2 New sqfstar command which will create a Squashfs image from a tar archive (see section 5). 1.3 Tar style handling of source pathnames in Mksquashfs. If option is specified, Mksquashfs will not strip leading directories (see section 6). 1.4 Cpio style handling of source pathnames in Mksquashfs. If this option is specified, files will be read in from stdin. No leading directories will be stripped (see section 7). 1.5 New option to throttle the amount of CPU and I/O Mksquashfs uses (see section 8). 1.6 New Pseudo file definitions which support timestamps (see section 9). 1.7 New Pseudo file definitions to create File references (Hard Links) (see section 10). 1.8 New Pseudo file definitions to create Sockets/Fifos (see section 11). 1.9 Mksquashfs now allows no source directory ( specified as - ) to be specified, with all input from pseudo file definitions (see section 12). 1.10 New Pseudo file "R" definition which allows a Regular file to be created with data stored within the Pseudo file (see 2.5 below). 2. Major improvements in Unsquashfs =================================== 2.1 New Sqfscat command which outputs the contents of files to standard out (see section 13). 2.2 Symbolic links are now followed in extract files, if -follow-symlinks or -missing-symlinks option specified (see section 14). 2.3 Unsquashfs now supports "exclude" files in addition to "extract" files (see section 15). 2.4 Max depth traversal option added (see section 16). 2.5 Unsquashfs can now output a "Pseudo file" representing the input Squashfs filesystem. This can be altered and given as input to Mksquashfs to re-generate the filesystem without unpacking it (see section 17). 3. Minor improvements and bug fixes =================================== 3.1 The progress bar is now displayed and updated whilst the input is being scanned (blocks to be compressed will increase). This means on large (or slow to read) input sources, Mksquashfs will not appear to hang doing nothing. 3.2 New -one-file-system option in Mksquashfs, which tells Mksquashfs to not cross filesystem boundaries when scanning the sources. 3.3 New -no-hardlinks option in Mksquashfs, which makes Mksquashfs treat hardlinked files as duplicates instead. 3.4 New -help options in Mksquashfs and Unsquashfs which output to standard out, rather than standard error. 3.5 New -root-uid option in Mksquashfs, which allows the uid of the root directory to be set. 3.6 New -root-gid option in Mksquashfs, which allows the gid of the root directory to be set. 3.7 New -root-time option in Mksquashfs, which allows the time of the root directory to be set. 3.8 -no-exit-code option added to Unsquashfs which makes it not output an error exit code. 3.9 Exit code in Unsquashfs changed to distinguish between non-fatal errors (exit of 2), and fatal errors (exit code of 1). 3.10 Mksquashfs when appending, now writes the recovery file to the home directory ($HOME), rather than the current directory. A new option -recovery-path has been added, which specifies that is to be used as the recovery file directory. 3.11 Xattr id count added in Unsquashfs "-stat" output. 3.12 Unsquashfs "write outside directory" exploit fixed. 3.13 Error handling in Unsquashfs writer thread fixed. 3.14 Fix failure to truncate destination file when appending aborted in Mksquashfs. 3.15 Prevent Mksquashfs reading the destination file as input. 4. Mksquashfs Actions Introduction ================================== The new 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. 5. New Sqfstar command to create image from a tar archive ========================================================= Mksquashfs when run as "sqfstar" (either named as such, or via a hard or symbolic link) will read a tar archive from standard in (stdin), and create a Squashfs image from it. Syntax: sqfstar [options] image [list of exclude dirs/files] Where is the output Squashfs filesystem. The tar archive should be uncompressed (pipe it though a decompressor if compressed). Sqfstar supports V7, ustar, bsdtar (libarchive), GNU tar and PAX extensions. Sparse file extensions are supported, including the "old GNU format, type S", and PAX formats, Versions 0.0, 0.1 and the current 1.0. Sqfstar supports extended attributes, and recognises the SCHILY xattr PAX extension (used by GNU tar), and the LIBARCHIVE xattr PAX extension (used by bsdtar). Files and directories may be excluded, and both anchored and non-anchored exclude files are supported (see section 3.5.2 in USAGE file and examples later). Wildcards (globbing) is supported by default. Sqfstar can also by invoked by running "mksquashfs source dest -tar", if the Sqfstar link isn't available. 5.1 Usage examples ------------------ % sqfstar image.sqfs < archive.tar Create a Squashfs image from archive.tar, using defaults (gzip compression, 128K blocks). % sqfstar -comp xz -b 1M image.sqfs < archive.tar As previous, but use XZ compression and 1Mbyte block sizes. % zcat archive.tgz | sqfstar image.sqfs Create a Squashfs image from a gzip compressed tar archive. % sqfstar -root-uid 0 -root-gid 0 image.sqfs < archive.tar Tar files do not supply a definition for the root directory, and the default is to make the directory owned/group owned by the user running Sqfstar. The above command sets the ownership/group ownership to root. % sqfstar -root-mode 0755 image.sqfs < archive.tar The default permissions for the root directory is 0777 (rwxrwxrwx). The above command sets the permissions to 0755 (rwxr-xr-x). % sqfstar image.sqsh dir1/file1 dir2/file2 < archive.tar Create a Squashfs image but exclude the files "file1" and "file2". % sqfstar image.sqsh "... *.[ch]" < archive.tar Create a Squashfs image but exclude any file matching "*.[ch]" anywhere in the archive. 5.2 Sqfstar options list ------------------------ The following is the full list of options supported by Sqfstar. Filesystem build options: -comp select compression Compressors available: gzip (default) -b set data block to . Default 128 Kbytes Optionally a suffix of K or M can be given to specify Kbytes or Mbytes respectively -reproducible build images that are reproducible (default) -not-reproducible build images that are not reproducible -mkfs-time