Learn through the super-clean Baeldung Pro experience:
>> Membership and Baeldung Pro.
No ads, dark-mode and 6 months free of IntelliJ Idea Ultimate to start with.
Last updated: March 18, 2024
SquashFS is a type of filesystem that is compressed and read-only. One of the big advantages of SquashFS is its support of various compression methods such as gzip, xz, lzo, lz4, and zstd.
In this tutorial, we’ll learn how to mount a SquashFS filesystem for reading. Then, we’ll learn how to utilize an overlay for reading and writing to a SquashFS filesystem.
SquashFS can be used for many different things but is typically utilized for live booting, archiving, or for use in devices with limited storage. Moreover, SquashFS has many benefits:
The downside of SquashFS, however, is that it’s read-only and thus requires special considerations when modifying.
To create a SquashFS filesystem, we’ll need to install squashfs-tools:
$ sudo apt install squashfs-tools
We use the apt command to install squashfs-tools, but may also install it via its sources.
To mount a SquashFS filesystem, we can use the mount command:
$ sudo mount --type="squashfs" --options="loop" --source="/mnt/extdrive/mysquash.sqsh" --target="/tmp/mysquash"
Mounting a SquashFS filesystem is very similar to mounting any other filesystem. We begin by using the mount command with –type to specify the type as squashfs.
Then, we use the –options flag to set the option loop, indicating we want to use a loopback device. This is necessary since we’re mounting a file, not an actual device. In fact, we employ this method because it’s one of the more common ways that an end user might leverage SquashFS.
Finally, we indicate the location of the squash file we want to mount using –source and the mount point with –target.
Now, we should be able to access the mounted filesystem by switching to the /tmp/mysquash mount point. Since squash is read-only, we’ll not be able to modify the mounted filesystem contents, even to change permissions.
Once we’re done with the mounted filesystem we unmount it:
$ sudo umount --type="squashfs" /tmp/mymount
Alternatively, we could pass the location of a SquashFS filesystem, i.e., /mnt/extdrive/mysquash.sqsh.
OverlayFS is a special type of filesystem that can combine multiple mount points together into a single structure. The two points that are being merged have specific names:
The resulting mount point is a modifiable directory containing the data of the two directories. Importantly, the upper and lower directories remain with their original data and don’t change. This means that data written to the target directory is lost when the overlay is unmounted.
A great use for an overlay is in conjunction with a SquashFS mount. Setting the lower (read-only) directory of an overlay to a SquashFS mount enables us to read and write to the data in SquashFS. However, since the overlay doesn’t modify the upper or lower directory, we’ll need to recreate and overwrite the SquashFS file if we want to preserve changes made in the overlay.
After getting to know both, we can use OverlayFS to read and write to a SquashFS filesystem.
To begin, we mount the SquashFS filesystem via the method we used earlier:
$ sudo mount --type="squashfs" --options="loop" --source="/mnt/extdrive/mysquash.sqsh" --target="/tmp/mysquash"
Next, we create a few directories using the mkdir command:
$ mkdir /tmp/UPPER /tmp/WORK /tmp/TARGET
Let’s break these down:
Having this setup, let’s continue with OverlayFS.
Now, we can create our overlay using the mount command:
$ sudo mount --type="overlay" \
--options="lowerdir=/tmp/mysquash,upperdir=/tmp/UPPER,workdir=/tmp/WORK" \
--source="overlay" --target="/tmp/TARGET"
We set the –options starting with lowerdir which we set to the location of the SquashFS mount point. Likewise, we set upperdir to /tmp/UPPER and workdir to /tmp/WORK. Finally, we set –source=”overlay” indicating we’re using OverlayFS and –target directory to /tmp/TARGET.
After we create the overlay, the resulting directory /tmp/TARGET contains the contents of the SquashFS filesystem, which we’ll now be able to read and write to.
Changes made in the /tmp/TARGET directory are lost when the overlay is unmounted. Because of this, we may need to sync the changes made to the SquashFS filesystem:
$ mksquashfs /tmp/TARGET /mnt/extdrive/mysquash.sqsh -noappend
In this example, we run the mksquashfs command with the first argument being the target directory of the overlay and the second argument being the location of the SquashFS filesystem.
We use the -noappend flag to ensure that mksquash overwrites instead of its default behavior of appending to preexisting SquashFS filesystems.
The SquashFS file should now reflect the changes we made in /tmp/TARGET.
Now, we just unmount both the overlay and SquashFS:
$ sudo umount --type="overlay" /tmp/TARGET
$ sudo umount --type="squashfs" /tmp/mysquash
In this example, we unmount the overlay and SquashFS mounts, specifying the –type option as overlay and squashfs respectively.
In this article, we learned about the SquashFS filesystem and its usage.
Afterward, we mounted a SquashFS filesystem for reading. Next, we explored overlays and how to use one to read and write to a SquashFS filesystem. Finally, we saw how to apply our knowledge in practice.