# Snapshots

A ZFS snapshot is a point-in-time, read-only view of a filesystem or volume. It initially consumes little space, then grows as referenced blocks change or are removed. Use snapshots before risky changes, and use periodic jobs to keep a rolling recovery history.

Snapshots created by Sylve's VM and Jail workflows are also visible here. For guest-specific recovery, use the snapshot controls on that guest's details page.

:::note[Why new snapshots may take a moment to appear]
The table is server-rendered from Sylve's snapshot index. After creating or deleting a snapshot, or creating a backend snapshot job, allow a few seconds for the recognition job to update that index. The new state then appears in the table. The reload button is lightweight and safe to use freely because it requests the indexed data, rather than running a costly full-pool `zfs list -t snapshot` scan.

This design lets a node hold thousands, or even hundreds of thousands, of snapshots without imposing a matching frontend or backend penalty on every page view. The small recognition delay is the tradeoff for keeping the interface responsive at that scale.
:::

## Browse and filter snapshots

The Snapshots page is a paginated table with **Name**, **Used**, and **Referenced** columns. Use search to find snapshots by name, select one or more rows for deletion, and use the reload button to request fresh table data.

The **Filter** control hides common system-generated snapshot names by default. Remove an entry if you need to see that category.

| Filter label | Hidden name fragment |
| --- | --- |
| Backups | `bk_j` |
| VM Snapshots | `svms_` |
| Jail Snapshots | `sjs_` |
| Templates | `_template` |
| HA Snapshots | `ha_` |

:::caution[Do not manually delete filtered snapshots]
Filtered snapshots are usually owned by another Sylve subsystem, including VM snapshots, Jail snapshots, HA, templates, or backups. Deleting one here can leave its owning subsystem without the recovery point or state it expects. Remove the filter only to inspect them, and use that subsystem's own controls to delete or manage its snapshots.
:::

<img src={snapshotsOverview.src} alt="Sylve Snapshots page with snapshot rows, the Filter control, the View Periodics button, and the reload button" />

## Create a snapshot or periodic job

Select **New**. Choose the pool, choose a filesystem or volume in that pool, give the snapshot a name or prefix, and configure the schedule. You can also open this same dialog from a selected filesystem or volume, where its dataset is already filled in.

For a one-time snapshot, set **Interval Type** to **None**. For a recurring job, choose **Simple** or **Cron Expression** and optionally apply a retention policy.

<img src={snapshotsCreate.src} alt="Create Snapshot dialog for zroot/home/zed with an hourly schedule, Simple retention keeping the latest 24 snapshots, and Recursive disabled" />

| Option | What it controls | Available values or behavior |
| --- | --- | --- |
| Name \| Prefix | Snapshot name for a one-time action, or the prefix used by a periodic job. | Required. One-time names must be unique on the dataset. Periodic snapshots receive a timestamp, such as `daily-2026-08-19-14-30`. |
| Pool | Narrows the Dataset list. | Required. Select one of the pools configured for Sylve. |
| Dataset | Filesystem or volume to snapshot. | Required. Only datasets in the selected pool are offered. |
| Interval Type | Whether this is a one-time action or a periodic job. | **None**, **Simple**, or **Cron Expression**. None creates a snapshot immediately. |
| Simple interval | Fixed periodic cadence. | Every Minute, Every Hour, Every Day, Every Week, Every Month, or Every Year. |
| Cron Expression | Custom recurring schedule. | A standard five-field cron expression, for example `0 0 * * *` for midnight every day. A periodic job must use exactly one schedule type: Simple or Cron Expression. |
| Retention | Automatic pruning policy for a periodic job. | **None**, **Simple**, or **GFS**. It appears after choosing a periodic interval. |
| Keep Last | Number of newest snapshots to retain. | Available with Simple and GFS retention. Enter `0` to leave it unused. |
| Max Age (Days) | Age-based pruning limit. | Simple retention only. Snapshots older than this many days may be removed. Enter `0` to leave it unused. |
| Keep Hourly | Number of hourly recovery points to retain. | GFS retention only. |
| Keep Daily | Number of daily recovery points to retain. | GFS retention only. |
| Keep Weekly | Number of weekly recovery points to retain. | GFS retention only. |
| Keep Monthly | Number of monthly recovery points to retain. | GFS retention only. |
| Keep Yearly | Number of yearly recovery points to retain. | GFS retention only. |
| Recursive | Includes child datasets in the snapshot operation. | Off by default. Enable only when the dataset tree needs one consistent recovery point. |

