Nora's Reliable FileSystem (NRFS) v0.2
Posted: Mon Jan 30, 2023 1:13 pm
It took me longer than expected but I've finally finished v0.2 of my filesystem.
Some of the new features aren't properly supported by the tool & driver yet as I want to get v0.2 out ASAP.
v0.2.1 will be focused on fully supporting these features.
The on-disk format for the object store is almost fully stable. While I may still change the layout of the header slightly (& possibly other changes) they should be trivial to add in a backwards-compatible way.
Hence, I will guarantee that every next major version will be able to load & upgrade the previous version of the filesystem, i.e. v0.3 will be able to load & upgrade v0.2 filesystems.
I've completely overhauled the cache. It is now nearly fully concurrent, i.e. many I/O operations can run in parallel with few exceptions (e.g. no multiple concurrent resizes on the same object). This also allows packing data in parallel, significantly improving performance on multicore systems.
While it is possible to do concurrent reads, the FUSE driver does not take advantage of this yet. Making it concurrent is on the todo-list for v0.2.1.
I've also added encryption. I was originally going to leave this to the block driver but I figured it'd be more efficient and ergonomic to handle this directly.
It uses two keys: one for the header and one for the rest of the filesystem. The latter key is stored in the header.
This allows changing the key/password quickly and cheaply if it is compromised.
The tool and FUSE driver currently only support password-based encryption but an option to supply a key directly will be added for v0.2.1.
Mirroring and error correction have also been implemented, though the make tool currently only supports creating a filesystem on a single disk only. Again, I aim to support it properly by v0.2.1.
You can find the source code on github and on sourcehut.
Binaries for Linux are also provided.
Now I'm off to find a drive that doesn't make clicky sounds and copy a bunch of data to it. Let's see how long it takes before the filesystem borks itself .
Some of the new features aren't properly supported by the tool & driver yet as I want to get v0.2 out ASAP.
v0.2.1 will be focused on fully supporting these features.
The on-disk format for the object store is almost fully stable. While I may still change the layout of the header slightly (& possibly other changes) they should be trivial to add in a backwards-compatible way.
Hence, I will guarantee that every next major version will be able to load & upgrade the previous version of the filesystem, i.e. v0.3 will be able to load & upgrade v0.2 filesystems.
I've completely overhauled the cache. It is now nearly fully concurrent, i.e. many I/O operations can run in parallel with few exceptions (e.g. no multiple concurrent resizes on the same object). This also allows packing data in parallel, significantly improving performance on multicore systems.
While it is possible to do concurrent reads, the FUSE driver does not take advantage of this yet. Making it concurrent is on the todo-list for v0.2.1.
I've also added encryption. I was originally going to leave this to the block driver but I figured it'd be more efficient and ergonomic to handle this directly.
It uses two keys: one for the header and one for the rest of the filesystem. The latter key is stored in the header.
This allows changing the key/password quickly and cheaply if it is compromised.
The tool and FUSE driver currently only support password-based encryption but an option to supply a key directly will be added for v0.2.1.
Mirroring and error correction have also been implemented, though the make tool currently only supports creating a filesystem on a single disk only. Again, I aim to support it properly by v0.2.1.
You can find the source code on github and on sourcehut.
Binaries for Linux are also provided.
Now I'm off to find a drive that doesn't make clicky sounds and copy a bunch of data to it. Let's see how long it takes before the filesystem borks itself .