This page of the tutorial explains how to build the BBFS filesystem program and use it to mount a directory.
This tutorial describes the use of FUSE version 2.9.x (API level 26). Development of FUSE itself has gone beyond this level (the most recent release is 3.2.1); unfortunately, the developers broke backward compatibility with version 3. I'm now looking into what changes I need to make to bring this tutorial in line with the latest versions. In the mean time, if you want to use the code from this tutorial I strongly recommend you install an older version.
In order to compile against the FUSE libraries, you need to make sure you have installed the development version of the libraries. In Debian and Ubuntu the package name is "libfuse-dev"; in Fedora it's "fuse-devel". Note in both cases that the distributions are only using fuse version 2.9.7, so if you install using the package managers you'll automatically be using a version that is compatible with this tutorial.
This tutorial uses the GNU autotools system for configuration. As is the case with all autotools-based projects, you can configure and compile it by going to the top-level directory and typing
and the code should be compiled and ready to go../configure make
Unlike most software, the code from this tutorial is not intended to be installed. Consequently, I've tried to disable all the various installation targets; if I've missed one please let me know.
You mount a BBFS filesystem by running the command
(in general, a FUSE filesystem is implemented by a program, and you
mount it by running that program).
bbfs has two required arguments: the root directory (which
contains the actual directory data) and the mount directory. The
tutorial tarball includes an
example directory, which
contains two subdirectories named
mountdir. You can verify that
contains a single file named
mountdir is empty
Here's what it looks like when you try it:
snowball:655$ pwd /home/joseph/fuse-tutorial/example snowball:656$ ls -lR .: total 12 -rw-r--r-- 1 joseph users 185 Jun 9 15:56 Makefile drwxr-xr-x 2 joseph users 4096 Jun 12 17:16 mountdir/ drwxr-xr-x 2 joseph users 4096 Jun 12 17:16 rootdir/ ./mountdir: total 0 ./rootdir: total 4 -rw-r--r-- 1 joseph users 11 Jun 12 17:16 bogus.txt
Now, if you go into the
example directory and execute
../src/bbfs rootdir mountdir
all of the files that are really in
rootdir appear to also
snowball:657$ ../src/bbfs rootdir/ mountdir/ about to call fuse_main snowball:658$ ls -lR .: total 40 -rw-r--r-- 1 joseph users 185 Jun 9 15:56 Makefile -rw-r--r-- 1 joseph users 25632 Jun 12 17:51 bbfs.log drwxr-xr-x 2 joseph users 4096 Jun 12 17:16 mountdir/ drwxr-xr-x 2 joseph users 4096 Jun 12 17:16 rootdir/ ./mountdir: total 4 -rw-r--r-- 1 joseph users 11 Jun 12 17:16 bogus.txt ./rootdir: total 4 -rw-r--r-- 1 joseph users 11 Jun 12 17:16 bogus.txt
But, every time you perform any file
mountdir, the operation (and a whole bunch
of both relevant and irrelevant stuff) gets logged to a new file in the
current working directory called
bbfs.log If you execute
tail -F bbfslog
in another terminal window, you can watch the operations get logged.
Finally, you can see that the operating system sees
mountdir as a filesystem:
snowball:660$ mount | grep mountdir bbfs on /home/joseph/fuse-tutorial/example/mountdir type fuse.bbfs (rw,nosuid,nodev,relatime,user_id=1248,group_id=1005)
Finally, you can unmount the filesystem with
snowball:661$ fusermount -u mountdir snowball:662$ ls -lR .: total 40 -rw-r--r-- 1 joseph users 185 Jun 9 15:56 Makefile -rw-r--r-- 1 joseph users 27520 Jun 12 17:57 bbfs.log drwxr-xr-x 2 joseph users 4096 Jun 12 17:16 mountdir/ drwxr-xr-x 2 joseph users 4096 Jun 12 17:16 rootdir/ ./mountdir: total 0 ./rootdir: total 4 -rw-r--r-- 1 joseph users 11 Jun 12 17:16 bogus.txt
fusermount isn't part of this tutorial
— it comes along with FUSE).
One thing to mention about configuring the software is the line
This translates to two invocations of
obtain the C compilation flags and libraries needed to compile and
link the code in the tutorial.
`pkg-config fuse --cflags`
says to use
pkg-config to determine what C
compiler flags are necessary to compile a source file that makes use
of FUSE. The back-quotes around the command are important —
they take the output of the command and insert it into the
command-line as command-line operations (note — it's important
those are back-quotes aka accent graves. They can't be forward quotes,
nor double quotes). The other place it's used,
`pkg-config fuse --libs`
gives the extra command-line arguments to link the program with
An earlier version of this tutorial used these invocations directly in the Makefile, like this:
bbfs : bbfs.o log.o gcc -g -o bbfs bbfs.o log.o `pkg-config fuse --libs` bbfs.o : bbfs.c log.h params.h gcc -g -Wall `pkg-config fuse --cflags` -c bbfs.c log.o : log.c log.h params.h gcc -g -Wall `pkg-config fuse --cflags` -c log.c
Next: Callbacks and