> ## Documentation Index
> Fetch the complete documentation index at: https://siderolabs-fe86397c-config-evolution.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# System Volumes

> Configuring Talos Linux system volumes, for example `EPHEMERAL` volume.

export const VersionWarningBanner = () => {
  const latestVersion = "v1.13";
  const [latestUrl, setLatestUrl] = useState(null);
  const [currentVersion, setCurrentVersion] = useState(null);
  const [isBeta, setIsBeta] = useState(false);
  const parseVersion = v => v.replace("v", "").split(".").map(Number);
  const isGreaterVersion = (a, b) => {
    const [aMajor, aMinor] = parseVersion(a);
    const [bMajor, bMinor] = parseVersion(b);
    if (aMajor > bMajor) return true;
    if (aMajor === bMajor && aMinor > bMinor) return true;
    return false;
  };
  useEffect(() => {
    if (typeof window === "undefined") return;
    const {pathname, hash, search} = window.location;
    const match = pathname.match(/\/talos\/(v\d+\.\d+)\//);
    if (!match) return;
    const detectedVersion = match[1];
    if (detectedVersion === latestVersion) return;
    setCurrentVersion(detectedVersion);
    if (isGreaterVersion(detectedVersion, latestVersion)) {
      setIsBeta(true);
    }
    const newPath = pathname.replace(`/talos/${detectedVersion}/`, `/talos/${latestVersion}/`);
    setLatestUrl(`${newPath}${search}${hash}`);
  }, []);
  if (!latestUrl || !currentVersion) return null;
  return <div className="not-prose sticky top-6 z-50 my-6">
      <div className="border border-yellow-500/30 bg-yellow-500/10 px-4 py-3 rounded-xl">
        <div className="text-sm">
          {isBeta ? <>
              ⚠️ You are viewing a <strong>beta version</strong> of Talos ({currentVersion}).
              This version may be unstable.
              <a href={latestUrl} className="ml-2 underline text-yellow-400 hover:text-yellow-300 font-medium">
                View latest stable version {latestVersion} →
              </a>
            </> : <>
              ⚠️ You are viewing an older version of Talos ({currentVersion}).
              <a href={latestUrl} className="ml-2 underline text-yellow-400 hover:text-yellow-300 font-medium">
                View the latest version {latestVersion} →
              </a>
            </>}
        </div>
      </div>
    </div>;
};

<VersionWarningBanner />

Talos Linux has a set of system volumes that are used for various purposes, such as storing the system state, ephemeral data, and more.
This guide provides an overview of the system volumes and how to configure them.

The following system volumes are supported: `STATE`, `EPHEMERAL`, `IMAGECACHE`, `ETCD`, `CRI`, `KUBELET` and `LOG`.
The `ETCD`, `CRI`, `KUBELET` and `LOG` volumes are backed by a directory under the `EPHEMERAL` volume by default, but they can be placed on a dedicated partition instead (see [Dedicated system volumes](#dedicated-system-volumes-etcd-cri-kubelet-log)).

> Note: A volume's backing (directory vs. dedicated partition) is fixed when the volume is first provisioned and cannot be changed afterwards.
> The configuration for these volumes is therefore only honored during cluster creation.

## `EPHEMERAL` volume

The `EPHEMERAL` volume is a system volume that is used for storing ephemeral data, such as container data, downloaded images, logs, and `etcd` data (for controlplane nodes). By default, this volume is provisioned on the system disk, which is the disk where Talos Linux is installed.
It has a minimum size of 2 GiB and automatically grows to utilize the maximum available space on the disk.

The `EPHEMERAL` (`/var`) volume can be configured through a matching [VolumeConfig](../../../reference/configuration/block/volumeconfig) document, within the machine configuration.

If you would like to keep the `EPHEMERAL` volume on the system disk but limit its size to 40 GiB, you can set the `maxSize` field to `40GiB`:

```yaml theme={null}
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
  maxSize: 40GiB
```

If you want to create a separate partition for `EPHEMERAL` on a different disk, you can set the `diskSelector` field to select the desired disk:

```yaml theme={null}
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
  diskSelector:
    match: disk.transport == 'nvme' && !system_disk
```

> Note: The volume configuration in the machine configuration is only applied when the volume has not been provisioned yet.
> So applying changes after the initial provisioning will not have any effect.

## Dedicated system volumes (`ETCD`, `CRI`, `KUBELET`, `LOG`)

By default, the `ETCD`, `CRI`, `KUBELET` and `LOG` volumes are backed by a directory under the `EPHEMERAL` volume. Each of these volumes can instead be placed on a **dedicated partition** (optionally encrypted) by adding a `VolumeConfig` document with `provisioning` set.
Moving a volume to its own partition is useful to:

* isolate a component's data so that one volume cannot fill up the whole `EPHEMERAL` volume (`/var`),
* apply independent size limits or quotas per component,
* place a volume on a separate disk for better performance or durability.

> Note: The backing type is permanent — it is chosen when the volume is first provisioned and cannot be changed later.
> Custom `VolumeConfig`s for the `ETCD`, `CRI` and `KUBELET` volumes are therefore only honored during cluster creation.

To provision, for example, the `KUBELET` volume on a dedicated partition, append the following [VolumeConfig](../../../reference/configuration/block/volumeconfig) document to the machine configuration used at cluster creation:

```yaml theme={null}
apiVersion: v1alpha1
kind: VolumeConfig
name: KUBELET
provisioning:
  minSize: 1GB
  maxSize: 5GB
```

To place the volume on a separate disk, use the `diskSelector` field, just like for the `EPHEMERAL` volume:

```yaml theme={null}
apiVersion: v1alpha1
kind: VolumeConfig
name: ETCD
provisioning:
  diskSelector:
    match: disk.transport == 'nvme' && !system_disk
  minSize: 2GB
```

### Mount options

Volumes that remain directory-backed inherit the mount options of the `EPHEMERAL` volume.

Each dedicated partition has its own mount, so the [`mount.secure`](../../../reference/configuration/block/volumeconfig#mount) option (`nosuid`, `nodev` and `noexec`, enabled by default) can be set independently per volume:

```yaml theme={null}
apiVersion: v1alpha1
kind: VolumeConfig
name: LOG
mount:
  secure: false
```

## `IMAGECACHE` volume

This system volume is not provisioned by default, and it only gets created if the [Image Cache](../../images-container-runtime/image-cache) feature is enabled.

See [Image Cache configuration](../../images-container-runtime/image-cache#configuration) for more details.
