> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siderolabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Unattended Install

> Install Talos declaratively from machine configuration.

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 can install itself to disk from a multi-document machine configuration by using [`UnattendedInstallConfig`](../../reference/configuration/runtime/unattendedinstallconfig).
Use unattended install when a node boots from an ISO, PXE, iPXE, or another ephemeral boot asset and should install to a selected local disk without invoking the installer manually.

[`UnattendedInstallConfig`](../../reference/configuration/runtime/unattendedinstallconfig) replaces the deprecated `.machine.install` field for new configurations.
It is especially useful with Image Factory assets and custom installer images that include system extensions.

## Configure unattended install

Add an [`UnattendedInstallConfig`](../../reference/configuration/runtime/unattendedinstallconfig) document to the machine configuration.
The following example installs Talos to the disk whose stable path is `/dev/sda`:

```yaml theme={null}
apiVersion: v1alpha1
kind: UnattendedInstallConfig
installer:
  image: factory.talos.dev/metal-installer/<schematic-id>:<talos-version>
provisioning:
  diskSelector:
    match: disk.dev_path == "/dev/sda"
  wipe: true
```

The `provisioning.diskSelector.match` field is a CEL expression evaluated against discovered disks as `disk`.
Use a selector that matches exactly one intended install target.
For production configurations, prefer stable disk properties such as `disk.serial`, `disk.wwid`, or `disk.symlinks` instead of `/dev/sd*` names when possible.

Inspect the disks reported by the node before choosing a selector:

```bash theme={null}
talosctl --nodes <NODE> get disks -o yaml
```

Apply the configuration patch while the node is running from the ephemeral boot media:

```bash theme={null}
talosctl --nodes <NODE> patch mc --patch @unattended-install.patch.yaml
```

After the configuration is applied, Talos waits for disks to be discovered, selects the first matching disk, runs the installer container, and records progress in `UnattendedInstallStatus`.
If multiple disks match, Talos logs a warning and uses the first match.

## Installer image

Set `installer.image` to the installer image you want the node to write to disk.
Use the Image Factory installer image for the same schematic as the boot asset when the installed system needs the same system extensions or other image customizations:

```yaml theme={null}
apiVersion: v1alpha1
kind: UnattendedInstallConfig
installer:
  image: factory.talos.dev/metal-installer/<schematic-id>:v1.14.0
provisioning:
  diskSelector:
    match: '"/dev/disk/by-id/nvme-SAMSUNG_MZQL21T9" in disk.symlinks'
```

If `installer.image` is omitted, Talos tries to derive the installer image from the Image Factory boot entry and the current schematic.
This requires booting from an Image Factory asset.
Set `installer.image` explicitly for non-Image Factory boot assets or when installing a custom installer image.

## Wipe behavior

By default, Talos wipes the target disk during installation.
Set `provisioning.wipe` to `false` only when you intentionally want to preserve existing partition data that the installer can reuse:

```yaml theme={null}
apiVersion: v1alpha1
kind: UnattendedInstallConfig
installer:
  image: factory.talos.dev/metal-installer/<schematic-id>:v1.14.0
provisioning:
  diskSelector:
    match: disk.serial == "S4ABC123"
  wipe: false
```

## Reboot behavior

The optional `reboot` field controls what happens after a successful installation:

* If `reboot` is not set, Talos reboots only when `installer.image` is set explicitly.
* If `reboot: true`, Talos always requests a reboot after installation.
* If `reboot: false`, Talos leaves the node running from the current boot media after installation.

Example:

```yaml theme={null}
apiVersion: v1alpha1
kind: UnattendedInstallConfig
reboot: true
installer:
  image: factory.talos.dev/metal-installer/<schematic-id>:v1.14.0
provisioning:
  diskSelector:
    match: disk.serial == "S4ABC123"
```

## Inspect installation status

Use the unattended install status resource to monitor progress:

```bash theme={null}
$ talosctl --nodes <NODE> get unattendedinstallstatuses
NODE         NAMESPACE   TYPE                       ID                   VERSION   PHASE
172.20.0.5   runtime     UnattendedInstallStatus    unattended-install   1         installed
```

Request YAML output to see the installer image and any error message:

```bash theme={null}
talosctl --nodes <NODE> get unattendedinstallstatuses unattended-install -o yaml
```

The phase is one of:

* `pending`: no disk currently matches the selector.
* `installing`: the installer is running.
* `installed`: installation completed and no reboot is pending.
* `waiting-for-reboot`: installation completed and Talos requested a reboot.
* `failed`: installation failed; inspect the `error` field and machine logs.

Once a node is installed to disk, Talos reports the install as complete and does not run the unattended installer again on that boot.
