{"id":13473461,"url":"https://github.com/jimsalterjrs/sanoid","last_synced_at":"2025-05-13T21:10:14.290Z","repository":{"id":23398432,"uuid":"26760439","full_name":"jimsalterjrs/sanoid","owner":"jimsalterjrs","description":"These are policy-driven snapshot management and replication tools which use OpenZFS for underlying next-gen storage. (Btrfs support plans are shelved unless and until btrfs becomes reliable.)","archived":false,"fork":false,"pushed_at":"2025-02-12T00:54:53.000Z","size":1027,"stargazers_count":3318,"open_issues_count":144,"forks_count":320,"subscribers_count":96,"default_branch":"master","last_synced_at":"2025-04-28T14:57:28.769Z","etag":null,"topics":["replication","snapshot","zfs-filesystem"],"latest_commit_sha":null,"homepage":"http://www.openoid.net/products/","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jimsalterjrs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELIST","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-11-17T14:34:31.000Z","updated_at":"2025-04-27T01:53:46.000Z","dependencies_parsed_at":"2024-01-13T21:28:51.289Z","dependency_job_id":"e2b284c5-5372-46f3-b140-5a84890c6cbc","html_url":"https://github.com/jimsalterjrs/sanoid","commit_stats":{"total_commits":584,"total_committers":93,"mean_commits":6.279569892473118,"dds":0.6455479452054795,"last_synced_commit":"a7e6c2db680a76784448ba1f810d7df9a50c3ddc"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimsalterjrs%2Fsanoid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimsalterjrs%2Fsanoid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimsalterjrs%2Fsanoid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jimsalterjrs%2Fsanoid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jimsalterjrs","download_url":"https://codeload.github.com/jimsalterjrs/sanoid/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254029002,"owners_count":22002283,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["replication","snapshot","zfs-filesystem"],"created_at":"2024-07-31T16:01:03.796Z","updated_at":"2025-05-13T21:10:09.279Z","avatar_url":"https://github.com/jimsalterjrs.png","language":"Perl","funding_links":["https://www.patreon.com/PracticalZFS","https://www.paypal.com/donate/?hosted_button_id=5BLPNV86D4S9N"],"categories":["Perl","Install from Source","others","🛠️ ZFS tools"],"sub_categories":["Snapshots Management/System Recovery","ZFS Backup tools"],"readme":"\u003ctable align=\"center\"\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd border=\"1\" width=\"750\"\u003e\n\t\t\t\u003cp align=\"center\"\u003e\n\t\t\t\t\u003cimg src=\"http://www.openoid.net/wp-content/themes/openoid/images/sanoid_logo.png\" alt=\"sanoid logo\" title=\"sanoid logo\"\u003e\n\t\t\t\u003c/p\u003e\n\t\t\t\u003cimg src=\"https://openoid.net/gplv3-127x51.png\" width=127 height=51 align=\"right\"\u003e\n\t\t\t\u003cp align=\"left\"\u003eSanoid is provided to you completely free and libre, now and in perpetuity, via the GPL v3.0 license. If you find the project useful, please consider either a recurring or one-time donation at \u003ca href=\"https://www.patreon.com/PracticalZFS\" target=\"_blank\"\u003ePatreon\u003c/a\u003e or \u003ca href=\"https://www.paypal.com/donate/?hosted_button_id=5BLPNV86D4S9N\" target=\"_blank\"\u003ePayPal\u003c/a\u003e—your contributions will support both this project and the Practical ZFS \u003ca href=\"https://discourse.practicalzfs.com/\" target=\"_blank\"\u003eforum\u003c/a\u003e.\n\t\t\t\u003c/p\u003e\n\t\t\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\nSanoid is a policy-driven snapshot management tool for ZFS filesystems.  When combined with the Linux KVM hypervisor, you can use it to make your systems \u003ca href=\"https://openoid.net/transcend\" target=\"_blank\"\u003efunctionally immortal\u003c/a\u003e via automated snapshot management and over-the-air replication.\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://youtu.be/ZgowLNBsu00\" target=\"_blank\"\u003e\u003cimg src=\"http://www.openoid.net/sanoid_video_launcher.png\" alt=\"sanoid rollback demo\" title=\"sanoid rollback demo\"\u003e\u003c/a\u003e\u003cbr clear=\"all\"\u003e\u003csup\u003e(Real time demo: rolling back a full-scale cryptomalware infection in seconds!)\u003c/sup\u003e\u003c/p\u003e\n\nMore prosaically, you can use Sanoid to create, automatically thin, and monitor snapshots and pool health from a single eminently human-readable TOML config file at /etc/sanoid/sanoid.conf.  (Sanoid also requires a \"defaults\" file located at /etc/sanoid/sanoid.defaults.conf, which is not user-editable.)  A typical Sanoid system would have a single cron job but see INSTALL.md for more details:\n```\n* * * * * TZ=UTC /usr/local/bin/sanoid --cron\n```\n\n`Note`: Using UTC as timezone is recommended to prevent problems with daylight saving times\n\nAnd its /etc/sanoid/sanoid.conf might look something like this:\n\n```\n[data/home]\n\tuse_template = production\n[data/images]\n\tuse_template = production\n\trecursive = yes\n\tprocess_children_only = yes\n[data/images/win7]\n\thourly = 4\n\n#############################\n# templates below this line #\n#############################\n\n[template_production]\n        frequently = 0\n        hourly = 36\n        daily = 30\n        monthly = 3\n        yearly = 0\n        autosnap = yes\n        autoprune = yes\n```\n\nWhich would be enough to tell sanoid to take and keep 36 hourly snapshots, 30 dailies, 3 monthlies, and no yearlies for all datasets under data/images (but not data/images itself, since process_children_only is set).  Except in the case of data/images/win7, which follows the same template (since it's a child of data/images) but only keeps 4 hourlies for whatever reason.\n\nFor more full details on sanoid.conf settings see [Wiki page](https://github.com/jimsalterjrs/sanoid/wiki/Sanoid#options).\n\n**Note**: Be aware that if you don't specify some interval options the defaults will be used (from /etc/sanoid/sanoid.defaults.conf)\n\n##### Sanoid Command Line Options\n\n+ --cron\n\n \tThis will process your sanoid.conf file, create snapshots, then purge expired ones.\n\n+ --configdir\n\n\tSpecify a location for the config file named sanoid.conf. Defaults to /etc/sanoid\n\n+ --cache-dir\n\n\tSpecify a directory to store the zfs snapshot cache. Defaults to /var/cache/sanoid\n\n+ --run-dir\n\n\tSpecify a directory for temporary files such as lock files. Defaults to /var/run/sanoid\n\n+ --take-snapshots\n\n\tThis will process your sanoid.conf file, create snapshots, but it will NOT purge expired ones. (Note that snapshots taken are atomic in an individual dataset context, \u003ci\u003enot\u003c/i\u003e a global context - snapshots of pool/dataset1 and pool/dataset2 will each be internally consistent and atomic, but one may be a few filesystem transactions \"newer\" than the other.)\n\n+ --prune-snapshots\n\n\tThis will process your sanoid.conf file, it will NOT create snapshots, but it will purge expired ones.\n\n+ --force-prune\n\n\tPurges expired snapshots even if a send/recv is in progress\n\n+ --monitor-snapshots\n\n\tThis option is designed to be run by a Nagios monitoring system. It reports on the health of your snapshots.\n\n+ --monitor-health\n\n\tThis option is designed to be run by a Nagios monitoring system. It reports on the health of the zpool your filesystems are on. It only monitors filesystems that are configured in the sanoid.conf file.\n\n+ --monitor-capacity\n\n\tThis option is designed to be run by a Nagios monitoring system. It reports on the capacity of the zpool your filesystems are on. It only monitors pools that are configured in the sanoid.conf file.\n\n+ --force-update\n\n\tThis clears out sanoid's zfs snapshot listing cache. This is normally not needed.\n\n+ --version\n\n\tThis prints the version number, and exits.\n\n+ --quiet\n\n\tSuppress non-error output.\n\n+ --verbose\n\n\tThis prints additional information during the sanoid run.\n\n+ --debug\n\n\tThis prints out quite a lot of additional information during a sanoid run, and is normally not needed.\n\n+ --readonly\n\n\tSkip creation/deletion of snapshots (Simulate).\n\n+ --help\n\n\tShow help message.\n\n### Sanoid script hooks\n\nThere are three script types which can optionally be executed at various stages in the lifecycle of a snapshot:\n\n#### `pre_snapshot_script`\n\nWill be executed before the snapshot(s) of a single dataset are taken. The following environment variables are passed:\n\n| Env vars           | Description                                                                                                                                          |\n| -----------------  | -----------                                                                                                                                          |\n| `SANOID_SCRIPT`    | The type of script being executed, one of `pre`, `post`, or `prune`.  Allows for one script to be used for multiple tasks                            |\n| `SANOID_TARGET`    | **DEPRECATED** The dataset about to be snapshot (only the first dataset will be provided)                                                            |\n| `SANOID_TARGETS`   | Comma separated list of all datasets to be snapshotted (currently only a single dataset, multiple datasets will be possible later with atomic groups) |\n| `SANOID_SNAPNAME`  | **DEPRECATED** The name of the snapshot that will be taken (only the first name will be provided, does not include the dataset name)                 |\n| `SANOID_SNAPNAMES` | Comma separated list of all snapshot names that will be taken (does not include the dataset name)                                                    |\n| `SANOID_TYPES`     | Comma separated list of all snapshot types to be taken (yearly, monthly, weekly, daily, hourly, frequently)                                          |\n\nIf the script returns a non-zero exit code, the snapshot(s) will not be taken unless `no_inconsistent_snapshot` is false.\n\n#### `post_snapshot_script`\n\nWill be executed when:\n\n- The pre-snapshot script succeeded or\n- The pre-snapshot script failed and `force_post_snapshot_script` is true.\n\n| Env vars             | Description                                          |\n| -------------------- | -----------                                          |\n| `SANOID_SCRIPT`      | as above                                             |\n| `SANOID_TARGET`      | **DEPRECATED** as above                              |\n| `SANOID_TARGETS`     | as above                                             |\n| `SANOID_SNAPNAME`    | **DEPRECATED** as above                              |\n| `SANOID_SNAPNAMES`   | as above                                             |\n| `SANOID_TYPES`       | as above                                             |\n| `SANOID_PRE_FAILURE` | This will indicate if the pre-snapshot script failed |\n\n#### `pruning_script`\n\nWill be executed after a snapshot is successfully deleted. The following environment variables will be passed:\n\n| Env vars          | Description |\n| ----------------- | ----------- |\n| `SANOID_SCRIPT`   | as above    |\n| `SANOID_TARGET`   | as above    |\n| `SANOID_SNAPNAME` | as above    |\n\n\n#### example\n\n**sanoid.conf**:\n```\n...\n[sanoid-test-0]\n\tuse_template = production\n\trecursive = yes\n\tpre_snapshot_script = /tmp/debug.sh\n\tpost_snapshot_script = /tmp/debug.sh\n\tpruning_script = /tmp/debug.sh\n...\n```\n\n**verbose sanoid output**:\n```\n...\nexecuting pre_snapshot_script '/tmp/debug.sh' on dataset 'sanoid-test-0'\ntaking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_yearly\ntaking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_monthly\ntaking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_daily\ntaking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_hourly\nexecuting post_snapshot_script '/tmp/debug.sh' on dataset 'sanoid-test-0'\n...\n```\n\n**pre script env variables**:\n```\nSANOID_SCRIPT=pre\nSANOID_TARGET=sanoid-test-0/b/bb\nSANOID_TARGETS=sanoid-test-0/b/bb\nSANOID_SNAPNAME=autosnap_2020-02-12_14:49:32_yearly\nSANOID_SNAPNAMES=autosnap_2020-02-12_14:49:32_yearly,autosnap_2020-02-12_14:49:32_monthly,autosnap_2020-02-12_14:49:32_daily,autosnap_2020-02-12_14:49:32_hourly\nSANOID_TYPES=yearly,monthly,daily,hourly\n```\n\n**post script env variables**:\n```\nSANOID_SCRIPT=post\nSANOID_TARGET=sanoid-test-0/b/bb\nSANOID_TARGETS=sanoid-test-0/b/bb\nSANOID_SNAPNAME=autosnap_2020-02-12_14:49:32_yearly\nSANOID_SNAPNAMES=autosnap_2020-02-12_14:49:32_yearly,autosnap_2020-02-12_14:49:32_monthly,autosnap_2020-02-12_14:49:32_daily,autosnap_2020-02-12_14:49:32_hourly\nSANOID_TYPES=yearly,monthly,daily,hourly\nSANOID_PRE_FAILURE=0\n```\n\n----------\n\n# Syncoid\n\nSanoid also includes a replication tool, syncoid, which facilitates the asynchronous incremental replication of ZFS filesystems.  A typical syncoid command might look like this:\n\n```\nsyncoid data/images/vm backup/images/vm\n```\n\nWhich would replicate the specified ZFS filesystem (aka dataset) from the data pool to the backup pool on the local system, or\n\n```\nsyncoid data/images/vm root@remotehost:backup/images/vm\n```\n\nWhich would push-replicate the specified ZFS filesystem from the local host to remotehost over an SSH tunnel, or\n\n```\nsyncoid root@remotehost:data/images/vm backup/images/vm\n```\n\nWhich would pull-replicate the filesystem from the remote host to the local system over an SSH tunnel.\n\nSyncoid supports recursive replication (replication of a dataset and all its child datasets) and uses mbuffer buffering, lzop compression, and pv progress bars if the utilities are available on the systems used.\nIf ZFS supports resumable send/receive streams on both the source and target those will be enabled as default.\n\nAs of 1.4.18, syncoid also automatically supports and enables resume of interrupted replication when both source and target support this feature.\n\n##### Syncoid Dataset Properties\n\n+ syncoid:sync\n\n  Available values:\n\n  + `true` (default if unset)\n\n    This dataset will be synchronised to all hosts.\n\n  + `false`\n\n    This dataset will not be synchronised to any hosts - it will be skipped. This can be useful for preventing certain datasets from being transferred when recursively handling a tree.\n\n  + `host1,host2,...`\n\n    A comma separated list of hosts. This dataset will only be synchronised by hosts listed in the property.\n\n    _Note_: this check is performed by the host running `syncoid`, thus the local hostname must be present for inclusion during a push operation // the remote hostname must be present for a pull.\n\n  _Note_: this will also prevent syncoid from handling the dataset if given explicitly on the command line.\n\n  _Note_: syncing a child of a no-sync dataset will currently result in a critical error.\n\n  _Note_: empty properties will be handled as if they were unset.\n\n##### Syncoid Command Line Options\n\n+ [source]\n\n\tThis is the source dataset. It can be either local or remote.\n\n+ [destination]\n\n\tThis is the destination dataset. It can be either local or remote.\n\n+ --identifier=\n\n\tAdds the given identifier to the snapshot and hold name after \"syncoid_\" prefix and before the hostname. This enables the use case of reliable replication to multiple targets from the same host. The following chars are allowed: a-z, A-Z, 0-9, _, -, : and . .\n\n+ -r --recursive\n\n\tThis will also transfer child datasets.\n\n+ --skip-parent\n\n\tThis will skip the syncing of the parent dataset. Does nothing without '--recursive' option.\n\n+ --compress \u003ccompression type\u003e\n\n\tCompression method to use for network transfer. Currently accepted options: gzip, pigz-fast, pigz-slow, zstd-fast, zstd-slow, lz4, xz, lzo (default) \u0026 none. If the selected compression method is unavailable on the source and destination, no compression will be used.\n\n+ --source-bwlimit \u003climit t|g|m|k\u003e\n\n\tThis is the bandwidth limit in bytes (kbytes, mbytes, etc) per second imposed upon the source. This is mainly used if the target does not have mbuffer installed, but bandwidth limits are desired.\n\n+ --target-bwlimit \u003climit t|g|m|k\u003e\n\n\tThis is the bandwidth limit in bytes (kbytes, mbytes, etc) per second imposed upon the target. This is mainly used if the source does not have mbuffer installed, but bandwidth limits are desired.\n\n+ --no-command-checks\n\n\tDoes not check the existence of commands before attempting the transfer, providing administrators a way to run the tool with minimal overhead and maximum speed, at risk of potentially failed replication, or other possible edge cases. It assumes all programs are available, and should not be used in most situations. This is an not an officially supported run mode.\n\n+ --no-stream\n\n\tThis argument tells syncoid to use -i incrementals, not -I. This updates the target with the newest snapshot from the source, without replicating the intermediate snapshots in between. (If used for an initial synchronization, will do a full replication from newest snapshot and exit immediately, rather than starting with the oldest and then doing an immediate -i to the newest.)\n\n+ --no-sync-snap\n\n\tThis argument tells syncoid to restrict itself to existing snapshots, instead of creating a semi-ephemeral syncoid snapshot at execution time. Especially useful in multi-target (A-\u003eB, A-\u003eC) replication schemes, where you might otherwise accumulate a large number of foreign syncoid snapshots.\n\n+ --keep-sync-snap\n\n    This argument tells syncoid to skip pruning old snapshots created and used by syncoid for replication if '--no-sync-snap' isn't specified.\n\n+ --create-bookmark\n\n\tThis argument tells syncoid to create a zfs bookmark for the newest snapshot after it got replicated successfully. The bookmark name will be equal to the snapshot name. Only works in combination with the --no-sync-snap option. This can be very useful for irregular replication where the last matching snapshot on the source was already deleted but the bookmark remains so a replication is still possible.\n\n+ --use-hold\n\tThis argument tells syncoid to add a hold to the newest snapshot on the source and target after replication succeeds and to remove the hold after the next successful replication. Setting a hold prevents the snapshots from being destroyed. The hold name includes the identifier if set. This allows for separate holds in case of replication to multiple targets.\n\n+ --preserve-recordsize\n\n\tThis argument tells syncoid to set the recordsize on the target before writing any data to it matching the one set on the replication src. This only applies to initial sends.\n\n+ --preserve-properties\n\n\tThis argument tells syncoid to get all locally set dataset properties from the source and apply all supported ones on the target before writing any data. It's similar to the '-p' flag for zfs send but also works for encrypted datasets in non raw sends. This only applies to initial sends.\n\n+ --delete-target-snapshots\n\n\tWith this argument snapshots which are missing on the source will be destroyed on the target. Use this if you only want to handle snapshots on the source.\n\tNote that snapshot deletion is only done after a successful synchronization. If no new snapshots are found, no synchronization is done and no deletion either.\n\n+ --no-clone-rollback\n\n\tDo not rollback clones on target\n\n+ --no-rollback\n\n\tDo not rollback anything (clones or snapshots) on target host\n\n+ --exclude=REGEX\n\n\t__DEPRECATION NOTICE:__ `--exclude` has been deprecated and will be removed in a future release. Please use `--exclude-datasets` instead.\n\n\tThe given regular expression will be matched against all datasets which would be synced by this run and excludes them. This argument can be specified multiple times. The provided regex pattern is matched against the dataset name only; this option does not affect which snapshots are synchronized. If both `--exclude` and `--exclude-datasets` are provided, then `--exclude` is ignored.\n\n+ --exclude-datasets=REGEX\n\n\tThe given regular expression will be matched against all datasets which would be synced by this run and excludes them. This argument can be specified multiple times. The provided regex pattern is matched against the dataset name only; this option does not affect which snapshots are synchronized.\n\n+ --exclude-snaps=REGEX\n\n\tExclude specific snapshots that match the given regular expression. The provided regex pattern is matched against the snapshot name only. Can be specified multiple times. If a snapshot matches both the exclude-snaps and include-snaps patterns, then it will be excluded.\n\n+ --include-snaps=REGEX\n\n\tOnly include snapshots that match the given regular expression. The provided regex pattern is matched against the snapshot name only. Can be specified multiple times. If a snapshot matches both the exclude-snaps and include-snaps patterns, then it will be excluded.\n\n+ --no-resume\n\n\tThis argument tells syncoid to not use resumable zfs send/receive streams.\n\n+ --force-delete\n\n\tRemove target datasets recursively (WARNING: this will also affect child datasets with matching snapshots/bookmarks), if there are no matching snapshots/bookmarks. Also removes conflicting snapshots if the replication would fail because of a snapshot which has the same name between source and target but different contents.\n\n+ --no-clone-handling\n\n\tThis argument tells syncoid to not recreate clones on the target on initial sync, and do a normal replication instead.\n\n+ --dumpsnaps\n\n\tThis prints a list of snapshots during the run.\n\n+ --no-privilege-elevation\n\n\tBypass the root check and assume syncoid has the necessary permissions (for use with ZFS permission delegation).\n\n+ --sshport\n\n\tAllow sync to/from boxes running SSH on non-standard ports.\n\n+ --sshcipher\n\n\tInstruct ssh to use a particular cipher set.\n\n+ --sshoption\n\n\tPasses option to ssh. This argument can be specified multiple times.\n\n+ --sshkey\n\n\tUse specified identity file as per ssh -i.\n\n+ --insecure-direct-connection=IP:PORT[,IP:PORT,[TIMEOUT,[mbuffer]]]\n\n\tWARNING: This is an insecure option as the data is not encrypted while being sent over the network. Only use if you trust the complete network path.\n\tUse a direct tcp connection (with socat and busybox nc/mbuffer) for the actual zfs send/recv stream. All control commands are still executed via the ssh connection. The first address pair is used for connecting to the target host from the source host and the second pair is for listening on the target host. If the later isn't provided the same as the former is used. This can be used for saturating high throughput connection like \u003e= 10GBe network which isn't easy with the overhead off ssh. It can also be useful for encrypted datasets to lower the cpu usage needed for replication but be aware that metadata is NOT ENCRYPTED in this case. The default timeout is 60 seconds and can be overridden by providing it as third argument. By default busybox nc is used for the listeing tcp socket, if mbuffer is preferred specify its name as fourth argument but be aware that mbuffer listens on all interfaces and uses an optionally provided ip address for access restriction (This option can't be used for relaying between two remote hosts)\n\n+ --quiet\n\n\tSuppress non-error output.\n\n+ --debug\n\n\tThis prints out quite a lot of additional information during a syncoid run, and is normally not needed.\n\n+ --help\n\n\tShow help message.\n\n+ --version\n\n\tPrint the version and exit.\n\n+ --monitor-version\n\n\tThis doesn't do anything right now.\n\nNote that the sync snapshots syncoid creates are not atomic in a global context: sync snapshots of pool/dataset1 and pool/dataset2 will each be internally consistent, but one may be a few filesystem transactions \"newer\" than the other.  (This does not affect the consistency of snapshots already taken in other ways, which syncoid replicates in the overall stream unless --no-stream is specified. So if you want to manually zfs snapshot -R pool@1 before replicating with syncoid, the global atomicity of pool/dataset1@1 and pool/dataset2@1 will still be intact.)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjimsalterjrs%2Fsanoid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjimsalterjrs%2Fsanoid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjimsalterjrs%2Fsanoid/lists"}