lib

package module
v2.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 14, 2022 License: BSD-3-Clause Imports: 0 Imported by: 0

README

GO-FUSE

CI GoDoc

Go native bindings for the FUSE kernel module.

You should import and use github.com/CalebQ42/go-fuse/fs library. It follows the wire protocol closely, but provides convenient abstractions for building both node and path based file systems

Older, deprecated APIs are available at github.com/CalebQ42/go-fuse/fuse/pathfs and github.com/CalebQ42/go-fuse/fuse/nodefs.

Comparison with other FUSE libraries

The FUSE library gained a new, cleaned-up API during a rewrite completed in 2019. Find extensive documentation here.

Further highlights of this library is

  • Comprehensive and up to date protocol support (up to 7.12.28).

  • Performance that is competitive with libfuse.

Examples

  • example/hello/main.go contains a 60-line "hello world" filesystem

  • zipfs/zipfs.go contains a small and simple read-only filesystem for zip and tar files. The corresponding command is in example/zipfs/ For example,

    mkdir /tmp/mountpoint
    example/zipfs/zipfs /tmp/mountpoint file.zip &
    ls /tmp/mountpoint
    fusermount -u /tmp/mountpoint
    
  • zipfs/multizipfs.go shows how to use in-process mounts to combine multiple Go-FUSE filesystems into a larger filesystem.

  • fuse/loopback.go mounts another piece of the filesystem. Functionally, it is similar to a symlink. A binary to run is in example/loopback/ . For example

    mkdir /tmp/mountpoint
    example/loopback/loopback -debug /tmp/mountpoint /some/other/directory &
    ls /tmp/mountpoint
    fusermount -u /tmp/mountpoint
    

macOS Support

go-fuse works somewhat on OSX. Known limitations:

  • All of the limitations of OSXFUSE, including lack of support for NOTIFY.

  • OSX issues STATFS calls continuously (leading to performance concerns).

  • OSX has trouble with concurrent reads from the FUSE device, leading to performance concerns.

  • Tests are expected to pass; report any failure as a bug!

Credits

Bugs

Yes, probably. Report them through https://github.com/CalebQ42/go-fuse/issues

Disclaimer

This is not an official Google product.

Known Problems

Grep source code for TODO. Major topics:

  • Missing support for CUSE, BMAP, IOCTL

License

Like Go, this library is distributed under the new BSD license. See accompanying LICENSE file.


Appendix I. Go-FUSE log format

To increase signal/noise ratio Go-FUSE uses abbreviations in its debug log output. Here is how to read it:

  • iX means inode X;
  • gX means generation X;
  • tA and tE means timeout for attributes and directory entry correspondingly;
  • [<off> +<size>) means data range from <off> inclusive till <off>+<size> exclusive;
  • Xb means X bytes.

Every line is prefixed with either rx <unique> or tx <unique> to denote whether it was for kernel request, which Go-FUSE received, or reply, which Go-FUSE sent back to kernel.

Example debug log output:

