NOTE:  This the original README for version 2.0.  It is retained as it
contains information about the fragment design.  A description of the new 2.0
mksquashfs options has been added to the main README file, and that
file should now be consulted for these.

	SQUASHFS 2.0 - A squashed read-only filesystem for Linux

	Copyright 2004 Phillip Lougher (plougher@users.sourceforge.net)

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

Welcome to the final release of Squashfs version 2.0!  A lot of changes to the
filesystem have been made under the bonnet (hood).  Squashfs 2.0 uses fragment
blocks and larger blocks (64K) to improve compression ratio by about 5 - 20%
over Squashfs 1.0 depending on the files being compressed.  Using fragment
blocks allows Squashfs 2.0 to achieve better compression than cloop and similar
compression to tgz files while retaining the I/O efficiency of a compressed
filesystem.

Detailed changes:

1. Squashfs 2.0 has added the concept of fragment blocks (see later discussion).
   Files smaller than the file block size (64K in Squashfs 2.0) 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.

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

6. Initrds are now supported for kernels 2.6.x.

7. Removal of sleep_on() function call in 2.6.x patch, to allow Squashfs
   to work on the Fedora rc2 kernel.

8. AMD64, check-data and gid bug fixes.

9. Numerous small bug fixes have been made.

10. New patch for Linux 2.6.7.


New Squashfs 2.0 options
------------------------

-noF or -noFragmentCompression

	Do not compress the fragments.  Added for compatibility with noI and
	noD, probably not that useful.

-no-fragments

	Do not use fragment blocks, and rather generate a filesystem
	similar to a Squashfs 1.x filesystem.  It will of course still
	be a Squashfs 2.0 filesystem but without fragments, and so
	it won't be mountable on a Squashfs 1.x system.

-always-use-fragments

	By default only small files less than the block size are packed into
	fragment blocks.  The ends of files which do not fit fully into a block,
	are NOT by default packed into fragments.  To illustrate this, a
	100K file has an initial 64K block and a 36K remainder.  This
	36K remainder is not packed into a fragment by default.  This is
	because to do so leads to a 10 - 20% drop in sequential I/O
	performance, as a disk head seek is needed to seek to the initial
	file data and another disk seek is need to seek to the fragment
	block.

	Specify this option if you want file remainders to be packed into
	fragment blocks.  Doing so may increase the compression obtained
	BUT at the expense of I/O speed.

-no-duplicates

	Do not detect duplicate files.

-all-root
-root-owned

	These options (both do exactly the same thing), force all file
	uids/gids in the generated Squashfs filesystem to be root.
	This allows root owned filesystems to be built without root access
	on the host machine.

-force-uid uid

	This option forces all files in the generated Squashfs filesystem to
	be owned by the specified uid.  The uid can be specified either by
	name (i.e. "root") or by number.

-force-gid gid

	This option forces all files in the generated Squashfs filesystem to
	be group owned by the specified gid.  The gid can be specified either by
	name (i.e. "root") or by number.


Compression improvements example
--------------------------------

The following is the compression results obtained compressing the 2.6.6
linux kernel source using CRAMFS, Cloop (with iso filesystem), Squashfs 1.3 and
Squashfs 2.0 (results generated using big-endian filesystems).

In decreasing order of size:

	CRAMFS		62791680 bytes (59.9M)
	Squashfs 1.x	51351552 bytes (48.9M)
	Cloop		46118681 bytes (44.0M)
	Squashfs 2.0	45604854 bytes (43.5M)


The Squashfs 1.x filesystem is 12.6% larger than the new 2.0 filesystem.
The cloop filesystem is 1.1% larger than the Squashfs 2.0 filesystem.


Fragment blocks in Squashfs 2.0
-------------------------------

Squashfs like all other compressed filesystems compresses files individually
on a block by block basis.  This is performed to allow mounting and
de-compression of files on a block by block basis without requiring the entire
filesystem to be decompressed.  This is in contrast to data-based compression
schemes which compress without understanding the underlying filesystem (i.e.
cloop and tgz files) and which, therefore, do not compress files individually.
Each approach has advantages and disadvantages, data-based systems have better
compression because compression is always performed at the maximum block size
(64K in cloop) irrespective of the size of each file (which could be less than
the block size).  Compressed filesystems tend to be faster at I/O because
they understand the filesystem and therefore employ better caching stategies
and read less un-needed data from the filesystem.

Fragment blocks in Squashfs 2.0 solves this problem by packing files (and
optionally the ends of files) which are smaller than the block size into
shared blocks, which are compressed together.  For example five files each of
10K will be packed into one shared fragment of 50K and compressed together,
rather than being compressed in five 10K blocks.

This scheme produces a hybrid filesystem, retaining the I/O efficiency
of a compressed filesystem, while obtaining the compression efficiency
of data-based schemes by compressing small files together.


Squashfs 1.x and Squashfs 2.0 compatibility
-------------------------------------------

Appending to Squashfs 1.x filesystems is not supported.  If you wish to append
to 1.x filesystems, then either use the original mksquashfs, or convert them
to Squashfs 2.0 by mounting the filesystem and running the 2.0 mksquashfs
on the mounted filesystem.

Mounting Squashfs 1.x filesystems IS supported by the 2.0 kernel patch.
