Table of Contents

EVE-OS / ZEDEDA Application Volumes

Covers: what a volume is, what has to be configured in the GUI vs Terraform, how to deploy an app with a volume, and how to grow a volume after deployment. Primary examples use an image-backed HDD drive; HDD_EMPTY is covered as a separate use case at the end.

Sources: lf-edge/eve, zededa/zedcloud Terraform provider docs, ZEDEDA Help Center (Storage Overview, Manage an Edge Application Instance, ZCLI volume-instance docs).

1. What a volume is

A volume instance is the storage object EVE-OS attaches to an app instance as a drive. It backs one of:

A volume can be:

Underlying storage is a qcow2 file (ext4 persist) or a zvol (ZFS persist), depending on how the edge node's /persist partition was provisioned at install time — see the separate EVE-OS Partitioning / ZFS wiki page for that layer. Volumes live inside whichever persist backend the node has.

2. Key fields

Field Where it shows up What it does
Drive Type (drvtype) GUI Drives pane / TF drvtype HDD = image-backed. CDROM = read-only image, optical semantics. NET = network-backed. HDD_EMPTY = blank disk of maxsize (covered in section 6).
Max Size (maxsize / maxsizebytes) GUI Drives pane “Max Size” / TF maxsize Capacity ceiling for the drive. For HDD, this must be >= the image size; any headroom above the image size is usable, growable space on that same disk.
Preserve (preserve) GUI Drives pane “Preserve” Whether this drive's data survives a purge/refresh of the app instance, vs. being rebuilt from the source image.
Allow Storage Resize (allow_storage_resize / allowStorageResize) App instance level, GUI/zcli/TF Must be enabled before an existing app instance's drive size can be increased. Default: false.
Volume Label (volumelabel) GUI Drives pane / TF References a pre-created (explicit) volume instance instead of an inline drive definition.
Mount Path (mountpath) GUI Drives pane / TF Path inside the app where the drive is mounted. Empty or / defines the rootfs.

3. What's required to configure — GUI vs Terraform

GUI

Terraform (zededa/zedcloud provider)

ZCLI

4. Step-by-step: Deploy an app with a volume (HDD)

This is the common case: a single image-backed drive that serves as both the app's rootfs and its data storage, sized larger than the image itself so there's room to grow later.

Via GUI

  1. Go to Edge Applications > Marketplace, select or create the edge app.
  2. Deploy the app: Edge Applications > Deploy, pick the target edge node.
  3. On the Drives pane, add the drive:
    1. Drive Type: HDD
    2. Image: select the app's image / content tree
    3. Mount Path: / (or empty) to define the rootfs
    4. Max Size: set this above the image's native size if you want growable headroom (e.g. image is 4 GB, set Max Size to 20 GB)
    5. Preserve: enable if this disk's contents should survive a future purge
  4. Complete networking/resources panes as normal and click Deploy.
  5. Confirm in Edge Node > App Instances that the instance reaches RUNNING and the drive shows the expected size under app instance details.

Via Terraform

resource "zedcloud_application_instance" "example" {
  name         = "my-app-instance"
  app_id       = zedcloud_application.example.id
  device_id    = data.zedcloud_edgenode.target.id
  project_id   = data.zedcloud_project.example.id
 
  drives {
    drvtype     = "HDD"
    imagename   = "my-app-image"
    mountpath   = "/"
    maxsize     = "21474836480"   # 20 GiB ceiling, even if the image itself is much smaller
    preserve    = true
  }
 
  allow_storage_resize = true
}
  1. terraform plan / terraform apply.
  2. Verify state: terraform state show zedcloud_application_instance.example or check the GUI app instance detail page.

5. Step-by-step: Grow a volume (HDD)

Important: this is not a live/hot resize. Editing a drive on an existing app instance triggers a Purge & Update — the app purges and restarts. Data on that drive is lost unless preserve is set on it.

Via GUI

  1. Confirm the drive you're growing has Preserve set (if you need to keep its data).
  2. Go to Edge Applications > App Instances, select the instance, Edit.
  3. If not already enabled, enable Allow Storage Resize at the app instance level.
  4. On the Drives pane, raise the Max Size field for the HDD drive.
  5. Save. The GUI will show a Purge and update notification — confirm it.
  6. Wait for the app instance to purge and come back RUNNING.
  7. Log into the guest and grow the filesystem to use the new space (EVE resizes the backing volume, not the guest's partition/fs — see step below).

Via Terraform

resource "zedcloud_application_instance" "example" {
  # ...unchanged config...
 
  drives {
    drvtype     = "HDD"
    imagename   = "my-app-image"
    mountpath   = "/"
    maxsize     = "42949672960"   # was 20 GiB, now 40 GiB
    preserve    = true
  }
 
  allow_storage_resize = true    # must be true BEFORE the maxsize change is allowed to apply
}
  1. terraform apply. If allow_storage_resize was false on the last-applied state, apply that change first, then apply the maxsize change (or in the same apply if the provider allows it — verify against current provider version behavior before assuming ordering).
  2. Confirm the app instance purges and comes back up.

Guest-side step (both paths)

EVE enlarges the backing volume (qcow2/zvol); it does not grow the guest's partition or filesystem automatically. After the app instance comes back up:

6. Other use case: HDD_EMPTY (blank data disk)

HDD_EMPTY is a second, complementary pattern rather than an alternative to the above: a completely blank disk, not backed by any image or content tree, used as a separate data drive alongside an HDD rootfs drive.

drives {
  drvtype     = "HDD_EMPTY"
  maxsize     = "10737418240"   # 10 GiB blank data disk
  preserve    = true
  mountpath   = "/data"
}

Use this when you want the OS/app image to stay a fixed, replaceable artifact (rebuilt cleanly on every app update) while the data lives on its own drive that is never touched by an image update — as opposed to the HDD pattern in sections 4-5, where rootfs and data share one disk and the whole disk gets rebuilt from the image on update unless preserve is set.

7. Open questions / to verify before relying on this in production