-
Changed: Conserve now internally uses Tokio rather than raw threads and Rayon for parallelism. This is a step towards better overlapping both local and network archive operations.
-
New:
conserve mount ARCHIVEgives readonly access to all the history in the archive as a virtual filesystem, currently only on Windows. -
New: Support for reading and writing archives over SFTP. Credentials currently must come from an sftp-agent.
-
Fixed:
restore --onlyspecifying a subdirectory no longer fails due to parent directories missing from the destination. -
Fixed: More detail about the causes of errors in the log.
-
restoreno longer prints stats, due to internal changes; this will be restored later. -
Minimum Rust version increased to 1.74 due to updated dependencies.
-
Fixed: Restore now sets Unix user/group ownership on symlinks and directories. Previously, only file ownership was restored. (Setting file ownership typically requires restoring as root.)
-
Performance: Also keep a cache of the existence of blocks that have not yet been read.
-
Changed: The format and keys written by
--metrics-jsonhas changed. -
Changed: New more detailed progress display, especially during backup.
-
S3 support! Enable it with
cargo install --features s3, then e.g.cargo backup s3://mybucket.example/. -
Performance: A simple cache of retrieved decompressed blocks now speeds up restores, especially on relatively slow storage like S3.
-
--debugnow shows on stderr only debug messages from Conserve itself and not from dependencies. All the messages are still recorded to the--log-jsonfile if that is given. -
Robustness: during backup, if the blocks referenced by the previous version are missing or zero length, write new blocks rather than referencing them. This allows the archive to better recover from filesystem corruption so that at least new backups are fully readable.
-
Deprecate low-value
--metrics-json.
-
Better progress bars for various operations including
validate. -
Don't complain if unable to chown during restore; this is normal when not run as root.
-
New
--log-jsonglobal option to capture all logs, and--metrics-jsonto write out counters. -
New internal non-breaking format change: backups (in the band header) can now declare some format flags needed to read the backup correctly. If any format flags are set then at least Conserve 23.2.0 is needed to read the backup.
-
New
--changes-jsonoption torestoreandbackup. -
diffoutput format has changed slightly to be the same asbackup. -
New
diff --jsonandls --json.
-
Fixed: User and group mappings are now cached in memory. This fixes a performance regression in restore on the order of 10%.
-
Changed: Timestamps in
conserve versionsare now in RFC 3339 format, including aTbetween the date and the time, and a timezone indicator.
-
Switched to CalVer versioning.
-
New: Support for storing, restoring, and listing Unix owner, group, and permissions. Thanks to @believeinlain.
-
Fixed:
--exclude /anow also excludes everything under/afrom listing, diff, restore, etc. (Previously you would have to write/a/**.) -
Fixed:
validateshould not complain aboutGC_LOCKor.DS_Storefiles in the archive directory.
Released 2022-08-12
-
Fixed: Previously, if the first backup in an archive was incomplete, Conserve could get painfully slow, due to a bug that caused it to repeatedly reread the incomplete index. (Thanks to WolverinDEV.)
-
Archives may be specified as URLs: currently only as
file:///URLs. -
Changed the format of text output from
conserve backup -v: it only shows new or changed files (and currently only plain files), and the file state is shown by a single-character prefix similar toconserve diff, rather than a suffix. -
Changed to use Nutmeg to draw progress bars, which changes their appearance somewhat.
-
Added a
--no-progressoption. -
Added a
--debugoption.
-
Find referenced blocks by walking all bands in parallel. This significantly speeds up GC, deletion, etc: 6.5x faster in one test.
-
Exclude patterns changed: patterns starting with a
/match against the entire path from the top of the tree, and patterns not starting with a slash match anywhere inside the path. For example,/target/releasewill only excludereleaseinside a directory calledtargetin the tree root, buttarget/releasewill exclude anything calledreleaseinside a directory calledtargetanywhere in the tree. -
Add new
--exclude-fromoption. -
Add new
--no-statsoption. -
Directories marked with
CACHEDIR.TAGare automatically excluded from backups.
-
conserve validatereads all indexes before checking block contents, which avoids false-positive warnings when a backup is made simultaneously with validation. -
New option
conserve validate --quick, which checks that referenced data blocks are present on disk without reading their content. Corruption or IO errors inside the blocks will of course not be detected by a--quickvalidation.
conserve diffis more useful, and shows whether files have changed size/mtime. (It does not yet compare file content for files with the same metadata.)
-
conserve delete --dry-runaccurately predicts how much space will be freed. -
conserve deleteplans the whole operation before deleting anything, so if it's interrupted early it's less likely that anything will have been deleted. -
conserve delete --no-gcwas removed; it had limited value.
-
Fix the displayed count of blocks written in backup stats.
-
Performance improvements in backup and restore.
-
Better display of deletion stats.
-
New
conserve versions --utcoption. -
New
conserve versions --newestoption (thanks to tkuestner@). -
Format of
conserve versionstabular output changed slightly.
-
File, directory and symlink modification times are restored by
conserve restore. -
conserve backup -vshows whether files are new, modified, etc.
- New option
conserve size --bytesgives output in bytes, rather than megabytes.
-
Reading a subtree of a local source is faster, because it no longer reads and discards the whole tree.
-
Small files (under 100kB) are combined into blocks, to allow better cross-file compression and to produce fewer small file reads and writes.
-
Backups use a stitched index as the basis. As a result, Conserve is better able to recognize unchanged files after an interrupted backup.
- New
conserve deletecommand to delete specified backup versions and (by default) blocks they reference.
- New
conserve gccommand deletes unreferenced blocks, which might have been left behind by a previous interrupted backup.
validateand other operations that list all blocks no longerlstatthem, which can be a significant performance improvement on some kernels or filesystems.
- Better progress bars, especially for
validate, including an estimated time to completion.
- Remove needlessly-alarming warning about empty index hunks.
-
New
conserve debug unreferenced ARCHIVElists unreferenced blocks. -
Conserve now "stitches" together incomplete backups with the previous index. This means that restoring from a backup that did not complete will give the most complete available copy of the tree at that point in time.
- The
--incompleteoption, to read the partial tree from an interrupted backup, is no longer needed and has been removed.
- New
conserve restore --only SUBTREEoption restores only one subtree of the archive. Thanks to Francesco Gadaleta.
conserve validate is now significantly faster. Conserve remembers which blocks
have been validated and what their uncompressed length is, and uses this when
checking that file index entries are valid.
Some rearrangements to the command-line grammar to make it more concise and consistent:
-
conserve debugcommands are now briefer:conserve debug index,conserve debug referenced,conserve debug blocks. -
conserve source ls DIRis nowconserve ls --source DIR. -
conserve source size DIRis nowconserve size --source DIR. -
conserve tree sizeis nowconserve size. -
Obsolete global option
--uiwas removed. -
The short option for
conserve versions --shortis now-q. -
The short option for
conserve versions --sizesis now-z.
-
Change to using structopt for option parsing.
-
Change to using thiserror for error enum construction.
-
Added a new
Transporttrait, abstracting the IO options for the Archive so that Conserve can in future also access archives over SFTP or in cloud storage. -
Add tests that Conserve can read and write archives written by older compatible versions. (At present, everything from the 0.6 series that changed the format.)
-
New simpler
Archive::backupandArchive::restorepublic APIs.
Conserve 0.6.4 uses the same 0.6 archive version, with one compatible addition:
- BANDTAIL files contain an additional
index_hunk_countto enableconserve validateto check that no hunks are missing.
-
Improved performance of incremental backups, by removing check that blocks referenced by the previous backup are still present. In one experiment of writing a large tree with few changes to a moderately-slow USB drive, this cuts overall elapsed time by a factor of about 7x!
The check is redundant unless the archive has somehow been corrupted: blocks are always written out before the index hunk than references them.
The basic approach in Conserve is to assume, in commands other than
validate, that the archive is correctly formatted, and to avoid unnecessary ad-hoc checks that this is true.
-
Removed global
--statsoption. Stats are always shown as info-level messages. -
Better ISO 8601 style timestamps in
conserve versionsoutput.
-
Don't panic on timestamps on or before the Unix epoch in 1970. (#100)
-
Correctly count index IO in the backup stats summary. (#87)
- Improved, updated, and corrected format and design documentation (in the
docsubdirectory of the source tree.)
-
Conserve 0.6.3 uses the same 0.6 archive format, but backups it writes can only be read by 0.6.3 and later.
-
Add a per-band minimum version (
BAND_FORMAT_VERSION), allowing for future additions to the format without requiring a whole new archive. This is stored inband_format_versionwithin theBANDHEADfile. Conserve gives a clean error message if it can't read the per-band minimum version. (#96) -
Improved index uncompressed size slightly, by omitting the data offset within the block when it is zero, which is common.
Various, including:
-
Removal of
Reportconcept. Instead, operations return a type-specificStatsdescribing the work that was done, messages are logged, and progress bars are drawn through theuimodule. -
New small code style guide.
-
Added nanosecond precision to stored mtimes. The main benefit of this is more-precise detection of files that changed less than a second after the previous backup.
-
Changed
conserve tree sizeandconserve source sizeto report in MB, not bytes, as used elsewhere in the UI. -
Improved the speed of source tree iteration, and therefore the speed of backups with many unchanged files.
-
Add back
conserve versions --sizes, but showing the size of the tree in each version. -
Improved performance of backup.
- Improved performance on incremental backup, by only opening source files if we need to read the contents.
-
Changed to new archive format "0.6", which has common block storage across bands, and removes the whole-file hash in favor of per-block hashes.
To read from Conserve 0.5 archives, use an old Conserve binary. Until 1.0, support for old formats won't be kept in the head version.
-
Added incremental backups! If files have the same size and mtime (tracked with integer second accuracy), they aren't read and stored but rather a reference to the previous block is added.
-
Added a basic
conserve diffcommand, which compares a source directory to a stored tree. -
Changed to Rust edition 2018.
-
Added command
conserve debug index dump. -
Removed
conserve versions --sizesoptions, as storage is now shared across bands. The size of one stored tree can be measured withconserve tree size.
-
conserve validatechecks the archive much more thoroughly. -
New
source sizeandtree sizecommands. -
Progress percentage is now measured as a fraction of the total tree to be copied, which is a more linear measurement.
-
Removed internal timing of operations, shown in
--stats. Now that Conserve is increasingly aggressively multithreaded, these times aren't very meaningful, and the implementation causes some lock contention.
-
Conserve 0.5 uses a new format, and can't read 0.4 repositories. The new format has a single blockdir per archive for all file contents, rather than one per band. This significantly reduces space usage and backup time.
-
New command
validatechecks some (but not yet all) internal correctness and consistency properties of an archive. -
New commands
conserve debug block listandconserve debug block referenced. -
conserve list-sourcewas renamed toconserve source ls. -
Better progress bars including percentage completion for many operations.
-
backup,restore, andvalidateshow a summary of what they did.
-
conserve versionshas a new--sizesoption, to show disk usage by each version. -
-voption tobackupandrestoreprints filenames as they're processed.--no-progressturns off the progress bar.
-
Commands such as
restoreandlsthat operate on a version, will by default operate on the last complete version, rather than defaulting to the last version altogether and then potentially complaining it's incomplete. Similarly for theSourceTree::openAPI when given noBandIdargument. -
Some backup work is parallelized using Rayon, giving a mild speedup for large files. There is potential to much more work here, because backups are generally CPU-bound in Snap compression and BLAKE2 hashing, and Conserve should try to use every available core.
-
Various internal rearrangements including treating stored and live trees as instances of a common trait, to enable future features.
-
Large files are broken into multiple blocks of 1MB uncompressed content, so that memory use is capped and so that common blocks can potentially be shared.
-
New
--exclude GLOBoption.
-
Switch from Brotli2 to Snappy compression: probably a better speed/size tradeoff for mixed data. (Breaks format compatibility.)
-
Updated to work with Rust 1.22 and current library dependencies.
Released 2017-01-08.
-
Flush (sync) archive files to stable storage after they're written. In the event of the machine crashing or losing power in the middle of a backup, this should reduce the chance that there are index blocks pointing to data blocks not on the filesystem.
Tests show this has little impact on performance and it's consistent with Conserve's value of safety. (Windows 10 performance turns out to be ruined by the Windows Defender antivirus, but if you exclude the archive directory it is fine, even with this change.)
-
New
--uioption to choose plain text or fancy colored output, replacing--no-progress. -
Color UI shows progress bars cleanly interleaved with log messages.
-
Filenames are now only shown during
backupandrestorewhen the-voption is given. -
conserve versionsby default shows whether they're complete or not.conserve versions --shortgives the same behavior as previously of just listing the version names. -
conserve lsandconserve restorewill by default refuse to read incomplete versions, to prevent you thinking you restored the whole tree when it may be truncated. You can override this with--incomplete, or select an older version with--backup.
Released 2016-12-17
-
Fixed Cargo package metadata.
-
New
--backupoption toconserve lsandconserve restorelets you retrieve older versions.
Released 2016-12-11
- Archive format has changed from 0.2 without backward compatibility.
- New and changed commands:
conserve restoremakes Conserve a much more useful backup tool!- Renamed
list-versionsto justversions.
- Symlinks are backed up and restored. (Only on Unix, they're skipped on Windows because they seem to be rare and to have complicated semantics.)
- New text-mode progress bar.
- Compression is substantially faster, through setting Brotli to level 4.
Released 2016-04-18
- Rewrite in lovely Rust.
- New commands:
conserve init: create an archive. (Renamed frominit-archive.)conserve backup: copy a directory recursively into a new top-level version in the archive. Incremental backups and exclusions are not yet supported.conserve list-source: show what files are in the source directory and will potentially be backed up.conserve list-versions: show what backups are in the archive.conserve ls: lists files in the latest version in the archive.
- Changed format:
- Metadata in json.
- BLAKE2b hashes.
- Brotli compression.
--statsoption shows how much IO was done, how much compression helped, and how much time was taken for various sub-operations.
Released 2013-10-01
- Very basic but functional backup, restore, and validate.