• View Changelog • Download Binary Releases
cshatag is a tool to detect silent data corruption. It is meant to run periodically and stores the SHA256 of each file as an extended attribute. The project started as a minimal and fast reimplementation of shatag, written in Python by Maxime Augier.
See the Man Page further down this page for details.
Checksums stored in extended attributes for each file
- https://github.com/maugier/shatag (the original shatag tool, written in Python)
Checksums stored in single central database
Checksums stored in one database per directory
Static amd64 binary that should work on all Linux distros: https://github.com/rfjakob/cshatag/releases
Needs git, Go and make.
$ git clone https://github.com/rfjakob/cshatag.git
$ cd cshatag
$ make
CSHATAG(1) User Manuals CSHATAG(1)
NAME
cshatag - compiled shatag
SYNOPSIS
cshatag [OPTIONS] FILE [FILE...]
DESCRIPTION
cshatag is a minimal and fast re-implementation of shatag
( https://github.com/maugier/shatag , written in Python by Maxime
Augier )
in a compiled language (since v2.0: Go, earlier versions: C).
cshatag is a tool to detect silent data corruption. It writes the mtime
and the sha256 checksum of a file into the file's extended attributes.
The filesystem needs to be mounted with user_xattr enabled for this to
work. When run again, it compares stored mtime and checksum. If it
finds that the mtime is unchanged but the checksum has changed, it
warns on stderr. In any case, the status of the file is printed to
stdout and the stored checksum is updated.
File statuses that appear on stdout are:
<new> file is missing both attributes
<outdated> both mtime and checksum have changed
<ok> both checksum and mtime stayed the same
<timechange> only mtime has changed, checksum stayed the same
<corrupt> mtime stayed the same but checksum changed
cshatag aims to be format-compatible with shatag and uses the same ex‐
tended attributes (see the COMPATIBILITY section).
cshatag was written in C in 2012 and has been rewritten in Go in 2019.
OPTIONS
-dry-run don't make any changes
-recursive recursively process the contents of directories
-remove remove cshatag's xattrs from FILE
-q quiet mode - don't report <ok> files
-qq quiet2 mode - only report <corrupt> files and errors
-fix fix the stored sha256 on corrupt files
EXAMPLES
Check all regular files in the file tree below the current working di‐
rectory:
# cshatag -qq -recursive .
Errors like corrupt files will be printed to stderr. Run without "-qq"
to see progress output.
To remove the extended attributes from all files:
# cshatag -recursive -remove .
RETURN VALUE
0 Success
1 Wrong number of arguments
2 One or more files could not be opened
3 One or more files is not a regular file
4 Extended attributes could not be written to one or more files
5 At least one file was found to be corrupt
6 More than one type of error occurred
COMPATIBILITY
cshatag writes the user.shatag.ts field with full integer nanosecond
precision, while python uses a double for the whole mtime and loses the
last few digits.
AUTHOR
Jakob Unterwurzacher <[email protected]>
https://github.com/rfjakob/cshatag
COPYRIGHT
Copyright 2012 Jakob Unterwurzacher. MIT License.
SEE ALSO
shatag(1), sha256sum(1), getfattr(1), setfattr(1)
Linux MAY 2012 CSHATAG(1)
Short changelog - for all the details look at the git log.
v2.2.1, 2024-08-23
- Fix
Makefile
to ensure the correct version string is baked into the binary (#29)
v2.2.0, 2024-08-23
- Do not update corrupt files unless
-fix
is passed (#28, behavoir change) - Linux: use 100ns resolution when comparing timestamps instead of 1ns to match SMB protocol restrictions (#21 commit)
- MacOS: use 1s resolution when comparing timestamps to match MacOS SMB client restrictions (#21)
v2.1.0, 2022-10-22
- Add
-dry-run
#22 - This version is called
v2.1.0
as opposed tov2.1
to conform to go.mod versioning rules (three-digit semver).
v2.0, 2020-11-15
- Rewrite cshatag in Go
- add MacOS support
- Add
-remove
flag - Add
-q
and-qq
flags - Accept multiple files per invocation to improve performance
- Work around problems on MacOS SMB mounts (#11)
v1.1, 2019-06-09
- Add test suite (
make test
) (commit) - Add Travis CI
- Drop useless trailing null byte from
user.shatag.sha256
v1.0, 2019-01-02
- Add
make format
target
2019-02-01
- Fix missing null termination in ts buffer that could lead to false positives (commit)
2017-05-04
- Respect
PREFIX
formake install
(commit)
2016-09-17
- Check for malloc returning NULL (commit)
2012-12-05
- C source code & man page published on Github (commit)