# Brck -- a simple bit rot checker
Brck is 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? 😉
Brck's original source code is hosted [here][brck-repo].
## Installation
Brck is available on [crates.io][brck-cratesio]. You can install it using
Rust's package manager [Cargo][cargo].
$ cargo install brck
Alternatively you can run (or install) the experimental Nix flake.
$ nix run git+https://git.skreutz.com/brck.git -- --help
## 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
You can optionally deny all changes to existing files:
$ brck -d changed,removed,corrupted
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., when the process gets
killed.
## License
This work is distributed under the terms of both, the [MIT
License][mit-license] and the [Apache License, Version 2.0][apache-license].
## Contribution
Contributions are welcome! Please [contact][] me via email.
## 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
[mit-license]: LICENSE-MIT
[apache-license]: LICENSE-APACHE-2.0
[contact]: https://www.skreutz.com/contact/