> ## 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.

# Managing User-Owned Files

> Manage user-owned files under /etc with EtcFileConfig documents.

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 manages most files under `/etc`, but some software requires additional configuration files there.
Use an [`EtcFileConfig`](../../reference/configuration/runtime/etcfileconfig) document to create and manage a user-owned file without adding it to the Talos image.

Each `EtcFileConfig` document owns one complete file, including its contents and permissions.
Use multiple documents to manage multiple files.

## Configure a file

1. Create a patch named `etc-file.patch.yaml` with the file path relative to `/etc`:

   ```yaml theme={null}
   apiVersion: v1alpha1
   kind: EtcFileConfig
   name: nfsmount.conf
   mode: 0o644
   contents: |
     [NFSMount_Global_Options]
   ```

2. Replace `<NODE>` with the target node IP address, then apply the patch:

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

This example creates `/etc/nfsmount.conf` with mode `0644`.
The `mode` field uses octal notation and defaults to `0o644` when omitted.
The `contents` field replaces the complete contents of the file.

For a nested path, set `name` to a path such as `example/config.yaml`.
Talos creates missing parent directories and writes content updates atomically, so readers do not observe a partially written file.

Changes are reconciled while Talos is running and do not require a reboot.
Changing `contents` updates the file, and deleting the document removes the file.

## Remove a managed file

1. Create a strategic merge patch named `etc-file-delete.patch.yaml` that deletes the document:

   ```yaml theme={null}
   apiVersion: v1alpha1
   kind: EtcFileConfig
   name: nfsmount.conf
   $patch: delete
   ```

2. Replace `<NODE>` with the target node IP address, then apply the deletion patch:

   ```bash theme={null}
   talosctl patch mc --patch @etc-file-delete.patch.yaml --nodes <NODE>
   ```

Talos removes `/etc/nfsmount.conf` when it removes the document from the machine configuration.

## Path restrictions

The document `name` must be a non-empty local path relative to `/etc`.
The path:

* Must not include the `/etc/` prefix.
* Must not be absolute.
* Must not traverse to a parent directory.
* Must not start with `.`.

Talos rejects paths that it manages itself.
The following exact paths are reserved:

* `resolv.conf`
* `hosts`
* `machine-id`
* `extensions.yaml`
* `localtime`
* `os-release`
* `xattr.conf`

Talos also rejects each of the following directories and every path below it:

* `apparmor.d/`
* `apparmor/`
* `ca-certificates/`
* `cni/`
* `cri/`
* `iscsi/`
* `kubernetes/`
* `lvm/`
* `nvme/`
* `pki/`
* `selinux/`
* `ssl/`

See the [`EtcFileConfig` reference](../../reference/configuration/runtime/etcfileconfig) for the complete field schema.
