libfuse: get ref for req
[fuse.git] / FAQ
blob038fb4b17d2a215d6eb0f1ddaefa8fd91b8d2502
1 This was generated on 2006/10/17 from
3   http://sourceforge.net/apps/mediawiki/fuse/index.php?title=FAQ
5 For an up to date version please see the above page.  You can also add
6 new entries there.
8 General
9 =======
11 How can I umount a filesystem?
12 ------------------------------
14 FUSE filesystems can be unmounted either with:
16   umount mountpoint
20   fusermount -u mountpoint
22 The later does not need root privileges if the filesystem was mounted by the
23 user doing the unmounting.
25 What's the difference between FUSE and LUFS?
26 --------------------------------------------
28 The main difference between them is that in LUFS the filesystem is a
29 shared object (.so) which is loaded by lufsmount, and in FUSE the
30 filesystem is a separate executable, which uses the fuse library.  The
31 actual API is very similar, and there's a translator, that can load
32 LUFS modules and run them using the FUSE kernel module (see the lufis
33 package on the FUSE page).
35 Another difference is that LUFS does some caching of directories and
36 file attributes.  FUSE does not do this, so it provides a 'thinner'
37 interface.
39 By now LUFS development seems to have completely ceased.
41 Why is it called FUSE? There's a ZX Spectrum emulator called Fuse too.
42 ----------------------------------------------------------------------
44 At the time of christening it, the author of FUSE (the filesystem)
45 hadn't heard of Fuse (the Speccy emulator).  Which is ironic, since he
46 knew Philip Kendall, the author of that other Fuse from earlier times.
47 Btw. the author of FUSE (the filesystem) also created a Speccy
48 emulator called Spectemu.
50 The name wanted to be a clever acronym for "Filesystem in USErspace",
51 but it turned out to be an unfortunate choice.  The author has since
52 vowed never to name a project after a common term, not even anything
53 found more than a handful of times on Google.
55 Is it possible to mount a fuse filesystem from fstab?
56 -----------------------------------------------------
58 Yes, from version 2.4.0 this is possible.  The filesystem must adhere
59 to some rules about command line options to be able to work this way.
60 Here's an example of mounting an sshfs filesystem:
62 sshfs#user@host:/    /mnt/host    fuse    defaults    0 0
64 The mounting is performed by the /sbin/mount.fuse helper script.  In
65 this example the FUSE-linked binary must be called sshfs and must
66 reside somewhere in $PATH.
68 Licensing issues
69 ~~~~~~~~~~~~~~~~
71 Under what license is FUSE released?
72 ------------------------------------
74 The kernel part is released under the GNU GPL.
76 Libfuse is released under the GNU LGPLv2.
78 All other parts (examples, fusermount, etc) are released under the GNU
79 GPL.
81 Under what conditions may I modify or distribute FUSE?
82 ------------------------------------------------------
84 See the files COPYING and COPYING.LIB in the distribution.
86 More information can be found at http://www.gnu.org/licenses/
88 Under what conditions may I distribute a filesystem which uses libfuse?
89 -----------------------------------------------------------------------
91 See COPYING.LIB in the distribution.
93 In simple terms as long as you are linking dynamically (the default)
94 there are no limitations on linking with libfuse.  For example you may
95 distribute the filesystem itself in binary form, without source code,
96 under any proprietary license.
98 Under what conditions may I distribute a filesystem that uses the raw
99 ---------------------------------------------------------------------
100 kernel interface of FUSE?
101 -------------------------
103 There are no restrictions whatsoever for using the raw kernel interface.
108 Which method is called on the close() system call?
109 --------------------------------------------------
111 flush() and possibly release().  For details see the documentation of
112 these methods in <fuse.h>
114 Wouldn't it be simpler if there were a single close() method?
115 -------------------------------------------------------------
117 No, because the relationship between the close() system call and the
118 release of the file (the opposite of open) is not as simple as people
119 tend to imagine.  UNIX allows open files to acquire multiple
120 references
122     * after fork() two processes refer to the same open file
124     * dup() and dup2() make another file descriptor refer to the same
125       file
127     * mmap() makes a memory mapping refer to an open file
129 This means, that for a single open() system call, there could be more
130 than one close() and possibly munmap() calls until the open file is
131 finally released.
133 Can I return an error from release()?
134 -------------------------------------
136 No, it's not possible.
138 If you need to return errors on close, you must do that from flush().
140 How do I know which is the last flush() before release()?
141 ---------------------------------------------------------
143 You can't.  All flush() calls should be treated equally.  Anyway it
144 wouldn't be worth optimizing away non-final flushes, since it's fairly
145 rare to have multiple write-flush sequences on an open file.
147 Why doesn't FUSE forward ioctl() calls to the filesystem?
148 ---------------------------------------------------------
150 Because it's not possible: data passed to ioctl() doesn't have a well
151 defined length and structure like read() and write().  Consider using
152 getxattr() and setxattr() instead.
154 Is there a way to know the uid, gid or pid of the process performing
155 --------------------------------------------------------------------
156 the operation?
157 --------------
159 Yes: fuse_get_context()->uid, etc.
161 How should threads be started?
162 ------------------------------
164 Miscellaneous threads should be started from the init() method.
165 Threads started before fuse_main() will exit when the process goes
166 into the background.
168 Is it possible to store a pointer to private data in the
169 --------------------------------------------------------
170 fuse_file_info structure?
171 -------------------------
173 Yes, the 'fh' filed is for this purpose.  This filed may be set in the
174 open() and create() methods, and is available in all other methods
175 having a struct fuse_file_info parameter.  Note, that changing the
176 value of 'fh' in any other method as open() or create() will have no
177 affect.
179 Since the type of 'fh' is unsigned long, you need to use casts when
180 storing and retrieving a pointer.  Under Linux (and most other
181 architectures) an unsigned long will be able to hold a pointer.
183 This could have been done with a union of 'void *' and 'unsigned long'
184 but that would not have been any more type safe as having to use
185 explicit casts.  The recommended type safe solution is to write a
186 small inline function that retrieves the pointer from the
187 fuse_file_info structure.
189 Problems
190 ========
192 Version problems
193 ~~~~~~~~~~~~~~~~
195 Why do I get Connection Refused after mounting?
196 -----------------------------------------------
198 Library is too old (< 2.3.0)
200 You can check which version of the library is being used by foofs by
201 doing 'ldd path_to_foofs'.  It will return something like this
203         libfuse.so.2 => /usr/local/lib/libfuse.so.2 (0xb7fc9000)
204         libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7fb9000)
205         libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb7f39000)
206         libc.so.6 => /lib/tls/libc.so.6 (0xb7e04000)
208 Then do 'ls -l path_to_libfuse'
210 > ls -l /usr/local/lib/libfuse.so.2
211 lrwxrwxrwx  1 root root 16 Sep 26 13:41 /usr/local/lib/libfuse.so.2 -> libfuse.so.2.2.1
213 Why does fusermount fail with an Unknown option error?
214 ------------------------------------------------------
216 Errors like 'fusermount: Unknown option -o' or 'fusermount: Unknown
217 option --' mean, that an old version of fusermount is being used.  You
218 can check by doing 'which fusermount'.
220 If you installed FUSE from source, then this is probably because there
221 exists a binary package on your system which also contains a
222 fusermount program, and is found first in the path, e.g. in
223 /usr/bin/fusermount.
225 The solution is to remove the binary package.
227 Installation problems
228 ~~~~~~~~~~~~~~~~~~~~~
230 Why is there an error loading shared libraries?
231 -----------------------------------------------
233 If you get the following error when starting a FUSE-based filesystem:
235    foofs: error while loading shared libraries: libfuse.so.2:
236    cannot open shared object file: No such file or directory
238 check /etc/ld.so.conf for a line containing '/usr/local/lib'.  If it's
239 missing, add it, and run ldconfig afterwards.
241 Why doesn't mounting as user work if installing FUSE from a package?
242 --------------------------------------------------------------------
244 Distributions often package 'fusermount' without the suid bit, or only
245 executable to the 'fuse' group.
247 This results in the following message, when trying to mount a
248 filesystem as an unprivileged user:
250    fusermount: mount failed: Operation not permitted
252 The simplest solution is to change the mode of 'fusermount':
254    chmod 4755 /usr/bin/fusermount
256 Note, you may have to do this after each upgrade.
258 Other problems
259 ~~~~~~~~~~~~~~
261 Why are some bytes zeroed when reading a file?
262 ----------------------------------------------
264 This happens if the filesystem returns a short count from the read()
265 method.  If the file wasn't opened in direct I/O mode, the read()
266 method must return exactly the requested number of bytes, unless it's
267 the end of the file.
269 If the file was opened in direct I/O mode (with direct_io mount
270 option, or by setting the direct_io field of fuse_file_info at open)
271 the read can return a smaller value than requested.  In this case the
272 end of file can be signalled by returning zero.
274 What do I do if /dev/fuse does not exist?
275 -----------------------------------------
277 Maybe the FUSE module is not loaded. As root, try:
279     modprobe fuse
281 If nothing changes, as root run:
283     mknod /dev/fuse c 10 229
285 What do I do if you don't have access to /dev/fuse?
286 ---------------------------------------------------
288 As root run:
290     chmod o+rw /dev/fuse
292 Remember that this will allow ordinary users to mount their own user
293 space filesystems.
295 If that's not what you want then use different permissions.
297 Why does cp return operation not permitted when copying a file with no
298 ----------------------------------------------------------------------
299 write permissions for the owner?
300 --------------------------------
302 "cp" calls open(2) with read-only permissions and O_CREAT, the purpose
303 being to atomically obtain a read/write file handle and make the file
304 read-only.  Unfortunately, this does not work very well in fuse, since
305 you first get a mknod, and then an open call.  At the time of open,
306 you can't distinguish easily whether this is the first open issued by
307 cp, or another process trying to write a read-only file.
309 Defining the 'create' method solves this problem, however this
310 requires a Linux kernel version of at least 2.6.15 and libfuse version
311 2.5 or greater (on FreeBSD you'll need fuse4bsd-0.3.0-pre1 or newer
312 for this).
314 There can be other workarounds, however the easy one is to use the
315 "default_permissions" mount option, and to avoid checking permissions
316 on open.  If you store files on a filesystem, this can get tricky
317 because you will have to change the file mode to allow writing.  Using
318 the stateful API (i.e. returning an handle on open) will simplify
319 things.  In this case, and using "-o default_permissions", when
320 implementing the open call you have to:
322 1. check if the open is in write mode (i.e. mode has O_RDWR or
323    O_WRONLY)
325 2. in that case (in mutual exclusion with other open, getattr
326    etc. calls on the same file) change the mode from "M" to "M OR
327    0o200"
329 3. open the file, change back the mode even in case of errors, and
330    return the obtained handle
332 Why doesn't find work on my filesystem?
333 ---------------------------------------
335 The st_nlink member must be set correctly for directories to make find
336 work.  If it's not set correctly the -noleaf option of find can be
337 used to make it ignore the hard link count (see man find).
339 The correct value of st_nlink for directories is NSUB + 2.  Where NSUB
340 is the number of subdirectories.  NOTE: regular-file/symlink/etc
341 entries do not count into NSUB, only directories.
343 If calculating NSUB is hard, the filesystem can set st_nlink of
344 directories to 1, and find will still work.  This is not documented
345 behavior of find, and it's not clear whether this is intended or just
346 by accident.  But for example the NTFS filesysem relies on this, so
347 it's unlikely that this "feature" will go away.
349 What is the reason for IO errors?
350 ---------------------------------
352 The kernel part of FUSE returns the EIO error value, whenever the
353 userspace filesystem sends a "bad" reply.  Sometimes these are
354 unavoidable, and not necessarily a fault of the filesystem.  Possible
355 causes of this are (non-exhaustive)
357     * the filesystem returned a short count on write()
359     * the type of the file has changed (e.g. a directory suddenly
360       became a symlink)
362     * a directory entry contained a filename that was too long (no,
363       ENAMETOOLONG is not the right error here)
365     * the same node ID value was used for two different directories
366       (i.e. hard-linked directories are not allowed)
368     * In the GETATTR function, st_mode needs to have a valid filetype
369       bit set, like S_IFREG or S_IFDIR, see the stat manual for more
371     * You are running a 64 bit kernel but using a 32 bit libfuse. In this case
372       you will need to install a 64 bit version of the FUSE userspace library,
373       64 bit versions of all of the FUSE filesystems or language bindings that
374       link to it, and 64 bit versions of all of their dependencies. Your
375       distribution may provide 64 bit versions of the basic dependencies like
376       libc even in its 32 bit environment
378 Misc
379 ====
381 Can the filesystem ask a question on the terminal of the user?
382 --------------------------------------------------------------
384 It would not be possible generally speaking, since it might not be an
385 interactive program but rather a daemon, or a GUI program doing the
386 operation.  However you should be able to get the PID for the caller,
387 and by looking in /proc you should be able to find the process tty or
388 something similar.
390 But this is not recommended.  You should rather think about solving
391 this another way.
393 If a filesystem is mounted over a directory, how can I access the old
394 ---------------------------------------------------------------------
395 contents?
396 ---------
398 There are two possibilities:
400 The first is to use 'mount --bind DIR TMPDIR' to create a copy of the
401 namespace under DIR.  After mounting the FUSE filesystem over DIR,
402 files can still be accessed through TMDIR.  This needs root privileges.
404 The second is to set the working directory to DIR after mounting the FUSE
405 filesystem.  For example before fuse_main() do
407      save_dir = open(DIR, O_RDONLY);
409 And from the init() method do
411      fchdir(save_dir);
412      close(save_dir);
414 Then access the files with relative paths (with newer LIBC versions
415 the *at() functions may also be used instead of changing the CWD).
417 This method doesn't need root privileges, but only works on Linux
418 (FreeBSD does path resolving in a different way), and it's not even
419 guaranteed to work on future Linux versions.