Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Exfuse Build Statuscodecov

Exfuse is a simple Unix filesystem that I created for educational purposes. Currently, its use is limited to the fuse, but is written so that it can be used as a library without it. I describe it as simple because

  • An inode uses only the direct blocks
  • All blocks are allocated when creating a folder/file
  • Files are stored in a folder as a list
  • Uses a global lock
  • No duplication of key structures (e.g. superblock, root, bitmaps)
  • There is nothing like journal log

Limitations

Because the filesystem uses only the direct addressing there is a limitation of file size and number of entries in a directory. File size is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE, which is currently 256 * 4096 = 1MiB and the maximum number of elements in a directory is limited to EX_DIRECT_BLOCKS * EX_BLOCK_SIZE / sizeof (struct ex_dir_entry) which is currently 256 * 4096 / 64 = 16384 entries.

List of implemented functions

 access
chmod
chown
create
getattr (e.g. stat)
link
mkdir
open
read
readdir
readlink
rename
rmdir
statfs
symlink
truncate
unlink
utimens
write

Compilation

mkdir --parent build
cd build
cmake .. -DTESTS=ON
make && make test

Components

exmkfs

It is used to store filesystem structures on a "device". You can specify the maximum number of inodes during the initialization of filesystem, the default value is 256. The minimum device size for the given number of inodes is determined by the following function:

size_tex_mkfs_get_size_for_inodes(size_tninodes) {
// space for inodessize_trequired=ninodes*EX_BLOCK_SIZE;
// space for inodes bitmaprequired+=round_to_block(ninodes / 8);
// space for data of inodesrequired+=ninodes*EX_DIRECT_BLOCKS*EX_BLOCK_SIZE;
// space for data bitmaprequired+=round_to_block(ninodes*EX_DIRECT_BLOCKS / 8);
// space for super blockrequired+=round_to_block(sizeof(structex_super_block));
returnrequired;
}

exdbg

It is used for introspection of data structures. It can now display superblock, inode and structure size information, and can display bitmap and inode data. Bitmap and inode data are written in binary format on stdout, so it is useful to display them with something like xxd.

libexfuse

A library that contains all the filesystem logic. It does not depend on libfuse, its interfaces can be found in src/ex.h. Its primary purpose is to be used in tests.

exfuse

Wrapper around libfuse. It contains main from where it calls fuse_main, to which it passes struct fuse operations. The implementation is in src/wrapper.c .

Usage

Create a filesystem

$ ./exmkfs --device foo --create --inodes 1024 --log-level info

Display information about the superblock

$ ./exdbg --device foo
super:
root = 40960
magic = ffaacc
device_size = 1077977088 (1.004GiB)
data_bitmap:
head = 16
last = 31
address = 8192
size = 32768
allocated = 256
maxitems = 262144
inode_bitmap:
head = 64
last = 0
address = 4096
size = 128
allocated = 1
maxitems = 1024

Display information about the inode

$ ./exdbg --device foo --inode 40960
info: device.c: ex_device_open: device is open: fd=3
inode:
number: 0
size: 2144
magic: abcc
uid: 1000
gid: 1000
address: 40960
nlinks: 2
mode: 40705 (dir other=r-x group=--- user=rwx)
mtime: 1573202060.477585196
atime: 1573202060.477585196
ctime: 1573202060.477585196
entries:
name: '.', address: 40960
name: '..', address: 40960

Display the inode data

$ ./exdbg --device foo --inode-data 40960 | xxd
00000000: 00a0 0000 0000 0000 de00 2e00 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 00a0 0000 0000 0000 de00 2e2e 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00000090: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa

Display the bitmap data

$ ./exdbg --device foo --bitmap-data 64 | xxd
00000000: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Mount the filesystem

mkdir mp
./exfuse -f --device foo mp

About

A simple FUSE filesystem

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages