GENSQUASHFS(1) | User Commands | GENSQUASHFS(1) |
gensquashfs - generate squashfs images
gensquashfs [OPTIONS] <squashfs-file>
Generate a SquashFS image.
Option | Default |
uid=<value> | 0 |
gid=<value> | 0 |
mode=<value> | 0755 |
mtime=<value> | $SOURCE_DATE_EPOCH if set, 0 otherwise |
The input file contains a simple, newline separated list that describe the files to be included in the squashfs image:
# a comment file <path> <mode> <uid> <gid> [<location>] dir <path> <mode> <uid> <gid> nod <path> <mode> <uid> <gid> <dev_type> <maj> <min> slink <path> <mode> <uid> <gid> <target> link <path> <dummy> <dummy> <dummy> <target> pipe <path> <mode> <uid> <gid> sock <path> <mode> <uid> <gid> glob <path> <mode|*> <uid|*> <gid|*> [OPTIONS...] <location>
<path> | Absolute path of the entry in the image. Can be put in quotes if some components contain spaces. |
<location> | Optional location of the input file. Can be specified relative to either the description file or the pack directory. If omitted, the image path is used as a relative path. |
<target> | Symlink or hardlink target. |
<mode> | Mode/permissions of the entry. |
<uid> | Numeric user id. |
<gid> | Numeric group id. |
<dev_type> | Device type (b=block, c=character). |
<maj> | Major number of a device special file. |
<min> | Minor number of a device special file. |
The glob command requires an input location which is interpreted relative to the pack directory (or the input file if no directory was specified). This location is scanned recursively and the contents are added to the specified virtual path.
The specified mode, uid and gid are applied to all new entries added by the glob. They can alternatively be set to the special value * to use the value from the input directory.
In front of the source location, several additional options can be specified to control the behavior of the glob command:
Option | Description |
-type | Followed by a single space and a single, lowercase character describing the inode type to accept. Works similar to the -type option of the find command. Possible values are b (block devices), c (character devices), d (directories), p (named pipes), f (regular files), l (symlinks) and s (sockets). If -type is not used, all are accepted. The first use clamps the selection down to a single type and subsequent uses allow additional types. |
-xdev | Do not cross mount points during a recursive glob. |
-mount | An alias for -xdev |
-keeptime | Use the time stamps from the scanned files. |
-nonrecursive | Do not descend into directories. Even if the type argument does not include directories, it is still possible to recursively scan a hierarchy. In that case, the scanning will not add new directory nodes, but still recurse into a directory if a coresponding node already exist in the virtual filesystem tree. So a typicall use case might be to first scan only the directories, and then do several narrower globs to fill them. |
-name <pattern> | Only add entries if their name matches a shell glob pattern. If the pattern is supposed to contain spaces, it can be wrapped in quotation marks ("..." or '...'). |
-path <pattern> | Only add entries if their full resulting path in the SquashFS image matches a shell glob pattern. Slashes in the path are only matched against slashes in the pattern and will never match a wild card character or a bracket expression containing a slash. The path is normalized, so it won't have a leading or trailing slash. |
Any other, unknown string starting with - will be rejected as unknown option. If the input path starts with -, the sequence -- can be used to stop argument parsing, similar to many command line tools.
# A simple squashfs image dir /dev 0755 0 0 nod /dev/console 0600 0 0 c 5 1 dir /root 0700 0 0 dir /sbin 0755 0 0 # Add a file. Input is relative to pack dir or listing path file /sbin/init 0755 0 0 ../init/sbin/init # Read from ./bin/bash relative to pack dir or listing path # /bin is created implicitly with default attributes. file /bin/bash 0755 0 0 # file name with a space in it and a "special" name file "/opt/my app/\"special\"/data" 0600 0 0 # collect the contents of ./lib and put it under /usr/lib # mode and uid/gid are explictly set. First we collect the directory tree, # then all so files, then all symlinks that don't end in ".so" glob /usr/lib 0755 0 0 -type d ./lib glob /usr/lib 0755 0 0 -type f -name "*.so.*" ./lib glob /usr/lib 0777 0 0 -type l -name "*.so.*" ./lib
The sort file is has one entry per line, consisting of a numeric priority and a filename. The name and the priority are separated by one or more space character (including tabs) and the line can be intended. Any leeding or preceeding spaces are dropped.
The priority is a 64 bit number and can be negative. Files not listed in the sort file receive a default priority of 0. After processing the sort file, before packing the input files, the file list is sorted by priority, with lower values preceeding larger ones.
The given filename is matched against the actual path of the file in the SquashFS file in the resulting image. It is not matched against the input path, which may differ. Any file is allowed to match only once. The first match encountered in the sort file will be used.
Lines can be empty or contain a single line comment, started with #. Filenames can be wrapped can be wrapped in quotation marks ("...") if necessary, with \ serving as an escape character for quotation marks or itself.
To control the packing behavior, an optional list of flags can be inserted between the priority and the filename. The flags are wrappe in brackets and comma separated, e.g. [flag1,flag2,...]. The following flags are supported:
Flag | Description |
glob | Interpret the filename as a shell glob pattern and match all files that the pattern applies to. This performs path globbing, i.e. a wild card character (* or ?) or a bracket range ([]) cannot match a path separator. A slash must always be matched by an explicit slash. |
glob_no_path | Same as glob, but disables path globbing. Wild cards are allowed to match slashes. |
align | Force device block alignment of the matched files, i.e. the compressed output always starts at a multiple of the device block size. Padding is inserted before and after. |
dont_fragment | Do not perform tail-end packing for the matched files, always generate a sequence of independent blocks. |
dont_compress | Do not compress the matched files. Note that if tail-end packing is performed, the entire fragment block is left uncompressed. |
dont_deduplicate | Do not perform deduplication on the matched files. If they are packed and the data blocks or the tail end happens to match a previously packed file, keep them anyway. |
nosparse | Do not perform sparse file detection. If a matched file contians block of zero bytes, pack them as-is. |
# Specify a packing order with file globbing -8000 [glob] bin/* -5000 [glob] lib/* # glob_no_path means * is allowed to match / -1000 [glob_no_path] share/* # Our boot loader needs this -100000 [dont_compress,dont_fragment,nosparse] boot/vmlinuz # For demonstration, a quoted filename and no flags 1337 "usr/share/my \"special\" file "
The format for xattr files tries to be identical to the output of getfattr.
Attributes are listed as key-value pairs with an = sign in between.
If a line starts with `# file: `, the rest of the line is interpreted as an absolute path that the following xattrs are applied to.
Plain text values are wrapped in quotation marks ("...") and support some escape sequences. Currently supported are \", \\ and \0<octal-sequence>.
Raw binary values can encoded as hexadecimal or base64, by starting the value with a 0x or 0s prefix respectively.
# file: dev/ security.selinux="system_u:object_r:device_t:s0" user.beverage_preference=0xCAFECAFEDECAFBAD # file: dev/rfkill security.selinux="system_u:object_r:wireless_device_t:s0" system.posix_acl_access=0sSGVsbG8gdGhlcmUgOi0pCg==
If the command line switch --defaults is not used or no default mtime is specified, the value of the environment variable SOURCE_DATE_EPOCH is used for all file and filesystem timestamps.
If SOURCE_DATE_EPOCH is not set, not a parsable number or it is out of range, the timestamps default to 0.
Environment variables are only used if no explicit command line switches are set. Explicit command line switches are always preferred over the environment variables.
Written by David Oberhollenzer.
Copyright © 2019 David Oberhollenzer License GPLv3+: GNU
GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it. There is NO
WARRANTY, to the extent permitted by law.
November 2021 | generate squashfs images |