:::note
Sylve reserves the `ha_`, `bk_`, and `sylve-migrate-` name spaces for its own workflows. Choose a different name or periodic prefix. Snapshot creation is also blocked while an applicable restore or protected replication operation is active.
:::

## Retention choices

Choose a retention policy deliberately. A value of `0` means that specific limit does not keep snapshots. Simple and GFS retention cannot be combined in the same job.

The form starts Simple retention at **Keep Last 24** and **Max Age 0 days**. GFS starts at **Keep Last 20**, **Hourly 24**, **Daily 7**, **Weekly 4**, **Monthly 12**, and **Yearly 3**. These are editable starting points, not fixed limits. Simple and GFS each require at least one value greater than `0` before the job can be saved.

| Retention type | How Sylve retains snapshots |
| --- | --- |
| None | The scheduler creates snapshots but does not prune them. Monitor capacity and delete old snapshots manually. |
| Simple | Keeps the newest **Keep Last** snapshots and/or removes snapshots beyond **Max Age (Days)**. |
| GFS | Keeps the newest snapshot for each requested hourly, daily, weekly, monthly, and yearly bucket. **Keep Last** can also preserve additional newest snapshots. |

## View periodic jobs

Select the clock button, then choose a pool, to open **View Snapshot Jobs**. The dialog lists each job's ID, dataset, prefix, interval or cron schedule, and two run times:

| Run time | Meaning |
| --- | --- |
| **Last** | When Sylve actually executed the most recent run. A new job that has not executed yet shows **Never**. Hover over it to see the actual time and the scheduled boundary handled by that run. |
| **Next** | The next calculated schedule time. It can show **Unknown** when no valid time is available or **Due now** when the calculated time has arrived. |

Run times are shown relatively, such as **5 minutes ago** or **in 20 minutes**. Hover over a known time to see its complete local date and time. Use the retention button on a row to change its schedule and retention settings, or mark rows for deletion and select **Save Snapshot Jobs**.

<img src={snapshotsPeriodicJobs.src} alt="View Snapshot Jobs dialog showing daily and hourly jobs with stacked Last and Next run times, retention controls, and delete controls" />

The retention button opens the **Retention Policies** dialog for that job. It lets you change the interval type and schedule, then choose **None**, **Simple**, or **GFS** retention and edit the corresponding values described above. Recursive scope is not changed from this editor.

<img src={snapshotsPeriodicJobsRetention.src} alt="Retention Policies dialog for an hourly snapshot job using Simple retention to keep the latest 24 snapshots while the jobs dialog remains visible behind it" />

:::note
The job editor can change the schedule and retention policy, including disabling automatic pruning with **None**. To change recursive scope, create a replacement periodic job with the intended setting, then remove the old job after confirming it is no longer needed.
:::

## Delete snapshots

Select one or more rows, then choose **Delete Snapshot**. The confirmation states how many snapshots will be removed. This is permanent and can free space only after no remaining snapshots reference the changed blocks. Delete only snapshots you created or explicitly own. Do not delete snapshots normally hidden by the category filter. Use the VM, Jail, HA, template, or backup workflow that owns them instead.

:::caution[Snapshots with dependent clones]
Deleting a snapshot that has dependent ZFS clones fails. Sylve does not create or use ZFS clones anywhere, so a dependent clone indicates storage created outside Sylve. Handle that clone and its snapshot relationship carefully from the CLI before retrying the deletion.
:::

<img src={snapshotsDelete.src} alt="Sylve confirmation dialog warning that selected ZFS snapshots will be permanently deleted" />