How to register FUSE filesystem type with mount(8) and fstab?
In general, one "registers" a new mount filesystem type by creating an executable mount.fstype
.
$ ln -s /usr/bin/vdbfs.py /usr/sbin/mount.vdbfs
If vdbfs.py
takes mount
-ish arguments (i.e. dev path [-o opts]
), then mount -t vdbfs
and using vdbfs
as the 3rd field in fstab
will work. If it doesn't, you can create a wrapper which does take arguments of that form and maps them to whatever your vdbfs.py
takes.
FUSE should also install a mount.fuse
executable; mount.fuse 'vdbfs.py#dev' path -o opts
will go on and call vdbfs.py dev path -o opts
. In that case, you can use fuse
as your filesystem type and prefix your device with vdbfs.py#
.
So to clarify ephemient's answer, there are two options:
Edit
/etc/fstab
like this:# <file system> <mount point> <type> <options> <dump> <pass> # ... vdbfs.py#<dev> /srv/virtual-db fuse user,<other-opts> 0 0
Or,
Create an executable prefixed with "mount." (ensuring it can be used with
mount
-like options):$ ln -s /usr/bin/vdbfs.py /usr/sbin/mount.vdbfs
And edit
/etc/fstab
like this:# <file system> <mount point> <type> <options> <dump> <pass> # ... <dev> /srv/virtual-db vdbfs.py user,<other-opts> 0 0
With regards to auto-mounting at start up and manually mounting with mount
, the user
and noauto
options are relevant and fully supported by fuse itself so you don't have to implement them yourself. The user
option lets a non-priveleged user who is a member of the "fuse" group mount your filesystem with the mount
command, and noauto
directs your filesystem not to automatically mount at startup. If you don't specify noauto
, it will automatically mount.
To clarify @patryk.beza comment on the accepted answer, the correct way to mount a FUSE file system is by setting the file system type to fuse.<subtype>
.
For example, to mount an s3fs-fuse implementation, which does not provide a specific /sbin/mount.*
wrapper and uses normally the s3fs
user command to mount S3 buckets, one can use this command as root:
mount -t fuse.s3fs bucket-name /path/to/dir -o <some,options>
or this line in /etc/fstab
:
bucket-name /path/to/dir fuse.s3fs <some,options> 0 0
or this SystemD mount unit (for example, /etc/systemd/system/path-to-dir.mount
):
[Unit]
Description=S3 Storage
After=network.target
[Mount]
What=bucket-name
Where=/path/to/dir
Type=fuse.s3fs
Options=<some,options>
[Install]
WantedBy=multi-user.target
How this works: mount
recognizes the concept of "filesystem subtypes" when the type is formatted with a period (i.e. <type>.<subtype>
), so that a type with the format fuse.someimpl
is recognized to be the responsibility of the FUSE mount helper /sbin/mount.fuse
. The FUSE mount helper then resolves the someimpl
part to the FUSE implementation, in the same way as the #
format is used in the original answer (I think this is just a path search for a program named <subtype>
, but I'm not 100% sure about it).