mirror of https://github.com/tLDP/LDP
433 lines
12 KiB
XML
433 lines
12 KiB
XML
<?xml version='1.0' encoding='ISO-8859-1'?>
|
|
|
|
<sect1 id="creatingandusing">
|
|
|
|
<title>Creating and using squashed file systems</title>
|
|
|
|
<sect2 id="creating">
|
|
<title>Basic steps</title>
|
|
|
|
<para>
|
|
In order to create a squashed file system out of a single directory
|
|
(say, <filename>/some/dir</filename>), and output it to a regular file
|
|
(thus, producing a file system image), you need to say only one magic phrase:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mksquashfs /some/dir dir.sqsh
|
|
</programlisting>
|
|
|
|
<para>
|
|
<command>mksquashfs</command> will perform the squashing and print the resulting
|
|
number of inodes and size of data written, as well as the average compression ratio.
|
|
Now you have your <filename>/some/dir</filename> directory image in the
|
|
<filename>dir.sqsh</filename> file. You can now use the <command>mount</command> command
|
|
to mount it using a loopback device:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mkdir /mnt/dir
|
|
bash# mount dir.sqsh /mnt/dir -t squashfs -o loop
|
|
</programlisting>
|
|
|
|
<para>
|
|
To check if you have what's expected:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# ls /mnt/dir
|
|
</programlisting>
|
|
|
|
<para>
|
|
If you want to output the file system directly into a device (say, your floppy at
|
|
<filename>/dev/fd0</filename>):
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mksquashfs /some/dir /dev/fd0
|
|
</programlisting>
|
|
|
|
<para>
|
|
Then just <command>mount</command> the device:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mount /dev/fd0 /mnt/floppy -t squashfs
|
|
</programlisting>
|
|
|
|
<para>
|
|
And check if it's okay:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# ls /mnt/floppy
|
|
</programlisting>
|
|
|
|
</sect2>
|
|
|
|
|
|
<sect2 id="squashing">
|
|
|
|
<title>Squashing file systems</title>
|
|
|
|
<para>
|
|
Operations described here correspond to most cases where a read-only compressed file
|
|
system can be used, whether you want it to be on a block device or in a file. This
|
|
could be anything from large FTP/HTTP-served archives that don't change often, to
|
|
having a squashed <filename>/usr</filename> partition and anything alike
|
|
with these.
|
|
</para>
|
|
|
|
<sect3 id="squashing-ex1">
|
|
<title>Example 1</title>
|
|
|
|
<para>
|
|
Let's suppose you have a <filename>/var/arch</filename> directory with lots of files and
|
|
that you want to turn it into a squashed file system and keep it on your root partition
|
|
as a file (it will be a file system image that you will mount via a loopback device).
|
|
The operations needed to perform are as follows.
|
|
</para>
|
|
|
|
<para>
|
|
Squash the directory, then mount it via loopback to test it:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mksquashfs /var/arch /var/arch.sqsh
|
|
bash# mkdir /mnt/tmp
|
|
bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
|
|
bash# ls /mnt/tmp
|
|
</programlisting>
|
|
|
|
<para>
|
|
If everything is as expected, make this file system mount automatically at boot time by
|
|
adding this line to your <filename>/etc/fstab</filename>:
|
|
</para>
|
|
|
|
<programlisting>
|
|
/var/arch.sqsh /var/arch squashfs ro,defaults 0 0
|
|
</programlisting>
|
|
|
|
<para>
|
|
Unmount the file system from the temporary mount point, and mount using it's fstab entry:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# umount /mnt/tmp
|
|
bash# mount /var/arch
|
|
</programlisting>
|
|
|
|
<para>
|
|
Now just ensure that everything works fine:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# ls /var/arch
|
|
</programlisting>
|
|
|
|
</sect3>
|
|
|
|
<sect3 id="squashing-ex2">
|
|
|
|
<title>Example 2</title>
|
|
|
|
<para>
|
|
Say you have two hard disk partitions, <filename>/dev/hda6</filename> (which
|
|
is empty) and <filename>/dev/hda7</filename> (which is bigger than <filename>/dev/hda6</filename>,
|
|
mounted at <filename>/var/arch</filename>, contains some data and is full). Now, say you want to squash the <filename>/dev/hda7</filename> file system and move it to <filename>/dev/hda6</filename>,
|
|
then use <filename>/dev/hda7</filename> for some other purposes. We will suppose you have
|
|
the following line in <filename>/etc/fstab</filename> (<command>reiserfs</command> is just an example file system
|
|
used on <filename>/dev/hda7</filename>):
|
|
</para>
|
|
|
|
<programlisting>
|
|
/dev/hda7 /var/arch reiserfs defaults 0 0
|
|
</programlisting>
|
|
|
|
<para>
|
|
In the same fashion as with the previous example:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mksquashfs /var/arch /var/arch.sqsh
|
|
bash# mkdir /mnt/tmp
|
|
bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
|
|
bash# ls /mnt/tmp
|
|
</programlisting>
|
|
|
|
<para>
|
|
If everything went fine, unmount <filename>/dev/hda7</filename> (if needed) and
|
|
use <command>dd</command> to copy <filename>/var/arch.sqsh</filename>
|
|
to <filename>/dev/hda6</filename>:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# umount /dev/hda7
|
|
bash# dd if=/var/arch.sqsh of=/dev/hda6
|
|
</programlisting>
|
|
|
|
<para>
|
|
Now change the line in <filename>/etc/fstab</filename> for <filename>/dev/hda7</filename> to:
|
|
</para>
|
|
|
|
<programlisting>
|
|
/dev/hda6 /var/arch squashfs ro,defaults 0 0
|
|
</programlisting>
|
|
|
|
<para>
|
|
Mount the new file system and check to see if all went fine:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mount /var/arch
|
|
bash# ls /var/arch
|
|
</programlisting>
|
|
|
|
<para>
|
|
Don't forget to erase the unneeded file system image:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# rm /var/arch.sqsh
|
|
</programlisting>
|
|
|
|
</sect3>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="tinyemb">
|
|
|
|
<title>Creating tiny/embedded systems</title>
|
|
|
|
<para>
|
|
By saying "tiny/embedded", I mean Linux systems that are being built for
|
|
booting from floppy disks, IDE/USB flash disks, iso9660 CD-ROMs, small-sized hard drives and the like.
|
|
Whether you want to have your whole root file system on a single media (a single partition, a single floppy),
|
|
or have a modular system (several floppies or disk partitions), the procedure is almost identical.
|
|
Creating such Linux systems themselves is out of scope of this HOWTO - there are dedicated HOWTOs and guides
|
|
for this (like the <emphasis>Bootdisk HOWTO</emphasis> and <emphasis>Linux From Scratch</emphasis> - visit
|
|
<ulink url="http://www.tldp.org">www.tldp.org</ulink> to retrieve these documents).
|
|
</para>
|
|
|
|
<sect3 id="sqflash">
|
|
<title>Squashed file systems on floppy/flash/hard disks</title>
|
|
|
|
<para>
|
|
In order to use SquashFS for creating Linux systems on small disks, you just have to follow
|
|
the usual steps for creating a minimal system, performing the following operations
|
|
at respective points:
|
|
</para>
|
|
|
|
<orderedlist>
|
|
|
|
<listitem><para>
|
|
When developing a kernel for your system, make sure you enable SquashFS support
|
|
so it can mount squashed file systems
|
|
</para></listitem>
|
|
|
|
<listitem><para>
|
|
Use <command>mksquashfs</command> for creating read-only initial ram disks and/or root and/or other file systems
|
|
</para></listitem>
|
|
|
|
<listitem><para>
|
|
Don't forget to set file system types to <filename>squashfs</filename> in <filename>/etc/fstab</filename>
|
|
and/or the startup scripts of your system for mounting squashed file systems
|
|
</para></listitem>
|
|
|
|
</orderedlist>
|
|
|
|
<para>
|
|
<emphasis>Floppy example</emphasis>. Let's say you have your floppy system tree at
|
|
<filename>/home/user/floppylinux</filename> and you want to place the root file system on one
|
|
floppy and <filename>/usr</filename> on another. What you should do is:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# cd /home/user
|
|
bash# mksquashfs floppylinux root.sqsh -e usr
|
|
bash# mksquashfs floppylinux/usr usr.sqsh
|
|
</programlisting>
|
|
|
|
<para>
|
|
<emphasis>Note 1</emphasis>: you can see here how we use the <command>-e</command>
|
|
option to exclude the <filename>/usr</filename> directory for root file system's image.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis>Note 2</emphasis>: don't forget to specify <filename>squashfs</filename> in your root disk's
|
|
<filename>/etc/fstab</filename> or startup scripts when mounting the <filename>/usr</filename> file system.
|
|
</para>
|
|
|
|
<para>
|
|
Insert a root disk in your 3.5" floppy drive (I assume you have a lilo or grub on it, and, thus, a file system exists on this floppy,
|
|
and the root file system will reside under the <filename>/boot</filename> directory of this file system):
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mount /mnt/floppy
|
|
bash# cp root.sqsh /mnt/floppy/boot
|
|
</programlisting>
|
|
|
|
<para>
|
|
When done, unmount the root floppy, change the floppy to a <filename>/usr</filename> disk and use <command>dd</command> to
|
|
transfer the <filename>usr</filename> file system:
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# dd if=usr.sqsh of=/dev/fd0
|
|
</programlisting>
|
|
|
|
</sect3>
|
|
|
|
|
|
<sect3 id="sqfloppy">
|
|
<title>Squashed file systems on CD-ROMs</title>
|
|
|
|
<para>
|
|
With SquashFS, you can compress large file systems that
|
|
will be used in live CDs (just as an example). For this purpose SquashFS is also used with UnionFS.
|
|
|
|
</para>
|
|
|
|
<orderedlist>
|
|
|
|
<listitem><para>
|
|
Enable SquashFS in the linux kernel of the target system
|
|
</para></listitem>
|
|
|
|
<listitem><para>
|
|
Create a squashed root file system
|
|
</para></listitem>
|
|
|
|
<listitem><para>
|
|
Modify the <filename>/etc/fstab</filename> or startup scripts of the target system
|
|
to mount the squashd file system when you need it
|
|
</para></listitem>
|
|
|
|
</orderedlist>
|
|
|
|
<para>
|
|
|
|
If you create a root file system out of a running Linux system,
|
|
use the <command>-e</command> option for <command>mksquashfs</command> to exclude
|
|
all pseudo-filesystems such as <filename>/proc</filename>, <filename>/sys</filename>
|
|
(on linux kernels after 2.5.x) and <filename>/dev</filename>
|
|
(when using DevFS). Also, don't forget to add the file system image itself that is
|
|
being created with <command>mksquashfs</command> (I think you know the reasons
|
|
for these exclusions).
|
|
|
|
</para>
|
|
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="sqwrite">
|
|
<title>Making it writeble</title>
|
|
<para>
|
|
As mentioned, another interesting use for <command>SquashFS</command> is with <command>Unionfs</command> filesystem, which
|
|
provides <emphasis>copy-on-write</emphasis> semantics for the read-only file systems, enahancing the possibilities. (For unionfs you can
|
|
look at <ulink url="http://www.filesystems.org/project-unionfs.html">http://www.filesystems.org/project-unionfs.html</ulink>)
|
|
</para>
|
|
|
|
<para>
|
|
Just to make an example, you may want to make your /home/user squashed, to compress and backup your files without losing the possibility to apply changes or writing new files.
|
|
</para>
|
|
|
|
<para>
|
|
Create the <filename>ro.fs</filename> squashed file system and the <filename>rw.fs</filename> dir.
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mksquashfs /home/user1 ro.fs
|
|
bash# mkdir /home/rw.fs
|
|
</programlisting>
|
|
|
|
|
|
<para>
|
|
Mount the squashed ro.fs file system using the loopback device
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mount -t squashfs ro.fs /mnt -o loop
|
|
</programlisting>
|
|
|
|
<para>
|
|
mount the unionfs file system, that makes <filename>/mnt</filename> and <filename>/home/rw.fs</filename> apparently merged under <filename>/home/user1</filename> location.
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# cd /home
|
|
bash# mount -t unionfs -o dirs=rw.fs=rw:/mnt=ro unionfs user1
|
|
</programlisting>
|
|
|
|
<para>
|
|
As you can see, now you can create new files in /home/user1.
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# cd /home/user1
|
|
bash# touch file1
|
|
bash# ls
|
|
</programlisting>
|
|
|
|
<para>
|
|
umount the unionfs and the squashfs file systems and list the content of /home/user1 and /home/rw.fs dir
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# cd ..
|
|
bash# umount /home/user1
|
|
bash# umount /mnt
|
|
|
|
bash# ls /home/user1
|
|
bash# ls /home/rw.fs
|
|
|
|
</programlisting>
|
|
|
|
<para>
|
|
You can see that the new <filename>file1</filename> was created in <filename>/home/rw.fs</filename>
|
|
</para>
|
|
|
|
<para>
|
|
When you want to add the new created files to the <emphasis>stable</emphasis> and <emphasis>compressed</emphasis> squashed file system, you have to add them to the exsisting one.
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# mksquashfs /home/rw.fs /home/ro.fs
|
|
</programlisting>
|
|
|
|
<para>
|
|
Now, to mount your squashed user home directory at system startup, you
|
|
can do as follow:
|
|
</para>
|
|
|
|
<para>
|
|
Make squashfs and unionfs modules loaded at boot time.
|
|
</para>
|
|
|
|
<programlisting>
|
|
bash# echo squashfs >> /etc/modules
|
|
bash# echo unionfs >> /etc/modules
|
|
</programlisting>
|
|
|
|
<para>
|
|
Change the owner of the writeble branch to match user1.
|
|
</para>
|
|
|
|
<programlisting>
|
|
chown user1 /home/rw.fs
|
|
</programlisting>
|
|
|
|
<para>
|
|
Add these lines to /etc/fstab file to mount squashfs and unionfs
|
|
at boot time.
|
|
</para>
|
|
|
|
<programlisting>
|
|
...
|
|
/home/ro.fs /mnt squashfs loop 0 0
|
|
unionfs /home/user1 unionfs dirs=/home/rw.fs=rw:/mnt=ro 0 0
|
|
</programlisting>
|
|
|
|
|
|
</sect2>
|
|
|
|
</sect1>
|