SnapRAID HISTORY ================ 15.0 (Work in Progress) ======================= * Added support for automated filesystem snapshots to ensure data consistency and improve recovery reliability. When the 'snapshot' option is enabled, SnapRAID transparently manages filesystem snapshots during operations, requiring no changes to the existing user workflow or file management. Supported on Btrfs, Bcachefs, and ZFS in Linux, and on NTFS in Windows. This ensures that 'scrub', 'check', and 'fix' operations utilize a frozen point-in-time reference for data disks, eliminating mismatches caused by concurrent live filesystem modifications. The use of snapshots significantly improves recovery success by preserving access to files that were updated or deleted after the last parity computation. * Implemented AVX-512BW (Byte and Word) support for parity generation and data recovery, optimizing performance on modern architectures like Intel Sapphire Rapids and AMD Zen 4/5. By scaling to 512-bit ZMM registers, the implementation now processes 64 bytes per iteration, effectively doubling the data width of the previous AVX2 routines. * Implemented AArch64 (ARM64) and AArch32 (ARM32) NEON support for parity generation and data recovery, significantly improving performance on ARM-based platforms. * Improved the chances of a successful recovery after an interrupted sync. This is achieved by removing the sync optimization of not recomputing the parity if the input data matches the expected hash. While only the specific sync immediately following an interruption will be slower, this change preserves hash data in the content file to ensure a better fix during disk failures and allows the --import option to remain functional even after an incomplete sync. * Skip spin-up and spin-down operations for non-rotational devices (like SSDs and NVMe drives) on Linux and Windows. * Added --with-smartctl, --with-zfs, --with-zpool, --with-bcachefs configure options to allow pinning the absolute path of each tool at build time. When not specified, the existing runtime discovery behaviour is preserved. Primarily intended for NixOS and other non-FHS systems. * Removed the 512 TiB limitation on hard disk size (when using the default 256 KiB blocks). * Added support for a custom info options tag `[info: ...]` in the `smartctl` configuration option. This allows replacing the default `-a` command line argument used to retrieve SMART attributes with a customized set of arguments, enabling better support for RAID controllers and USB enclosures. * Added support for specifying case-insensitive SMART attribute names (instead of only numeric IDs) in the `smartignore` configuration option. * Added support for filesystems where only specific files fail to report a 64-bit inode number (such as ReFS when 128-bit file IDs cannot be mapped), allowing SnapRAID to continue processing those individual files without inodes. * Removed the dependency on the 'libblkid' library. 14.10 2026/08 ============= * Enable lock file support on Windows to prevent concurrent runs. 14.9 2026/07 ============ * Fix a regression when both the '--gui-touch-before' and '--gui-threshold' options are selected at the same time, which may prevent the thresholds from working correctly. Now, the content file is unconditionally saved before scanning for differences if any touch is performed. 14.8 2026/06 ============ * Avoid spinning up standby disks on Windows in some machines during the 'probe' and other device-monitoring commands. Direct system queries for disk properties, size, and geometry are now performed using zero-access handles. * Fixed the smartctl type detection retry during probe on Windows to properly preserve the standby check option, preventing standby disks from spinning up if a retry is needed. * Save the content file before aborting 'sync' due to safety thresholds if files were touched by '--gui-touch-before', preventing timestamp desynchronization and false diff reports on subsequent runs. 14.7 2026/06 ============ * Fix the 'touch' command on Windows for files with the read-only attribute. The read-only attribute is temporarily removed and then restored. No need to update if you are not on Windows. 14.6 2026/06 ============ * Fix stack overflow in deep directory trees on platforms with a small stack like Alpine. * Log errors as "fatal" only if the execution is stopped early. This ensures SnapRAID Daemon correctly identifies the alert level of each message (e.g., treating non-terminating issues as warnings). 14.5 2026/05 ============ * Support importing data from smartctl even when the disk reports incomplete information for attributes (e.g. missing norm, worst, or threshold values). * Log errors while SnapRAID scans the list of all files on a disk, so that the SnapRAID Daemon becomes aware of any I/O errors. * Fixed importing of the disk serial number from the SCSI Device Identification VPD page (also known as VPD Page 83h). * Various security improvements and memory leak fixes. 14.4 2026/04 ============ * Updated --gui-threshold-* logic to trigger on values equal to or greater than the threshold (previously only "greater than"). This enables setting the threshold to 1 to trigger it for a single case. This change is required by SnapRAID Daemon 1.8. 14.3 2026/04 ============ * On ARM64 (AArch64), replaced the inline assembly implementation of 128-bit multiplication with a `__uint128_t`-based version. This avoids potential miscompilations of the experimental MuseAir hash observed with aggressive compiler optimizations (e.g. -O2/-O3) on some toolchains (notably Apple Silicon), while still generating optimal code on modern compilers. * Fixed the speed computation of the undocumented -T option for the recovery functions. The reported values are now comparable to those of the generation functions. Note that the real speed is unchanged from the previous version, only the way it is measured has changed. 14.2 2026/04 ============ * Added a workaround for filesystems with a broken implementation of posix_fadvise() that returns unexpected error codes. This issue was specifically reported with the F2FS filesystem. This change is primarily intended for package maintainers who need to run "make check" on build servers that may use such filesystems. No update is required if you have not encountered an error message about failure to advise files. * Log the modification time of the content file in probe and other commands. This log entry is used by SnapRAID Daemon 1.6. 14.1 2026/03 ============ * Fixed include/exclude specification for directories. This is a regression bug in version 14.0. It is highly recommended to update. If you are using version 14.0 with include/exclude directives, simply run a new sync with this version to automatically resolve any potential issues. * Fixed a build issue in Alpine distribution. * Fixed abort condition if the Windows volume name cannot be converted to UTF-8. 14.0 2026/03 ============ * More log tags for all commands in preparation for the upcoming SnapRAID Daemon. Pre-release will be available at https://github.com/amadvance/snapraid-daemon. Note that this is the minimal SnapRAID version required to use the daemon. * New 'extra' config option to define additional disks to monitor with the 'probe' and 'smart' commands. This replaces the previous autodetection. * Introduced the 'relocated' file state to unify the previous 'copied/removed' logic. This new status specifically identifies files moved to a different path or disk with a new inode where the original has disappeared. * Added support for local exclusion rules via .snapraidignore files placed directly within the array directory tree. This allows for granular, directory-level control over which files and folders are excluded from parity, mirroring the workflow of .gitignore. * Added support for the ** globbing character to allow recursive pattern matching across multiple directory levels. * Fixed a crash on macOS when filesystem doesn't report UUID * Added a new locate command to map physical file offsets within the parity volume. This feature facilitates diagnostic analysis of the parity distribution. It supports the -t, --tail option to filter files located specifically at the end of the parity file [Ralf1108]. * Added new option `-W, --force-realloc-tail SIZE` for the `sync` command. This option works like `--force-realloc` but applies only to the specified tail portion (last SIZE bytes) of the parity file. Its main purpose and result is to shrink the size of the parity file by reclaiming unused space ("holes") that may exist in the parity due to previous fragmentation, allowing to compact the parity toward the beginning [Ralf1108]. * The -p / --plan option now accepts percentage values with decimal points (e.g. -p 1.5, -p 0.2) * Added detection of the smartctl executable. Improves reliability when running under sudo or in environments where /sbin and /usr/sbin are not in PATH. * Avoided saving the content file when it was not strictly necessary. * Added wear level percentage to the SMART report. * Added documentation of the tags used in the log file in the new snapraid_log manpage. * Added manual translations in multiple languages. * Added new undocumented options that affect the -T, --speed-test: --speed-test-period MS, specifies how many milliseconds to test each single feature in the speed test. Default 1000. --speed-test-disks-number DISKS, specifies how many disks to use in the speed test. Default 8. --speed-test-blocks-size KB, specifies the size of each block in kibibytes (1024) used in the speed test. Default 256. 13.0 2025/10 ============ * Added new thermal protection configuration options: - temp_limit TEMPERATURE_CELSIUS Sets the maximum allowed disk temperature. When any disk exceeds this limit, SnapRAID stops all operations and spins down the disks to prevent overheating. - temp_sleep TIME_IN_MINUTES Defines how long the disks remain in standby after a temperature limit event. After this time, operations are resumed. Defaults to 5 minutes. * Added a new "probe" command that shows the spinning status of all disks. * Added a new -s, --spin-down-on-error option that spins down all disks when a command ends with an error. * Added a new -A, --stats option for an extensive view of the process. * Fixed handling of command-line arguments containing UTF-8 characters on Windows, ensuring proper processing outside the Windows code page. * Removed the SMART attribute 193 "Load Cycle Count" from the failure probability computation, as its effectiveness in predicting failures is too dependent on the hard disk vendor. * Added a new "smartignore" configuration option to ignore specific SMART attributes. * Supported UUID in macOS [Nasado]. * Windows binaries built with gcc 11.5.0 using the MXE cross compiler at commit 8c4378fa2b55bc28515b23e96e05d03e671d9b90 with targets i686-w64-mingw32.static and x86_64-w64-mingw32.static and optimization -O2. 12.4 2025/01 ============ * Avoided a warning about function pointer conversion. No functional changes. 12.3 2024/01 ============ * Fixed potential integer overflow when computing the completion percentage. No effect on the functionality. * Documentation improvements. 12.2 2022/08 ============ * Fixed build issue with GLIBC 2.36 12.1 2022/01 ============ * Reduced stack usage to work in environments with limited stack size, like MUSL. * Increased the default disk cache from 8 MiB to 16 MiB. 12.0 2021/12 ============ * Parallel disk scanning. It's always enabled but it doesn't cover the -m option that still processes disks sequentially. 11.6 2021/10 ============ * The 'fix' and 'check' commands with the -e option now process the whole files that have bad blocks, and not only the blocks marked bad. This allows restoring the timestamp and printing the paths of processed files and the final state of the files like 'recovered' or 'unrecovered'. The previous behavior is available with the -b, --filter-block-error option. * Improved the speed of the filtering in 'fix' and 'check'. This phase happens after the "Selecting..." message [UhClem]. 11.5 2020/05 ============ * Removed the default -march=native to allow deployment in any machine. * Fixed typos [Andrea Gelmini]. 11.4 2020/05 ============ * Fixed build errors due to new gcc 10 default for -fno-common. * In fixing, if a parity is filtered out, don't attempt to recover its size, and proceed without it if missing. * Avoided unnecessary parity read when fixing the parity itself. This improves the 'fix' speed when a parity file is completely missing. * Removed a build warning about major/minor defined now in sys/sysmacros.h. 11.3 2018/11 ============ * Fixed handling of Linux devices that have multiple slaves. This affects the smart/list/devices/down commands [Valentin Hilbig]. * The 'list' command in verbose mode prints the full nanosecond timestamp precision. * After writing content files, also sync their directory. * Fixed an invalid time computation that could result in future scrub dates. Such dates are fixed automatically at the next scrub or sync. 11.2 2017/12 ============ * Fixed recognition of NTFS hardlinks. They behave differently than standard Unix hardlinks and this could result in SnapRAID reporting internal inconsistency errors for detecting links to the same file with different metadata attributes. * More efficient 'pool' command that updates only the links that need to be updated. This ensures that no change is done, avoiding triggering a directory rescan of other programs. * In Linux, use by default the advise "discard" mode instead of "flush". This avoids swapping out the other process memory, leaving the system more responsive. * Changed the fallocate() use to work better with Btrfs with parity disks. * Changed the --test-io-stats screen to print the file name in process for each disk. 11.1 2017/05 ============ * Fixed the check command to correctly ignore errors on unused parity. This was broken in version 9.0. * Allowed increasing the number of parity splits of existing parity. * Fixed quoting when printing in Linux. This fixes the UTF-8 screen output. Windows version was not affected. * Fixed recognition of 'hashsize' in the configuration file. The previous incorrect 'hash_size' is still supported for backward compatibility. * Fixed building in platforms that don't provide major/minor definitions in sys/types.h. * When creating 'pool' symbolic links, set their time as the linked files. * Added support for the Windows 10 symbolic link unprivileged creation, using SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE. * Windows binaries built with gcc 4.9.4 using the MXE cross compiler at commit ae56efa2b23a793b0146508bfef33027cdb09fd2 with targets i686-w64-mingw32 and x86_64-w64-mingw32 and optimization -O2. 11.0 2016/11 ============ * Added support for splitting the parity in multiple partitions. You can now specify multiple files for a single parity. As soon as a file cannot grow anymore, the next one starts growing. In the configuration file, just put more files in the same 'parity' line, separated by , (comma). Note that if this feature is used, the saved content file won't be read by older SnapRAID versions. In Windows, 256 MB are left free in each disk to avoid the warning about full disks. * Added a new 'hashsize' configuration option. It could be useful in systems with low memory, to reduce the memory usage. Note that if this feature is used, the saved content file won't be read by older SnapRAID versions. * In Linux, added the missing support for Btrfs file-systems. Note that to have full support you need also the 'libblkid' library, otherwise you won't get the UUIDs. * In screen messages, don't print the disk directory in file path. You can control the format with the test option: --test-fmt file|disk|path. * In Windows, allows using the escape char '^' to handle file patterns containing real characters matching the globbing '*?[]' ones. In Unix it was already possible to do the same escaping with '\'. * Added a new -R, --force-realloc option to reallocate all the parity information keeping the precomputed hash. This is the previous -F, --force-full that instead now maintains the same parity organization and just recomputes it. * Added test options for selecting the file advise mode to use: --test-io-advise-none for standard mode --test-io-advise-sequential advise sequential access (Linux/Windows) --test-io-advise-flush flush cache after every operation (Linux) --test-io-advise-flush-window flush cache every 8 MB (Linux) --test-io-advise-discard discard cache after every operation (Linux) --test-io-advise-discard-window discard cache every 8 MB (Linux) --test-io-advise-direct use direct/unbuffered mode (Linux/Windows) The new default mode is 'flush' in Linux (before it was 'sequential'), and 'sequential' in Windows (like before). * For Seagate SMR (Shingled Magnetic Recording), ignore the SMART attribute Command_Timeout 188 as not reliable. * Fixed running in Windows platforms that miss the RtlGenRandom() function. * Added the --test-io-cache=1 option to disable the multi-thread IO mode. 10.0 2016/02 ============ * Boosted the speed of the 'sync' and 'scrub' commands with a new multi-thread implementation. It uses one thread for each disk, dedicated exclusively to read-ahead data and parity and to write-behind parity. This maximizes the data throughput keeping disks always busy. You can control the number of blocks to cache with the option --test-io-cache=NUMBER, where the number is between 3 and 128. The default is 8 MiB of blocks. You can show run-time stats during the process with the --test-io-stats option. You will see a graph with the number of cached blocks, and a graph with the wait time percentage for all the disks and computations. * The -h, --pre-hash option saves the content file only after having verified all the hashes. This allows recovery of moved files in case a silent error is found during the hash verification check. * Allowed using the -d, --filter-disk option in the 'up' and 'down' commands. * Allowed running the 'smart' command without a configuration file. In such case it operates on all the disks of the machine. * In the configuration file 'data' is now a synonym of 'disk'. * Added the 'touch' command intended to arbitrarily set all the zero sub-second timestamps. This improves the SnapRAID capabilities to identify files. The 'status' command recommends running 'touch' if required. * Restored the functionality of the -D, --force-device option when used to work around the use of the same disk for two logical data drives when running the 'fix' command. * Used correct shell quoting in the example commands that involve files. * The minimum Windows version supported is now Windows Vista. This is required to use the native Windows thread support for the new multi-thread implementation. If you need to run on Windows XP, you have to stick with SnapRAID 9.x. 9.3 2016/01 =========== * Fixed an invalid assumption in the copy detection mechanism that could result in an internal inconsistency, and with the impossibility to run the 'sync' and 'diff' commands. This was triggered by a very specific pattern of identical files. At least three of them, with one already in the parity, and at a higher disk number than the others that should be instead new ones. This had no bad effect, if not preventing the 'sync' command to run. A workaround was to just run 'sync' one time with the -N, --force-nocopy option to disable the copy detection. * Restored the -O2 optimization option for Windows binaries, as -Og has a too big performance penalty. 9.2 2016/01 =========== * Fixed support for symlinks pointing to an empty target. Before they were only partially supported, and their presence could result in a content file not readable. This also disables multi-thread content write, as this was the issue we tried to detect with this feature, and it doesn't provide a performance advantage. Content verification is instead still multi-threaded. * Autorename disks using the matching UUID. To rename a disk you can now change directly the name in the configuration file, and run a 'sync' command. * Improved the physical offset ordering for the Btrfs file-system, correctly detecting files that have no physical offset, for whatever reason. * Added UUID support to Btrfs file-systems. It's present only if the 'libblkid' development library is available on the system. Usually this requires installing the libblkid-dev or libblkid-devel package. * Added a new --no-warnings option to disable some repetitive warnings that could be annoying to power users. * Improved the error reporting, printing a complete stack trace, that can be used to track down bugs more easily. For this reason the Windows binaries are now built with optimization option -Og, instead of -O2. 9.1 2015/11 =========== * Fixed a bug when reading a content file with a deleted entry bigger than 4 GB. This was a regression introduced in version 9.0 that could result in the impossibility to read a valid content file, after a deletion of a file bigger than 4 GB in the array. If this happened to you, just upgrading to 9.1 fixes the issue, and it allows you to continue to work. Note that this bug only prevented running 9.0, but your data was still protected and could have been recovered using the versions 8.1 or 9.1. * In Windows, disabled the file zero check requiring the --force-zero option. This check is intended for possible cases using ext3/4 in Linux, and there is no evidence that in Windows it's possible at all. * Windows binaries built with gcc 4.9.3 using the MXE cross compiler at commit 62bcdbee56e87c81f1faa105b8777a5879d4e2e with targets i686-w64-mingw32 and x86_64-w64-mingw32 and optimization -O2. 9.0 2015/11 =========== * Fixed an invalid assumption that could happen when using the -e, --filter-error option with "fix" or "check". This was triggered by a very specific pattern of fragmented files and bad blocks combination, not so easy to reproduce. This had no bad effect, if not preventing the command to run. * Drastically reduced the memory usage. For each block, it now uses 17 bytes of memory, instead of the previous 28 bytes (for 32 bit) or 36 bytes (for 64 bit). This could result in a memory saving of up to 50%. * The -p, --plan option (old --percentage) can be used to define a scrub plan: "new", "bad" and "full". The "new" plan scrubs all the new synced blocks not yet scrubbed. This allows verifying as early as possible that the written parity during sync is really correct. You can use the "status" command to show the amount of blocks not yet scrubbed. The "bad" plan scrubs only bad blocks. The "full" plan scrubs all blocks. * The graph in the "status" command now shows scrubbed blocks with '*', and synced, but not yet scrubbed, blocks with 'o'. Note that when upgrading from a previous version, all blocks are assumed scrubbed the first time. * Content files are now written asynchronously from different threads to avoid the unfortunate condition that a memory error affects all of them in the same way. After writing, they are read again to verify their CRC. This is done to ensure that they are really OK, even in the case of the worst possible silent errors. * Extended the -D, --force-device option to ignore more erroneous conditions in the 'fix' command, like inaccessible disks, or disks sharing the same physical device. * Extended the -d, --filter-disk option to allow filtering also by parity disk. * Extended the -h, --pre-hash option to also verify moved and copied files into the array before running a 'sync'. * Updated 'best' RAID functions for recent Atom CPUs. * Validated filter specifications rejecting relative paths. 8.1 2015/05 =========== * Fixed build issues in generic Unix platforms, including Mac OS X. * The "diff" command returns with error code 2 if a "sync" is required, to differentiate it from the generic error code 1. * Reduced the effect of SMART attribute 193 on the failure probability to avoid some false positive reports. 8.0 2015/04 =========== * Allowed "sync" and "scrub" to continue after the first bunch of disk errors. Blocks with errors are marked as bad, and you can fix them with the "fix -e" command. The fix is expected to force the disk firmware to reallocate the bad sector, likely fixing the problem. You can control the number of allowed errors with the new -L, --error-limit option. The default is 100. * The -e, --filter-error option doesn't write fixes to unsynced files anymore. This helps in case you are running it on a not synced array, removing the risk to revert some files to an old state. * The -e, --filter-error option is now optimal and reads only the minimal amount of data necessary to fix the errors. * The "diff" command returns with an error code if a "sync" is required. * Added new "smart" command to print a SMART report of the array. * Added new "up" and "down" commands to spin up and down the disks of the array. * Added new "devices" command to print the devices associations in the array. * Changed the log handling. If no log file is specified, all the warnings and non-fatal error messages go to stderr. If a log file is specified, only fatal error messages are printed on the screen. You can control the amount of informative messages on stdout with the -q, --quiet and -v, --verbose options, that can be specified multiple times to be more quiet or verbose. * In the "status" command the "Wasted" column now shows a negative number for the amount of space that you can still waste without filling up the parity. * In the "status" and other commands we now use GB instead of GiB, when referring to disk space. * Renamed the -s and -t options to -S and -B as they are intended to be manual only operations. * Windows binary built with gcc 4.8.1 using the MXE cross compiler 2.23, with targets i686-w64-mingw32 and x86_64-w64-mingw32. Before the x86 target was i686-pc-mingw32. 7.1 2015/01 =========== * In 'scrub' and 'sync' detects and reports Input/Output errors separately from generic file system errors. * In 'diff' doesn't print the "add" entry if a "copy" one is already printed. * Fixed build with old compilers in the x64 platforms [Leigh Phillips]. * Fixed out-of-dir builds [Christoph Junghans]. 7.0 2014/11 =========== * In 'check' and 'fix' the array is scanned to find any moved files that could be used to recover missing data. Files are identified by time-stamp, and then they are recognized also if moved to a different disk. Note that even if there are false positives they are identified checking the hash, so they have no effect, besides making the process a little slower. To disable this new behavior you can use the -N, --force-nocopy option. * The -i, --import command now identifies files by time-stamp making it very fast in importing directories. * More detailed 'status' report with single disk stats and free space available. * A lot faster directory listing for Windows. * Added AVX2 support to improve parity generation speed. * Prints the time spent waiting for each disk also in 'scrub'. * The CPU usage, speed and ETA estimations are now based on the last 100 seconds rather than from the start. * Keeps track of the UUID of the parity disks to check them before operating. * Windows binary built with gcc 4.8.1 using the MXE cross compiler 2.23. 6.4 2014/11 =========== * Added support for the new binary format of SnapRAID 7.0. This allows downgrading from version 7.0 to 6.x or previous. 6.3 2014/7 ========== * The -N, --force-nocopy option now also works if you used previous "sync" commands without it. * In 'sync' keeps stats about the amount of time spent waiting for each disk and what is spent in CPU computation. * Auto-excluded the lock file. * A more precise counting of how many blocks to scrub. Now it's exact regardless of the order of the blocks timing. * Doesn't print the 'UUID set' message anymore because it's the normal condition for empty disks. * In Windows, if the disk doesn't support reading physical offsets, allows SnapRAID to continue anyway. * Added a new -F, --force-full option that forces a full sync reusing the hash data present in the content file. 6.2 2014/5 ========== * Fixed the regression test when run as root. * Added a new heuristic to detect file copies. Now a file is assumed to be a copy if name, size and nanosecond time-stamp are matching, but if the nanosecond part of the time-stamp is 0, it requires the full path matching and not only the name. * Added the -N, --force-nocopy option to disable completely the copy detection. SnapRAID also suggests using this option in the error message of a data mismatch if likely caused by the copy detection. 6.1 2014/4 ========== * Fixed build and regression test in Mac OS X. 6.0 2014/3 ========== * In "sync", even if a silent error is found, continue to update the parity if it's possible to correct the error. Note that the block will be marked bad, and the data will be fixed only at the next "fix -e" call. But any new data added will be protected if you are using enough parity to fix both the silent error and at least another potential error. * Detected copied files from one disk to another and reused the already computed hash information to validate them in "sync". Files are assumed copied if they match the name, size and time-stamp. * For "sync", added a new -h, --pre-hash option to run a preliminary hashing step for all the new files to ensure detecting silent errors caused by the heavy machine usage of the parity computation. * In "fix", if a previous fixing attempt was made resulting in a .unrecoverable file, uses this file as starting point for the new attempt. * In the log file name, allows the use of the '>>', %D, %T modifiers to select append mode, and to insert the date and time in the name. * The options -p, --percentage and -o, --older-than now keep their default value even if the other one is specified. * Moved the .lock file in the same dir of the first specified content file. This avoids spinning up the parity disks in all commands. * The "diff", "list", "dup", "status" and "pool" commands don't access the parity disks anymore that can now stay powered down. * The default configuration file in Windows is now searched in the same directory where the snapraid.exe file resides. * New source code organization. The RAID engine is now an external component usable also in other projects. 5.3 2014/3 ========== * Doesn't warn about UUID changed if it's for an empty disk. * Fixed the number of blocks that scrub has to process when selecting a high percentage of the array. * Removed duplicate recovery attempts in synced state. 5.2 2013/12 =========== * If a disk changes UUID, automatically disable the inode recognition, because this is likely a new file-system with all the inodes reassigned, and we don't want to risk a false positive when searching for inode/time-stamp/size. * Allowed running a fix command with disks that don't need to be fixed mounted as read-only. * After a failed sync, always reallocates new files with a not yet computed parity to ensure minimizing the parity usage, if some other file is deleted in the meantime. * Doesn't count empty dirs as files in the diff counters. * Added a new "share" configuration option to allow sharing in the network the pool directory also in Windows. * Fixed build problems in OpenBSD due to the old assembler. * Fixed build problems in platforms different than x86. 5.1 2013/12 =========== * Fixed a potential crash if a file is deleted during a "sync/scrub". This is a problem introduced in version 5.0 due to new logging. If it happened to you to have a crash in sync, you don't need to take any special action, just run "sync" again. * Restored the functionality of -C, --gen-conf command. * Prints the files with duplicate physical offset if the -v, --verbose option is specified. 5.0 2013/11 =========== * Added support for up to six levels of parity. * Added a specific and faster triple parity format for CPUs that don't support SSSE3 instructions like ARM and AMD Phenom, Athlon and Opteron. * Faster RAID5 and RAID6 implementation for ARM 64 bit CPUs. * If a silent error is found during a "sync" command, directly marks the block as bad like in "scrub", without stopping the "sync" process. * Sorted files by inode when listing the directory. This improves the scanning performance. * For files with changes only in some blocks, updates the parity only for blocks that really are changed. This improves the performance in sync for modified files. * Added a new "list" command to see the stored list of files. * Removed the detailed list of errors from the screen output. To get it you must explicitly use the -l, --log option. It's now too detailed for the screen, because it contains a lot of info. * Changed the output format of some commands to make it similar to the new "list" one. * Reduced memory usage removing some unnecessary allocations. * Added a memory test on the memory buffers used in sync, scrub, check, fix before using them. 4.4 2013/10 =========== * Relaxed the check about small parity files, to allow recovering after a failed sync before resizing the parity files. 4.3 2013/10 =========== * Fixed the scrub command with the -p0 option. Now it really scrubs only the blocks marked as bad and not the full array. 4.2 2013/10 =========== * Fixed the wrong warning about physical offsets not supported caused by files not having a real offset because too small. For example, in NTFS it's possible to store such files in the MFT. It's just a cosmetic change, and not a functional one. * Removed unexpected 'Restore' entries in the diff output when dealing with file-systems without persistent inodes like NTFS in Linux. * Added support for filenames containing newlines. This happens in Mac OS X. 4.1 2013/9 ========== * If the underlying file-system doesn't support the FIEMAP command, automatically fall back to use FIBMAP for sorting files. * Fixed the import of content files from previous versions of SnapRAID that are the result of an incomplete sync. * Added a new -C, --gen-conf option to generate a dummy configuration file from the info in the content file. Just in case that you lose everything, except the content file. * At the end of sync/scrub/check/fix prints "Everything OK" if no error was found. This should make clear that everything is really OK. 4.0 2013/9 ========== * New 'scrub' command to periodically check the oldest blocks for silent errors without the need to scan the whole array. * New 'status' command to check the fragmentation, the last check time distribution, and the silent error status of the array. * Added the new Spooky hash. It's faster in 64 bit architectures. To convert you can use the new 'rehash' command. * Changed to a binary content file to improve speed and reduce size. * Removed the --find-by-name, -N option. Now it always searches by name if a file is not found searching by inode, automatically reassigning inodes in restored files without needing to sync again the file. This happens only if the file has the same path, size and timestamp at nanosecond precision. * Added a hash seed to make harder intentional collision attacks. * When inserting files for the first time, sort them by their physical address to improve read performance. * Optimized the cache use for all the RAID computations. This improves a lot the RAID performance. * Better selection of the RAID6 implementation for different CPUs. * Added RAID5/RAID6 mmx and sse2 implementations with unrolling by 4. They are a little faster than the previous unroll by 2. * Added a lock file to avoid multiple running instances on the same array. The file is named as parity file adding the .lock extension. There is also the undocumented --test-skip-lock to avoid checking it. * Automatically ignores, with warning, mount points inside the array directory tree. * Changed the 'dup' output format to include the size of each duplicate file. 3.2 2013/7 ========== * Fixed a directory creation problem in Windows when the "disk" option points to the root directory of a drive. Now SnapRAID won't complain about the inability to create such directory. If you encounter this problem when trying to recover your data, just upgrade to this version, and you'll be able to complete the recovering process. No need to upgrade for platforms different than Windows. 3.1 2013/5 ========== * Direct use of Windows API for disk access to improve error reporting. * If the 'fix' process is aborted, it removes all the new files partially recovered, to allow reusing again the -m, --filter-missing flag. * In Windows don't exclude system files anymore. Only system directories are excluded. * In Windows applies filters in case insensitive way. * The Windows binaries are now built with gcc 4.7.2. * Reduced memory occupation for hardlinks and directories. * In 'dup' don't list files with 0 size. 3.0 2013/3 ========== * Added pooling support with the new 'pool' command. It creates a virtual view of the array using symbolic links pointing to the original files. * Added a new -m, --filter-missing option that allows undeleting files, without checking/fixing the others. * Added a new -i, --import option to automatically import deleted files when fixing. * Added a new -l, --log option to save to disk the detailed log. * Added support for hardlinks and empty directories. * Added support to save symlinks to files in Windows. Note that only the symlink is saved and not the linked file. Note that Windows Symlinks to dirs and junctions are still not supported. * Files without read permission generate an error instead of a warning. You now must explicitly exclude them in the configuration file with exclusion rules. * In 'check' and 'fix', if verbose is enabled, prints the result for each processed file. * Added a UUID check to detect when a disk is replaced, and to prevent unwanted disk swaps. 2.1 2013/1 ========== * Checks for wrong empty fields in the configuration file. * Filter rules for files are not applied to directories anymore. 2.0 2012/12 =========== * Added a new -a option to make the 'check' command only check file hashes without checking the parity data. * Added a new -d option to filter by disk name. * The file modification time is now saved using nanosecond precision. This allows restoring the exact modification time in 'fix'. The new 'content' files written with this version are not backward compatible, but it's still possible to read the old format. * Fixed hard-links automatic exclusion. All the hardlinks after the first one are now correctly ignored. * If it isn't possible to grow a parity file, prints the list of files outside the maximum size allocated. * Autosave isn't triggered if we are near the end of the 'sync' process. * Before starting a 'sync', we wait for two seconds, to work around the FAT limitation of having two seconds modification time precision. This is a safe measure to be 100% sure to always detect file changes. * Always fill the memory after allocating it to avoid the OOM (Out Of Memory) killer in Linux. * Fixed compilation in Solaris/OpenIndiana for lacking both futimes() and futimens(). * Now 'sync' ensures that the parity files are not too small to contain the just loaded data. * Removed the '-H,--filter-nohidden' option. It doesn't make sense to have it as command line option. You must use the 'nohidden' option in the configuration file. * When opening files in read-only mode, also specify the noatime flag, to avoid updating the file access time. * Exclude rules for files are now also applied to directories. This allows excluding some file/directory without the need to call the stat() function on them. * The -N, --find-by-name option also ignores the nanosecond part of timestamps to work with copy programs not supporting nanoseconds. * Fixed deduplicated files handling in Windows Server 2012. * Removed MD5 support. 1.13 2012/11 ============ * Fixed a Segmentation Fault when checking/fixing if there are three or more errors in a specific block. 1.12 2012/9 =========== * Fixed file renaming in Windows during a 'fix' command. This is a Windows only issue, no reason to upgrade for other platforms. 1.11 2012/7 =========== * Fixed again directories inclusion. Exclusion rules for directories were ignored. 1.10 2012/6 =========== * Fixed directory inclusion, in case the last rule is an "include" one. * Fixed very long paths in Windows. We now always use the special '\\?' prefix to remove the 260 chars limitation. * If a file is excluded, it prints explicitly which attribute caused the exclusion. * Automatically excludes also the temporary copy of content file, the one with the ".tmp" extension. * Avoids Windows going in automatic sleep mode when running. 1.9 2012/3 ========== * Implemented a more sophisticated recovery in case a harddisk failure happens during a 'sync' command. When using RAID6 it improves the chances of recovering data with partially computed parity, after an aborted 'sync'. * Fixed the count of new files. * Added a new 'autosave' configuration option to save the intermediate 'sync' state. * Supported file-systems with read requests returning less data than requested. * In Windows ensures that the disk serial number is not zero. 1.8 2012/1 ========== * Added a new "dup" command to find all the duplicate files. * Added a new option "--filter-nohidden" to exclude hidden files. * Faster and parallel writing of content files. * The example configuration files now put the content files in the data disks instead of in the parity disks. * Added a checksum at the content file to ensure its integrity. * Using fallocate() instead of posix_fallocate() to avoid the very slow posix_fallocate() fall back of writing the whole file. 1.7 2011/11 =========== * If a file is modified or removed during a sync, the sync process doesn't stop anymore, but it will simply skip the file, resulting in an incomplete sync. Note that the sync will terminate with an error. * If the content file is placed in a data disk, it's automatically excluded from the sync process. * Increased by one the minimum number of content files. Before it was only a suggestion, but now it's a requirement because you are allowed to put content files in data disks. * Added checks to ensure that data and parity disks are different, and to correctly count the number of copies of "content" files in different disks. * Removed the dependency of the "disk" order specification in the configuration file. The used order is now saved in the content file to avoid damaging the dual parity in case the order is changed by the user. It easily allows removing or adding disks from the array when using a dual parity. * Improved the "fix" performance when a lot of files or the parity have to be recreated from scratch. * When getting unrecoverable errors, the printed log line now starts with "unrecoverable:" instead of "error:" to allow an easier identification. * Added a new option "--find-by-name" to allow syncing using only the file path and not the inode. This is useful to avoid long sync when you replace one disk with another copying manually the files. * If "fix" cannot recover a file, it's renamed adding the ".unrecoverable" extension. * Checking and fixing also empty files with size 0. 1.6 2011/9 ========== * The content file is now saved also at the start of the "sync" command. This avoids parity errors if the sync process is aborted without saving the content file and you made changes at the disk array before another "sync" command was done. More specifically, deletions or truncations of not yet synced files after the aborted sync, and before the next sync command, may have damaged the parity data. New file additions were instead safe. If these conditions may have happened to you a "check" command (also with older versions of the program) is recommended to ensure the correctness of your parity data. * The "diff" command now recognizes the reuse of inodes. * Windows hidden files are now saved like any other files. * Symbolic links are now saved in *nix. Not supported in Windows. * The "fix" command restores also the original modification time. * The message asking to use the --force-empty option now lists all the empty disks. 1.5 2011/7 ========== * Ignores extra spaces in the configuration file. * Changed the output of check/fix to allow a more easy post-processing with other tools like awk and sort. * Added the hidden option -G/--gui to enable the output of progress information for a potential GUI for SnapRAID. * Added a new "diff" command to print the list of changes detected at file level. * Faster loading of content file. Approx three times faster. 1.4 2011/6 ========== * Ignoring in sync System and Hidden files in Windows. * Files without read permission are ignored in sync. * If a file is ignored a warning message is printed. You have to exclude it to remove the warning. * In fixing, if a file cannot be written for missing permission, an error is reported only if a write is effectively required. * Ignores any symbolic links. They are not saved. 1.3 2011/5 ========== * Fixed the restore of directories with unicode chars in Windows. * Fixed support of file names starting or ending with a space. * Removes files before inserting new ones to minimize the parity size. 1.2 2011/5 ========== * Fixed use of file names out of the codepage in Windows. All the names are now stored in UTF8 in the content file. 1.1 2011/5 ========== * Fixed a bug in the check command when detecting garbage data over the expected end of the file. The parity data was anyway computed correctly, and no special action is required to update. * Changed the default checksum to Murmur3 hash. It's a lot faster than MD5. You can check its speed with the "snapraid -T" command. MD5 is still supported for backward compatibility. To convert to the new Murmur3 hash, simply remove the 'content' file, and start a new complete 'sync'. * Added RAID6 support. It's used the very good RAID6 library made by H. Peter Anvin also used in the Linux Kernel. It contains optimized implementations for SSE2 and MMX. * Added support for multiple 'content' files. You can save extra copies to be able to verify the checksums also if you lose all the 'content' files in the parity disks. * Added a filtering include logic, where anything not explicitly included is excluded. For example, it allows including only the files in a predefined set of directories. * The check command returns with an error code if any kind of error is present. Previously it was returning an error only if unrecoverable errors were present. * Opening the files in sequential mode in Windows. This should give a speedup in Windows. * In Windows you can use the backslash \ in the filter definitions instead of the forward slash /. 1.0 2011/4 ========== * No relevant change. 0.4 2011/4 ========== * Added hidden 'dry' command mainly for speed measurement. * As default, uses the OpenSSL crypto MD5 implementation. 0.3 2011/4 ========== * Added --filter option to select a subset of files in check and fix. * Better ETA estimation in all the commands. * Added support for OpenSSL crypto library to use its optimized MD5 implementation. * Added test vectors and a speed test for MD5. 0.2 2011/3 ========== * Second public test release of SnapRAID. * Functionally complete in check and fix. * Files are identified by inode and not anymore by name. * Exclusion list of files and directories. * Precise error management. * More regression tests. 0.1 2011/3 ========== * First public test release of SnapRAID.