diff options
author | Stefan Kreutz <mail@skreutz.com> | 2024-03-24 15:15:58 +0100 |
---|---|---|
committer | Stefan Kreutz <mail@skreutz.com> | 2024-03-24 15:15:58 +0100 |
commit | e61d27b4eca9917b3784f958716adf49b65c2a55 (patch) | |
tree | 72580087e509836a748a176f118f1d0a8cbfdb01 | |
parent | 9975d61065db3824f269747d4408e8da9e01c375 (diff) | |
download | blog-e61d27b4eca9917b3784f958716adf49b65c2a55.tar |
Add brck release post
-rw-r--r-- | posts/brck.md | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/posts/brck.md b/posts/brck.md new file mode 100644 index 0000000..ea39e2b --- /dev/null +++ b/posts/brck.md @@ -0,0 +1,118 @@ +--- +title: "Brck" +description: "A simple bit rot checker for legacy file systems." +published: 2024-03-24 +--- + +I've just released [Brck][brck-repo], a simple bit rot checker for legacy file +systems. It records and compares the modification times and cryptographic hash +sums of regular files. When a file's hash changed but it's modification time +did not, then Brck reports the file as corrupted so you have a chance to +restore the file from backup. You do have backups, right? 😉 + +You can find the source code [here][brck-repo]. What follows is an excerpt from +the README. + +## Installation + +Brck is available on [crates.io][brck-cratesio]. You can install it using +Rust's package manager [Cargo][cargo]. + + $ cargo install brck + +## Usage + +Without any options, Brck will record all regular files in current working +directory recursively and write those records to a gzipped `.brck` file. + + $ brck + +When you run the same command again, Brck will compare the recorded files +against the current file system and report any corrupted files. + + $ brck + corrupted: ./test_file + Error: Found 1 denied difference + +Brck is quiet by default. Increase the verbosity using `-v` or request a +summary using `-s`. Alternatively, enable the JSON output using `-J` and +perform your own post-processing, e.g., using [jq][]: + + $ brck -vvJ | jq -sr 'group_by(.type)[] | [.[0].type, length] | @tsv' 2>/dev/null + added 4 + corrupted 1 + unchanged 1219 + +See the built-in help for all supported options: + + $ brck --help + +## Features + +- Parallel sequential processing: Brck processes files in parallel, yet outputs + and records files in-order + +- One-pass: Brck reads your files only once + +- Constant memory: Brck's memory footprint is independent of the number of + processed files + +- Relative paths: Brck records relative paths such that you can move the + containing directory around + +- Quiet by default: Without any options, Brck prints denied differences to + standard output, and errors to standard error; nothing else + +- Human readable or machine readable, newline-delimited JSON output, at your + option + +- Graceful shutdown on the first interrupt signal, forceful immediate shutdown + on the second + +- [Pledged][pledge] and [unveiled][unveil] on OpenBSD + +## Limitations + +- Brck doesn't follow symlinks. + +- Brck doesn't track hardlinks. Performance will be suboptimal in the presence + of large hardlinked files because Brck hashes each copy individually. + +- Brck doesn't track reflinks. Modern copy-on-write file systems are out of + scope because they should check file content integrity themselves, like + OpenZFS and Btrfs do. + +- Brck may leak file meta data because its `.brck` file may have different + permissions than the listed files. + +- Brck doesn't respect platform-specific temporary directories such as `TMPDIR` + on UNIX. Instead, it creates its temporary files in the current working + directory, next to the `.brck` file. This way, Brck can update the files + atomically on POSIX-conform systems. + +- Brck may fail to remove its temporary files, e.g., in the event of a + segfault. + +## See also + +- Definition of *bit rot* in the [Jargon File][jargon] + ([archive][jargon-archive]) + +- A similar Python program named [Bitrot][python-bitrot] + +- A similar Rust program named [Legdur][legdur] ([crates.io][legdur-cratesio]) + +- A blog post on [Things UNIX can do atomically][rcrowley] + +[brck-repo]: https://git.skreutz.com/brck.git/ +[brck-cratesio]: https://crates.io/crates/brck +[cargo]: https://doc.rust-lang.org/cargo/ +[jq]: https://jqlang.github.io/jq/ +[pledge]: https://man.openbsd.org/pledge +[unveil]: https://man.openbsd.org/unveil +[jargon]: http://www.catb.org/jargon/html/B/bit-rot.html +[jargon-archive]: https://web.archive.org/web/20240312124910/http://www.catb.org/jargon/html/B/bit-rot.html +[legdur]: https://git.cyplo.dev/cyplo/legdur +[legdur-cratesio]: https://crates.io/crates/legdur +[python-bitrot]: https://github.com/ambv/bitrot/ +[rcrowley]: https://web.archive.org/web/20160304224616/http://rcrowley.org/2010/01/06/things-unix-can-do-atomically |