SQUASHFS 3.1 - A squashed read-only filesystem for Linux

	Copyright 2002-2006 Phillip Lougher <phillip@lougher.org.uk>

	Released under the GPL licence (version 2 or later).

Welcome to Squashfs version 3.1-r2.  Squashfs 3.1 has major improvements to
the Squashfs tools (Mksquashfs and Unsquashfs), some major bug fixes, new
kernel patches, and various other smaller improvements and bug fixes.
Please see the CHANGES file for a detailed list.

1. MKSQUASHFS
-------------

Mksquashfs has been rewritten and it is now multi-threaded.  It offers
the following improvements:

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.

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%.

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.

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.

5. The use of swap memory was found to significantly impact performance. The
amount of memory used to cache the file is now a command line option, by default
this is 512 Mbytes.

1.1 NEW COMMAND LINE OPTIONS
----------------------------

The new Mksquashfs program has a couple of extra command line options
which can be used to control the new features:

-processors <processors>

This specifies the number of processors used by Mksquashfs.
By default this is the number of available processors.

-read_queue <size in Mbytes>

This specifies the size of the file input queue used by the reader thread.
This defaults to 64 Mbytes.

-write_queue <size in Mbytes>

This specifies the size of the filesystem output queue used by the
writer thread.  It also specifies the maximum cache used in file
duplicate detection (the output queue is shared between these tasks).
This defaults to 512 Mbytes.

1.2 PERFORMANCE RESULTS
-----------------------

The following results give an indication of the speed improvements.  Two
example filesystems were tested, a liveCD filesystem (about 1.8 Gbytes
uncompressed), and my home directory consisting largely of text files
(about 1.3 Gbytes uncompressed).  Tests were run on a single core
and a dual core system.

Dual Core (AMDx2 3800+) system:
Source directories on ext3.

LiveCD, old mksquashfs:

real    11m48.401s
user    9m27.056s
sys     0m15.281s

LiveCD, new par_mksquashfs:

real    4m8.736s
user    7m11.771s
sys     0m27.749s

"Home", old mksquashfs:

real    4m34.360s
user    3m54.007s
sys     0m32.155s

"Home", new par_mksquashfs:

real    1m27.381s
user    2m7.304s
sys     0m17.234s

Single Core PowerBook (PowerPC G4 1.5 GHz Ubuntu Linux)
Source directories on ext3.

LiveCD, old mksquashs:

real    11m38.472s
user    9m6.137s
sys     0m23.799s

LiveCD,  par_mksquashfs:

real    10m5.572s
user    8m59.921s
sys     0m16.145s

"Home", old mksquashfs:

real    3m42.298s
user    2m49.478s
sys     0m13.675s

"Home", new par_mksquashfs:

real    3m9.178s
user    2m50.699s
sys     0m9.069s

I'll be interested in any performance results obtained, especially from SMP
machines larger than my dual-core AMD box, as this will give an indication of
the scalability of the code.  Obviously, I'm also interested in any problems,
deadlocks, low performance etc.

2. UNSQUASHFS
-------------

Unsquashfs now allows you to specify the filename or directory that is to be
extracted from the Squashfs filesystem, rather than always extracting the
entire filesystem.  It also has a new "-force" option, and all options can be
specified in a short form (-i rather than -info).

The Unsquashfs usage info is now:

SYNTAX: ./unsquashfs [options] filesystem [directory or file to extract]
	-v[ersion]		print version, licence and copyright information
	-i[nfo]			print files as they are unsquashed
	-l[s]			list filesystem only
	-d[est] <pathname>	unsquash to <pathname>, default "squashfs-root"
	-f[orce]		if file already exists then overwrite

To extract a subset of the filesystem, the filename or directory
tree that is to be extracted can now be specified on the command line.  The
file/directory should be specified using the full path to the file/directory
as it appears within the Squashfs filesystem.  The file/directory will also be
extracted to that position within the specified destination directory.

The new "-force" option forces Unsquashfs to output to the destination
directory even if files or directories already exist.  This allows you
to update an existing directory tree, or to Unsquashfs to a partially
filled directory.  Without the "-force" option, Unsquashfs will
refuse to overwrite any existing files, or to create any directories if they
already exist.  This is done to protect data in case of mistakes, and
so the "-force" option should be used with caution.