summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rw-r--r--bin/Makemodule.am4
-rw-r--r--bin/gensquashfs/gensquashfs.1201
-rw-r--r--bin/rdsquashfs/rdsquashfs.199
-rw-r--r--bin/sqfs2tar/sqfs2tar.193
-rw-r--r--bin/sqfsdiff/sqfsdiff.172
-rw-r--r--bin/tar2sqfs/tar2sqfs.1154
6 files changed, 623 insertions, 0 deletions
diff --git a/bin/Makemodule.am b/bin/Makemodule.am
index 2328d5c..298734d 100644
--- a/bin/Makemodule.am
+++ b/bin/Makemodule.am
@@ -41,4 +41,8 @@ if WITH_SELINUX
gensquashfs_CPPFLAGS += -DWITH_SELINUX
endif
+dist_man1_MANS += bin/gensquashfs/gensquashfs.1 bin/rdsquashfs/rdsquashfs.1
+dist_man1_MANS += bin/sqfs2tar/sqfs2tar.1 bin/tar2sqfs/tar2sqfs.1
+dist_man1_MANS += bin/sqfsdiff/sqfsdiff.1
+
bin_PROGRAMS += sqfs2tar tar2sqfs gensquashfs rdsquashfs sqfsdiff
diff --git a/bin/gensquashfs/gensquashfs.1 b/bin/gensquashfs/gensquashfs.1
new file mode 100644
index 0000000..9ef4ee8
--- /dev/null
+++ b/bin/gensquashfs/gensquashfs.1
@@ -0,0 +1,201 @@
+.TH GENSQUASHFS "1" "June 2019" "generate squashfs images" "User Commands"
+.SH NAME
+gensquashfs \- generate squashfs images
+.SH SYNOPSIS
+.B gensquashfs
+[\fI\,OPTIONS\/\fR] <squashfs-file>\/\fR
+.SH DESCRIPTION
+Generate a SquashFS image.
+.SH OPTIONS
+.TP
+\fB\-\-pack\-file\fR, \fB\-F\fR <file>
+Use a \fBgen_init_cpio\fR style description file. The file format is specified
+below. If \fB\-\-pack\-dir\fR is used, input file paths are relative to the
+pack directory, otherwise they are relative to the directory the pack file
+is in.
+.TP
+\fB\-\-pack\-dir\fR, \fB\-D\fR <directory>
+If \fB\-\-pack\-file\fR is used, this is the root path relative to which to
+read files. If no pack file is specified, pack the contents of the given
+directory into a SquashFS image. The directory becomes the root of the file
+system.
+.TP
+\fB\-\-compressor\fR, \fB\-c\fR <name>
+Select the compressor to use.
+Run \fBgensquashfs \-\-help\fR to get a list of all available compressors
+and the default selection.
+.TP
+\fB\-\-comp\-extra\fR, \fB\-X\fR <options>
+A comma separated list of extra options for the selected compressor. Specify
+\fBhelp\fR to get a list of available options.
+.TP
+\fB\-\-num\-jobs\fR, \fB\-j\fR <count>
+If libsquashfs was compiled with a built in thread pool based, parallel data
+compressor, this option can be used to set the number of compressor
+threads. If not set, the default is the number of available CPU cores.
+.TP
+\fB\-\-queue\-backlog\fR, \fB\-Q\fR <count>
+Maximum number of data blocks in the thread worker queue before the packer
+starts waiting for the block processors to catch up. Higher values result
+in higher memory consumption. Defaults to 10 times the number of workers.
+.TP
+\fB\-\-block\-size\fR, \fB\-b\fR <size>
+Block size to use for Squashfs image.
+Defaults to 131072.
+.TP
+\fB\-\-dev\-block\-size\fR, \fB\-B\fR <size>
+Device block size to padd the image to.
+Defaults to 4096.
+.TP
+\fB\-\-keep\-time\fR, \fB\-k\fR
+When using \fB\-\-pack\-dir\fR only, use the timestamps from the input files
+instead of setting defaults on all input paths. The root inode and the
+modification time on the SquashFS image itself will still be set to defaults.
+.TP
+\fB\-\-one\-file\-system\fR, \fB\-o\fR
+When using \fB\-\-pack\-dir\fR only, stay in the local filesystem and do not
+cross mount points.
+.TP
+\fB\-\-defaults\fR, \fB\-d\fR <options>
+A comma separated list of default values for
+implicitly created directories.
+The following values can be set:
+.TS
+tab(;) allbox;
+l l
+l l
+l l
+l l
+l l
+rd.
+\fBOption\fR;\fBDefault\fR
+uid=<value>;0
+gid=<value>;0
+mode=<value>;0755
+mtime=<value>;\fB$SOURCE\_DATE\_EPOCH\fR if set, 0 otherwise
+.TE
+.TP
+.TP
+\fB\-\-set\-uid\fR, \fB\-u\fR <number>
+Force the owners user ID for ALL inodes to this value, no matter what the pack
+file or directory entries actually specify.
+.TP
+\fB\-\-set\-gid\fR, \fB\-g\fR <number>
+Force the owners group ID for ALL inodes to this value, no matter what the pack
+file or directory entries actually specify.
+.TP
+\fB\-\-all\-root\fR
+A short hand for `\-\-set\-uid 0 \-\-set\-gid 0`.
+.TP
+\fB\-\-selinux\fR, \fB\-s\fR <file>
+If built with SELinux support, use the given SELinux label file to add context
+labels to the elements packed into the SquashFS image.
+.TP
+\fB\-\-exportable\fR, \fB\-e\fR
+Generate an export table for NFS support.
+.TP
+\fB\-\-no\-tail\-packing\fR, \fB\-T\fR
+Do not perform tail end packing on files that are larger than the specified
+block size.
+.TP
+\fB\-\-force\fR, \fB\-f\fR
+Overwrite the output file if it exists.
+.TP
+\fB\-\-quiet\fR, \fB\-q\fR
+Do not print out progress reports.
+.TP
+\fB\-\-help\fR, \fB\-h\fR
+Print help text and exit.
+.TP
+\fB\-\-version\fR, \fB\-V\fR
+Print version information and exit.
+.SH INPUT FILE FORMAT
+The input file contains a simple, newline separated list that describe the
+files to be included in the squashfs image:
+.PP
+.in +4n
+.nf
+# 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>
+.fi
+.in
+
+.TS
+tab(;) allbox;
+l l
+l l
+l l
+l l
+l l
+l l
+l l
+l l
+l l
+rd.
+<path>;T{
+Absolute path of the entry in the image. Can be put in quotes
+if some components contain spaces.
+T}
+<location>;T{
+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.
+T}
+<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.
+.TE
+
+.PP
+Example:
+.PP
+.in +4n
+.nf
+# 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
+.fi
+.in
+.SH ENVIRONMENT
+If the command line switch \fB\-\-defaults\fR is not used or no default mtime
+is specified, the value of the environment variable \fBSOURCE\_DATE\_EPOCH\fR
+is used for all file and filesystem timestamps.
+
+If \fBSOURCE\_DATE\_EPOCH\fR 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.
+.SH SEE ALSO
+rdsquashfs(1), tar2sqfs(1)
+.SH AUTHOR
+Written by David Oberhollenzer.
+.SH COPYRIGHT
+Copyright \(co 2019 David Oberhollenzer
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+.br
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
diff --git a/bin/rdsquashfs/rdsquashfs.1 b/bin/rdsquashfs/rdsquashfs.1
new file mode 100644
index 0000000..a5e1d77
--- /dev/null
+++ b/bin/rdsquashfs/rdsquashfs.1
@@ -0,0 +1,99 @@
+.TH RDSQUASHFS "1" "May 2019" "inspect SquashFS filesystems" "User Commands"
+.SH NAME
+rdsquashfs \- tool to examine or uncompress SquashFS filesystems
+.SH SYNOPSIS
+.B rdsquashfs
+[\fI\,OPTIONS\/\fR] \fI\,<squashfs-file>\/\fR
+.SH DESCRIPTION
+View or extract the contents of a squashfs image.
+.PP
+The following options can be used to specify what operation to perform. One
+of those has to be present:
+.TP
+\fB\-\-list\fR, \fB\-l\fR <path>
+Produce a directory listing similar to \fBls \-l\fR for a given path in
+the SquashFS image.
+.TP
+\fB\-\-cat\fR, \fB\-c\fR <path>
+If the specified path is a regular file in the image, extract it and dump
+its contents to stdout.
+.TP
+\fB\-\-xattr\fR, \fB\-x\fR <path>
+If the inode that the specified path resolves to has extended attributes, dump
+them as key value pairs to stdout.
+.TP
+\fB\-\-unpack\-path\fR, \fB\-u\fR <path>
+Unpack the specified sub directory from the image. To unpack everything,
+simply specify /.
+.TP
+\fB\-\-describe\fR, \fB\-d\fR
+Produce a file listing from the image compatible with the format consumed by
+gensquashfs.
+.PP
+The following options can be used to control the behaviour of the specified
+operation:
+.TP
+\fB\-\-unpack\-root\fR, \fB\-p\fR <path>
+If used with \fB\-\-unpack\-path\fR, this is where the
+data is unpacked to. If used with \fB\-\-describe\fR, this
+is used as a prefix for the input path of
+regular files.
+.TP
+\fB\-\-no\-dev\fR, \fB\-D\fR
+Skip device special files when parsing the filesystem tree.
+.TP
+\fB\-\-no\-sock\fR, \fB\-S\fR
+Skip socket files when parsing the filesystem tree.
+.TP
+\fB\-\-no\-fifo\fR, \fB\-F\fR
+Skip named pipes when parsing the filesystem tree.
+.TP
+\fB\-\-no\-slink\fR, \fB\-L\fR
+Skip symbolic links when parsing the filesystem tree.
+.TP
+\fB\-\-no\-empty\-dir\fR, \fB\-E\fR
+Skip empty directories, including ones that are empty after applying
+the above rules.
+.PP
+The following options are specific to unpacking files from a SquashFS image
+to disk:
+.TP
+\fB\-\-no\-sparse\fR, \fB\-Z\fR
+Do not create sparse files. Always unpack sparse files by
+writing blocks of zeros to disk.
+.TP
+\fB\-\-set\-xattr\fR, \fB\-X\fR
+Set the extended attributes from the SquashFS image.
+.TP
+\fB\-\-set\-times\fR, \fB\-T\fR
+Set the create and modify timestamps of the file to the mtime
+from the SquashFS image.
+.TP
+\fB\-\-chmod\fR, \fB\-C\fR
+Change permission flags of unpacked files to
+those stored in the SquashFS image.
+.TP
+\fB\-\-chown\fR, \fB\-O\fR
+Change ownership of unpacked files to the
+UID/GID set in the SquashFS image.
+.TP
+\fB\-\-quiet\fR, \fB\-q\fR
+Do not print out progress while unpacking.
+.PP
+Other options:
+.TP
+\fB\-\-help\fR, \fB\-h\fR
+Print help text and exit.
+.TP
+\fB\-\-version\fR, \fB\-V\fR
+Print version information and exit.
+.SH SEE ALSO
+gensquashfs(1), sqfs2tar(1), sqfsdiff(1)
+.SH AUTHOR
+Written by David Oberhollenzer.
+.SH COPYRIGHT
+Copyright \(co 2019 David Oberhollenzer
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+.br
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
diff --git a/bin/sqfs2tar/sqfs2tar.1 b/bin/sqfs2tar/sqfs2tar.1
new file mode 100644
index 0000000..0fc69f6
--- /dev/null
+++ b/bin/sqfs2tar/sqfs2tar.1
@@ -0,0 +1,93 @@
+.TH SQFS2TAR "1" "June 2019" "sqfs2tar" "User Commands"
+.SH NAME
+sqfs2tar \- turn a SquashFS image into a tar archive
+.SH SYNOPSIS
+.B sqfs2tar
+[\fI\,OPTIONS\/\fR...] \fI\,<sqfsfile>\/\fR
+.SH DESCRIPTION
+Quickly and painlessly turn a SquashFS filesystem image into a tar archive
+that can then be examined and processed by any tool that can work on tar
+archives. The resulting archive is written to stdout.
+.PP
+Possible options:
+.TP
+\fB\-\-root\-becomes\fR, \fB\-r\fR <dir>
+Prefix all paths in the tarball with the given directory name and add an
+entry for this directory that receives all meta data (permissions, ownership,
+extended attributes, et cetera) of the root inode.
+
+The special value \fB.\fR can be used since many tar archivers themselves pack
+the attributes of the root directory that way and naturally support this.
+
+If this option is not used, all meta data from the root inode IS LOST!
+.TP
+\fB\-\-subdir\fR, \fB\-d\fR <dir>
+Unpack the given sub directory instead of the filesystem root. Can be specified
+more than once to select multiple directories. If only one is specified, it
+becomes the new root of the archive filesystem tree.
+.TP
+\fB\-\-keep\-as\-dir\fR, \fB\-k\fR
+If \fB\-\-subdir\fR is used only once, don't make the subdir the archive root,
+instead keep it as prefix for all unpacked files. Using \fB\-\-subdir\fR more
+than once implies \fB\-\-keep\-as\-dir\fR.
+.TP
+\fB\-\-no\-xattr\fR, \fB\-X\fR
+Discard extended attributes from the SquashFS image. The default behavior is
+to copy all xattrs attached to SquashFS inodes into the resulting tar archive.
+.TP
+\fB\-\-no\-hard\-links\fR, \fB\-L\fR
+Normally, sqfs2tar runs hard link detection and generates hard links for
+entries that refer to the same inode. If this flag is set, hard link
+detection is not performed and duplicate data records are generated
+instead.
+.TP
+\fB\-\-no\-skip\fR, \fB\-s\fR
+Abort if a file cannot be stored in a tar archive. For instance, the tar format
+does not support socket files, but SquashFS does. The default behaviour of
+\fBsqfs2tar\fR is to emit a warning to stderr and skip the entry. If this flag
+is set, processing is aborted and \fBsqfs2tar\fR exits with an error status.
+.TP
+\fB\-\-help\fR, \fB\-h\fR
+Print help text and exit.
+.TP
+\fB\-\-version\fR, \fB\-V\fR
+Print version information and exit.
+.SH COMPATIBILITY
+The output format is pre-POSIX ustar using GNU extensions where necessary.
+Experimentation determined that this is most widely supported by activeley
+used tar implementations (besides GNU tar), even more than the newer POSIX
+format with PAX extensions.
+
+If any file or directory is encountered that cannot be converted, it is
+skipped and a warning is written to stderr. Unless the \fB\-\-no\-skip\fR
+option is set, which aborts processing if a file cannot be converted.
+
+This mainly affects socket files which are supported by SquashFS but not by
+POSIX tar, GNU tar or PAX.
+
+Since the tar format contains a sequence of files with absolute names, it has
+no direct concept of a tree or an unnamed root node. Consequently, meta data
+from the SquashFS root inode is lost, unless the \fB\-\-root\-becomes\fR option
+is used.
+.SH EXAMPLES
+Turn a SquashFS image into a tar archive:
+.IP
+sqfs2tar rootfs.sqfs > rootfs.tar
+.TP
+Turn a SquashFS image into a gzip'ed tar archive:
+.IP
+sqfs2tar rootfs.sqfs | gzip > rootfs.tar.gz
+.TP
+Turn a SquashFS image into an LZMA2 compressed tar archive:
+.IP
+sqfs2tar rootfs.sqfs | xz > rootfs.tar.xz
+.SH SEE ALSO
+rdsquashfs(1), tar2sqfs(1)
+.SH AUTHOR
+Written by David Oberhollenzer.
+.SH COPYRIGHT
+Copyright \(co 2019 David Oberhollenzer
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+.br
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
diff --git a/bin/sqfsdiff/sqfsdiff.1 b/bin/sqfsdiff/sqfsdiff.1
new file mode 100644
index 0000000..c0ee550
--- /dev/null
+++ b/bin/sqfsdiff/sqfsdiff.1
@@ -0,0 +1,72 @@
+.TH SQFSDIFF "1" "August 2019" "sqfsdiff" "User Commands"
+.SH NAME
+sqfsdiff \- compare two squashfs images by contents and metadata
+.SH SYNOPSIS
+.B sqfsdiff
+[\fI\,OPTIONS\/\fR...] \-\-old \fI\,<first>\fR \-\-new \fI\,<second>\/\fR
+.SH DESCRIPTION
+Compare two squashfs images. In contrast to doing a direct diff of the
+images, this actually parses the filesystems and generates a more
+meaningful difference report.
+.PP
+If only contents are compared, any differences in packed file layout,
+ordering, compression, inode meta data and so on is ignored and the two
+images are considered equal if each directory contains the same entries,
+symlink with the same paths have the same targets, device nodes the same
+device number and files the same size and contents.
+.PP
+A report of any difference is printed to stdout. The exit status is similar
+that of diff(1): 0 means equal, 1 means different, 2 means problem.
+.PP
+Possible options:
+.TP
+\fB\-\-old\fR, \fB\-a\fR <first>
+Specify the first filesystem image or source directory, relativ to which the
+changes are evaluated.
+.TP
+\fB\-\-new\fR, \fB\-b\fR <second>
+Specify the second filesystem image to source directory to compare to the
+first one.
+.TP
+\fB\-\-no\-contents\fR, \fB\-C\fR
+Do not compare file contents.
+.TP
+\fB\-\-no\-owner\fR, \fB\-O\fR
+Do not compare file owners.
+.TP
+\fB\-\-no\-permissions\fR, \fB\-P\fR
+Do not compare permission bits.
+.TP
+\fB\-\-timestamps\fR, \fB\-T\fR
+Compare file timestamps.
+.TP
+\fB\-\-inode\-num\fR, \fB\-I\fR
+Compare inode numbers of all files.
+.TP
+\fB\-\-super\fR, \fB\-S\fR
+Also compare meta data in super blocks.
+.TP
+\fB\-\-extract\fR, \fB\-e\fR <path>
+Extract files that exist in both images but have different contents to the
+specified directory. Contents of the first image end up in a sub directory
+named \fBold\fR and the contents of the second image in a sub directory
+named \fBnew\fR.
+.TP
+\fB\-\-help\fR, \fB\-h\fR
+Print help text and exit.
+.TP
+\fB\-\-version\fR, \fB\-V\fR
+Print version information and exit.
+.SH EXIT STATUS
+The exit status is similar that of diff(1): 0 means equal, 1 means different,
+2 means problem.
+.SH SEE ALSO
+rdsquashfs(1), sqfs2tar(1)
+.SH AUTHOR
+Written by David Oberhollenzer.
+.SH COPYRIGHT
+Copyright \(co 2019 David Oberhollenzer et al
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+.br
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
diff --git a/bin/tar2sqfs/tar2sqfs.1 b/bin/tar2sqfs/tar2sqfs.1
new file mode 100644
index 0000000..da344ec
--- /dev/null
+++ b/bin/tar2sqfs/tar2sqfs.1
@@ -0,0 +1,154 @@
+.TH TAR2SQFS "1" "June 2019" "tar2sqfs" "User Commands"
+.SH NAME
+tar2sqfs \- create a SquashFS image from a tar archive
+.SH SYNOPSIS
+.B tar2sqfs
+[\fI\,OPTIONS\/\fR...] \fI\,<sqfsfile>\/\fR
+.SH DESCRIPTION
+Quickly and painlessly turn a tar ball into a SquashFS filesystem image.
+.PP
+Possible options:
+.TP
+\fB\-\-root\-becomes\fR, \fB\-r\fR <dir>
+If set, only pack entries that are underneath the specified directory. The
+prefix is stripped and the meta data for the directory itself is copied to the
+root inode (i.e. the ownership, permissions, extended attributes,
+modification time).
+
+If this option is not set, tar2sqfs implicitly treats \fB./\fR or absolute
+paths this way, i.e. if the archive contains an entry for \fB./\fR, it becomes
+the root node and the prefix is stripped from all paths (and similar for
+absolute paths and \fB/\fR).
+.TP
+\fB\-\-compressor\fR, \fB\-c\fR <name>
+Select the compressor to use.
+Run \fBtar2sqfs \-\-help\fR to get a list of all available compressors
+and the default selection.
+.TP
+\fB\-\-comp\-extra\fR, \fB\-X\fR <options>
+A comma separated list of extra options for the selected compressor. Specify
+\fBhelp\fR to get a list of available options.
+.TP
+\fB\-\-num\-jobs\fR, \fB\-j\fR <count>
+If libsquashfs was compiled with a thread pool based, parallel data
+compressor, this option can be used to set the number of compressor
+threads. If not set, the default is the number of available CPU cores.
+.TP
+\fB\-\-queue\-backlog\fR, \fB\-Q\fR <count>
+Maximum number of data blocks in the thread worker queue before the packer
+starts waiting for the block processors to catch up. Higher values result
+in higher memory consumption. Defaults to 10 times the number of workers.
+.TP
+\fB\-\-block\-size\fR, \fB\-b\fR <size>
+Block size to use for SquashFS image.
+Defaults to 131072.
+.TP
+\fB\-\-dev\-block\-size\fR, \fB\-B\fR <size>
+Device block size to padd the image to.
+Defaults to 4096.
+.TP
+\fB\-\-defaults\fR, \fB\-d\fR <options>
+A comma separated list of default values for
+implicitly created directories.
+The following values can be set:
+.TS
+tab(;) allbox;
+l l
+l l
+l l
+l l
+l l
+rd.
+\fBOption\fR;\fBDefault\fR
+uid=<value>;0
+gid=<value>;0
+mode=<value>;0755
+mtime=<value>;\fB$SOURCE\_DATE\_EPOCH\fR if set, 0 otherwise
+.TE
+.TP
+.TP
+\fB\-\-no\-keep\-time\fR, \fB\-k\fR
+Replace the time stamps from the tar archive with default time stamps for all
+entries.
+
+The default behavior is to preserve the time stamps from the archive to the
+extent possible (SquashFS has second resolution and 32 bit time stamps; tar can
+use extensions to specify much larger timestamps with arbitrary precision). The
+root inode (unless \fB\-\-root\-becomes\fR is used) and the modification time on
+the SquashFS image itself will still be set to defaults.
+.TP
+\fB\-\-no\-xattr\fR, \fB\-x\fR
+Do not copy extended attributes from archive. Default behaviour is to copy all
+extended attributes and skip the ones that cannot be encoded in SquashFS.
+.TP
+\fB\-\-no\-skip\fR, \fB\-s\fR
+Abort if a tar record cannot be read instead of skipping it.
+.TP
+\fB\-\-exportable\fR, \fB\-e\fR
+Generate an export table for NFS support.
+.TP
+\fB\-\-no\-tail\-packing\fR, \fB\-T\fR
+Do not perform tail end packing on files that are larger than the
+specified block size.
+.TP
+\fB\-\-force\fR, \fB\-f\fR
+Overwrite the output file if it exists.
+.TP
+\fB\-\-quiet\fR, \fB\-q\fR
+Do not print out progress reports.
+.TP
+\fB\-\-help\fR, \fB\-h\fR
+Print help text and exit.
+.TP
+\fB\-\-version\fR, \fB\-V\fR
+Print version information and exit.
+.SH COMPATIBILITY
+Currently the program can process v7 format, pre-POSIX ustar, POSIX tar and GNU
+tar archives. PAX extension headers are also supported. Global PAX headers are
+ignored.
+
+The support for GNU tar is limited to commonly used subset (i.e. some legacy
+extensions that GNU tar itself no longer generates are not supported; neither
+are mutli volume archives).
+
+Extended attributes are supported through the SCHILY.xattr PAX extension
+(favoured by GNU tar and star) or through the LIBARCHIVE.xattr PAX extension.
+
+If any unsupported section or extended attribute key is encountered in an
+archive, a warning message is written to stderr. If the \fB\-\-no\-skip\fR
+option is set, processing aborts. By default, unknown sections and unsupported
+extended attributes are simply skipped after issuing a warning.
+.SH ENVIRONMENT
+If the command line switch \fB\-\-defaults\fR is not used or no default mtime
+is specified, the value of the environment variable \fBSOURCE\_DATE\_EPOCH\fR
+is used for all file and filesystem timestamps.
+
+If \fBSOURCE\_DATE\_EPOCH\fR 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.
+.SH EXAMPLES
+.TP
+Turn an uncompressed tar archive into a SquashFS image:
+.IP
+tar2sqfs rootfs.sqfs < rootfs.tar
+.TP
+Turn a gzip'ed tar archive into a SquashFS image:
+.IP
+zcat rootfs.tar.gz | tar2sqfs rootfs.sqfs
+.TP
+Turn an LZMA2 compressed tar archive into a SquashFS image:
+.IP
+xzcat rootfs.tar.xz | tar2sqfs rootfs.sqfs
+.SH SEE ALSO
+gensquashfs(1), rdsquashfs(1), sqfs2tar(1)
+.SH AUTHOR
+Written by David Oberhollenzer.
+.SH COPYRIGHT
+Copyright \(co 2019 David Oberhollenzer
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+.br
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.