General Information
===================

FUSE (Filesystem in Userspace) is a simple interface for userspace
programs to export a virtual filesystem to the Linux kernel.  FUSE
also aims to provide a secure method for non privileged users to
create and mount their own filesystem implementations.

You can download the source code releases from

  http://sourceforge.net/projects/fuse

or alternatively you can use CVS to get the very latest development
version by setting the cvsroot to

  :pserver:anonymous@cvs.sourceforge.net:/cvsroot/fuse

and checking out the 'fuse' module.

Dependencies
============

Linux kernel version 2.4.X where X >= 21 (some vendor kernels earlier
than this are also known to work).

Linux kernel version 2.6.X where X >= 0.

Installation
============

./configure
make
make install
modprobe fuse

You may also need to add '/usr/local/lib' to '/etc/ld.so.conf' and/or
run ldconfig.

Linux kernels 2.6.14 or later contain FUSE support out of the box.  If
FUSE support is detected, the kernel module in this package will not
be compiled.  It is possible to override this with the
'--enable-kernel-module' configure option.

If './configure' cannot find the kernel source or it says the kernel
source should be prepared, you may either try

  ./configure --disable-kernel-module

or if your kernel does not already contain FUSE support, do the
following:

  - Extract the kernel source to some directory

  - Copy the running kernel's config (usually found in
    /boot/config-X.Y.Z) to .config at the top of the source tree

  - Run 'make prepare'

For more details see the file 'INSTALL'

How To Use
==========

FUSE is made up of three main parts:

 - A kernel filesystem module

 - A userspace library

 - A mount/unmount program


Here's how to create your very own virtual filesystem in five easy
steps (after installing FUSE):

  1) Edit the file example/fusexmp.c to do whatever you want...

  2) Build the fusexmp program

  3) run 'example/fusexmp /mnt/fuse -d'

  4) ls -al /mnt/fuse

  5) Be glad

If it doesn't work out, please ask!  Also see the file 'include/fuse.h' for
detailed documentation of the library interface.

Security
========

If you run 'make install', the fusermount program is installed
set-user-id to root.  This is done to allow normal users to mount
their own filesystem implementations.

There must however be some limitations, in order to prevent Bad User from
doing nasty things.  Currently those limitations are:

  - The user can only mount on a mountpoint, for which it has write
    permission

  - The mountpoint is not a sticky directory which isn't owned by the
    user (like /tmp usually is)

  - No other user (including root) can access the contents of the mounted
    filesystem.

Configuration
=============

Some options regarding mount policy can be set in the file
'/etc/fuse.conf'

Currently these options are:

mount_max = NNN

  Set the maximum number of FUSE mounts allowed to non-root users.
  The default is 1000.

user_allow_other

  Allow non-root users to specify the 'allow_other' or 'allow_root'
  mount options.


Mount options
=============

These are FUSE specific mount options that can be specified for all
filesystems:

default_permissions

  By default FUSE doesn't check file access permissions, the
  filesystem is free to implement it's access policy or leave it to
  the underlying file access mechanism (e.g. in case of network
  filesystems).  This option enables permission checking, restricting
  access based on file mode.  This is option is usually useful
  together with the 'allow_other' mount option.

allow_other

  This option overrides the security measure restricting file access
  to the user mounting the filesystem.  So all users (including root)
  can access the files.  This option is by default only allowed to
  root, but this restriction can be removed with a configuration
  option described in the previous section.

allow_root

  This option is similar to 'allow_other' but file access is limited
  to the user mounting the filesystem and root.  This option and
  'allow_other' are mutually exclusive.

kernel_cache

  This option disables flushing the cache of the file contents on
  every open().  This should only be enabled on filesystems, where the
  file data is never changed externally (not through the mounted FUSE
  filesystem).  Thus it is not suitable for network filesystems and
  other "intermediate" filesystems.

  NOTE: if this option is not specified (and neither 'direct_io') data
  is still cached after the open(), so a read() system call will not
  always initiate a read operation.

large_read

  Issue large read requests.  This can improve performance for some
  filesystems, but can also degrade performance.  This option is only
  useful on 2.4.X kernels, as on 2.6 kernels requests size is
  automatically determined for optimum performance.

direct_io

  This option disables the use of page cache (file content cache) in
  the kernel for this filesystem.  This has several affects:

     - Each read() or write() system call will initiate one or more
       read or write operations, data will not be cached in the
       kernel.

     - The return value of the read() and write() system calls will
       correspond to the return values of the read and write
       operations.  This is useful for example if the file size is not
       known in advance (before reading it).

max_read=N

  With this option the maximum size of read operations can be set.
  The default is infinite.  Note that the size of read requests is
  limited anyway to 32 pages (which is 128kbyte on i386).

hard_remove

  The default behavior is that if an open file is deleted, the file is
  renamed to a hidden file (.fuse_hiddenXXX), and only removed when
  the file is finally released.  This relieves the filesystem
  implementation of having to deal with this problem.  This option
  disables the hiding behavior, and files are removed immediately in
  an unlink operation (or in a rename operation which overwrites an
  existing file).

  It is recommended that you not use the hard_remove option. When
  hard_remove is set, the following libc functions fail on unlinked
  files (returning errno of ENOENT):
     - read()
     - write()
     - fsync()
     - close()
     - f*xattr()
     - ftruncate()
     - fstat()
     - fchmod()
     - fchown()

debug

  Turns on debug information printing by the library.

fsname=NAME

  Sets the filesystem name.  The default is the program name.

use_ino

  Honor the 'st_ino' field in getattr() and fill_dir().  This value is
  used to fill in the 'st_ino' field in the stat()/lstat()/fstat()
  functions and the 'd_ino' field in the readdir() function.  The
  filesystem does not have to guarantee uniqueness, however some
  applications rely on this value being unique for the whole
  filesystem.

readdir_ino

  If 'use_ino' option is not given, still try to fill in the 'd_ino'
  field in readdir().  If the name was previously looked up, and is
  still in the cache, the inode number found there will be used.
  Otherwise it will be set to '-1'.  If 'use_ino' option is given,
  this option is ignored.

nonempty

  Allows mounts over a non-empty file or directory.  By default these
  mounts are rejected (from version 2.3.1) to prevent accidental
  covering up of data, which could for example prevent automatic
  backup.

umask=M

  Override the permission bits in 'st_mode' set by the filesystem.
  The resulting permission bits are the ones missing from the given
  umask value.  The value is given in octal representation.

uid=N

  Override the 'st_uid' field set by the filesystem.

gid=N

  Override the 'st_gid' field set by the filesystem.
