FUSE bindings for Go
Go native bindings for the FUSE kernel module.
You should import and use github.com/hanwen/go-fuse/v2/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/hanwen/go-fuse/fuse/pathfs and github.com/hanwen/go-fuse/fuse/nodefs.
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.
example/hello/ contains a 60-line "hello world" filesystem
zipfs/zipfs 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 shows how to use combine simple Go-FUSE filesystems into a larger filesystem.
example/loopback 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
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!
Inspired by Taru Karttunen's package, https://bitbucket.org/taruti/go-extra.
Originally based on Ivan Krasin's https://github.com/krasin/go-fuse-zip
Yes, probably. Report them through
https://github.com/hanwen/go-fuse/issues. Please include a debug trace
(set fuse.MountOptions.Debug
to true
).
This is not an official Google product.
Like Go, this library is distributed under the new BSD license. See accompanying LICENSE file.
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}}