Environment, Configuring, Compiling and Running

This page of the tutorial explains how to build the BBFS filesystem program and use it to mount a directory.

Environment

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.

Configuring and Compiling

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

./configure
make
and the code should be compiled and ready to go.

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.

Mounting a BBFS Filesystem

You mount a BBFS filesystem by running the command bbfs (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 rootdir and mountdir. You can verify that rootdir contains a single file named bogus.txt, while 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 be in mountdir"


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 operation in 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)

Unmounting

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

(note that fusermount isn't part of this tutorial — it comes along with FUSE).

pkg-config

One thing to mention about configuring the software is the line

PKG_CHECK_MODULES(FUSE, fuse)
in configure.ac

This translates to two invocations of pkg-config to 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 libfuse.

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 struct fuse_operations


Last modified: Sun Feb 4 09:16:09 MST 2018