rx 2: LOOKUP i1 [".wcfs"] 6b
tx 2:     OK, {i3 g2 tE=1s tA=1s {M040755 SZ=0 L=0 1000:1000 B0*0 i0:3 A 0.000000 M 0.000000 C 0.000000}}
rx 3: LOOKUP i3 ["zurl"] 5b
tx 3:     OK, {i4 g3 tE=1s tA=1s {M0100644 SZ=33 L=1 1000:1000 B0*0 i0:4 A 0.000000 M 0.000000 C 0.000000}}
rx 4: OPEN i4 {O_RDONLY,0x8000}
tx 4:     38=function not implemented, {Fh 0 }
rx 5: READ i4 {Fh 0 [0 +4096)  L 0 RDONLY,0x8000}
tx 5:     OK,  33b data "file:///"...
rx 6: GETATTR i4 {Fh 0}
tx 6:     OK, {tA=1s {M0100644 SZ=33 L=1 1000:1000 B0*0 i0:4 A 0.000000 M 0.000000 C 0.000000}}
rx 7: FLUSH i4 {Fh 0}
tx 7:     OK
rx 8: LOOKUP i1 ["head"] 5b
tx 8:     OK, {i5 g4 tE=1s tA=1s {M040755 SZ=0 L=0 1000:1000 B0*0 i0:5 A 0.000000 M 0.000000 C 0.000000}}
rx 9: LOOKUP i5 ["bigfile"] 8b
tx 9:     OK, {i6 g5 tE=1s tA=1s {M040755 SZ=0 L=0 1000:1000 B0*0 i0:6 A 0.000000 M 0.000000 C 0.000000}}
rx 10: FLUSH i4 {Fh 0}
tx 10:     OK
rx 11: GETATTR i1 {Fh 0}
tx 11:     OK, {tA=1s {M040755 SZ=0 L=1 1000:1000 B0*0 i0:1 A 0.000000 M 0.000000 C 0.000000}}

Documentation

Overview

This is a repository containing Go bindings for writing FUSE file systems.

Go to https://godoc.org/github.com/CalebQ42/go-fuse/fs for the in-depth documentation for this library.

Older, deprecated APIs are available at https://godoc.org/github.com/CalebQ42/go-fuse/fuse/pathfs and https://godoc.org/github.com/CalebQ42/go-fuse/fuse/nodefs.

Directories

Path Synopsis
example
benchmark-read-throughput
readbench is a benchmark helper for measuring throughput on single-file reads out of a FUSE filesystem.
readbench is a benchmark helper for measuring throughput on single-file reads out of a FUSE filesystem.
hello
This program is the analogon of libfuse's hello.c, a a program that exposes a single file "file.txt" in the root directory.
This program is the analogon of libfuse's hello.c, a a program that exposes a single file "file.txt" in the root directory.
loopback
This is main program driver for the loopback filesystem from github.com/CalebQ42/go-fuse/fs/, a filesystem that shunts operations to an underlying file system.
This is main program driver for the loopback filesystem from github.com/CalebQ42/go-fuse/fs/, a filesystem that shunts operations to an underlying file system.
multizip
This is main program driver for MultiZipFs from github.com/CalebQ42/go-fuse/zipfs, a filesystem for mounting multiple read-only archives.
This is main program driver for MultiZipFs from github.com/CalebQ42/go-fuse/zipfs, a filesystem for mounting multiple read-only archives.
statfs
statfs is a main driver for the file system from github.com/CalebQ42/go-fuse/benchmark, intended for benchmarking FUSE libraries.
statfs is a main driver for the file system from github.com/CalebQ42/go-fuse/benchmark, intended for benchmarking FUSE libraries.
winfs
This is main program driver for a loopback filesystem that emulates windows semantics (no delete/rename on opened files.)
This is main program driver for a loopback filesystem that emulates windows semantics (no delete/rename on opened files.)
zipfs
This is main program driver for github.com/CalebQ42/go-fuse/zipfs, a filesystem for mounting read-only archives.
This is main program driver for github.com/CalebQ42/go-fuse/zipfs, a filesystem for mounting read-only archives.
Package fs provides infrastructure to build tree-organized filesystems.
Package fs provides infrastructure to build tree-organized filesystems.
Package fuse provides APIs to implement filesystems in userspace in terms of raw FUSE protocol.
Package fuse provides APIs to implement filesystems in userspace in terms of raw FUSE protocol.
nodefs
This package is deprecated.
This package is deprecated.
pathfs
This package is deprecated.
This package is deprecated.
test
Package test holds the tests for Go-FUSE and is not for end-user consumption.
Package test holds the tests for Go-FUSE and is not for end-user consumption.
Package posixtest file systems for generic posix conformance.
Package posixtest file systems for generic posix conformance.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL