source_image and source_snapshot as resource references with id, crn and optional name. Each is null when the volume has no source of that kind. The same fields appear when reading the volume through an instance’s attached-volume collection.
Creating a volume
Creation is asynchronous.POST /v1/volumes answers 202 with the volume
in creating; poll GET /v1/volumes/{volume_id} until status becomes
available or error. error means an active error fault — read faults.
See Resource faults.
- Console
- API
- CLI
- Go
Go to Storage → Volumes and choose Create Volume. Give it a
Name, leave Source on Blank volume, then set Size (GB) and
pick a Tier — SSD or NVMe. The Tags card takes the same
key/value pairs the API does.Both tiers include 3,000 IOPS and 125 MiB/s, independent of size. You can
provision additional IOPS and throughput in the performance fields.
unique within your account
Matches
^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$. It appears in the CRN, so it
has to be URL-safe. A duplicate name is 409 VOLUME_NAME_EXISTS.
The name is fixed after creation because IAM policies address the volume by
its CRN. Updates containing name return a validation error, including
unchanged, empty or null values. Existing volumes retain their current names.1–16384
required
The ceiling matches what a single block device is capped at elsewhere in the
industry. It is a per-volume sanity bound, not your quota — aggregate usage
is gated separately.
ssd | nvme
required
See below.
GET /v1/volume-types lists exactly what you may create on.Volume types
GET /v1/volume-types lists the available storage tiers. New volumes on both
tiers include 3,000 IOPS and 125 MiB/s, independent of capacity.
ssd
SSD block storage with 3,000 IOPS / 125 MiB/s included.
nvme
NVMe block storage with 3,000 IOPS / 125 MiB/s included.
included_io_limits
response and its console details show this fixed baseline. bytes_per_sec is
expressed in bytes per second; 125 MiB/s is 131,072,000 bytes per second.
These limits are performance ceilings, not a latency guarantee. Actual results
depend on operation size, concurrency, the guest workload and available storage
capacity. At 4 KiB per operation, 3,000 IOPS is approximately 11.72 MiB/s;
reaching 125 MiB/s requires larger operations.
Provisioning more performance
Increase IOPS, throughput, or both without increasing disk capacity or restarting your instance. The selectable totals for a standard volume are:
Additional performance costs R0.20 per
MiB/s-month, above the included 3,000 IOPS / 125 MiB/s. The same rates
apply to both tiers. At 3,000 IOPS and 500 MiB/s, a standard NVMe volume adds
R255. Storage capacity
is billed separately. Read the current rates from the
public price catalog, filtered with
resource_type=volume-performance.
Charges are prorated from when a setting is applied, using elapsed time in the
actual UTC billing month. You pay for the provisioned allocation even while a
volume is detached or its instance is stopped. Actual operations and transferred
bytes do not determine this charge. Returning to the included allowance removes
the extra charge once the lower limits are applied; deleting the volume also
ends the allocation.
- Console
- API
- CLI
- Go
Open the volume in Storage → Volumes and choose Change performance.
Set Provisioned IOPS and Provisioned throughput (MiB/s), review the
additional monthly price, and apply the change. Use included performance
restores the included values in the form; apply them to remove the add-on.You can also choose these settings when creating a volume. The Summary
shows Additional performance separately from storage capacity and adds
it once to the total. For example, 3,500 IOPS / 250 MiB/s adds R$35/month.
Instance creation
offers the same controls for each new boot and data disk.
202. While the change is pending, the volume has status
updating. performance.requested is the target, while performance.applied
is the acknowledged setting. Poll until the requested and applied limits match.
Those objects express throughput as bytes_per_sec. The old applied rate
continues to be billed while a change is pending. Failures appear in faults
and set the volume status to error; the change is retried automatically.
At least one dimension is required for an update; omitted dimensions retain
their current values. Use whole IOPS and MiB/s. An exact fractional legacy
throughput allowance can also be selected to remove extras. Values must stay
between the volume’s included allowance and the tier ceiling; any higher
included allowance remains available without an extra charge. Resize, restart,
reattachment and migration preserve your selection.
An increase also requires account quota, regional capacity and healthy storage.
A rejected increase does not create a new billable allocation. If another change
is pending, retry the same target or wait for it to finish before choosing a
different target. These remain combined read/write ceilings on shared storage,
not a dedicated reservation or a latency guarantee.
Attaching to an instance
Attachment is a compute operation — the device binding, the guest hot-plug and the boot order all live on the instance side:- Console
- API
- CLI
- Go
Open the volume from Storage → Volumes and choose Attach to
instance. Pick the Instance; Device name, Mount path and
Filesystem are optional. Leaving Device name blank assigns the next
available name, and setting a Mount path mounts the volume there inside
the guest — formatting it first only if it is blank.
available to in_use, and detaching puts it back to
available. See compute for the device slots, mount options and the
detach call.
What happens when the instance is deleted
Each attachment carries adelete_on_termination flag, and the default differs
by how the volume got there:
PATCH /v1/instances/{instance_id}/volumes/{volume_id} changes the flag on an
existing attachment. Set it deliberately on anything holding data you care
about — the boot volume default is the one that deletes.
In the console the flag is a Delete on termination switch in the
instance’s list of attached volumes, not on the volume’s own page. It
belongs to the attachment, so that is where it lives.
The boot disk itself cannot be detached: unplugging it would take the guest’s
root filesystem with it, so the call is refused. You can
grow it while attached.
Growing a volume
- Console
- API
- CLI
- Go
Open the volume and choose Extend, or use the Extend row action on
Storage → Volumes. The Extend Volume dialog shows Current Size
and takes a New Size (GB).
202 with the volume in extending and returns to
available for a detached volume or in_use for an attached volume, at the
new size. Boot and data volumes can grow with the instance running or stopped;
no detach is needed. new_size_gb must be strictly greater than the
current size; anything else is 400 VOLUME_SIZE_INVALID.
Growing the volume does not grow its partition or filesystem. Wait until the
volume leaves extending, then check the device size inside the guest:
/dev/vda, with free
space immediately after that partition, the following grows the partition and
filesystem. Confirm the device and layout with lsblk first and take a backup.
These commands run inside your instance; they are not run by the service.
resize2fs on the volume’s device instead
and skip growpart. XFS, LVM, encrypted disks and other partition layouts need
their own growth steps; do not use the ext4 example for them.
Deleting a volume
DELETE /v1/volumes/{volume_id} answers 202, flips the row to deleting
and tears the volume down asynchronously. Poll until the volume disappears.
Two refusals to know about:
409 VOLUME_IN_USE
409 VOLUME_IN_USE
The volume is attached. Detach it from the instance first. Delete is also
refused during the transient states —
creating, extending, deleting —
so a second operation cannot race the first.409 VOLUME_HAS_SNAPSHOTS
409 VOLUME_HAS_SNAPSHOTS
A volume that still has snapshots will not delete, because those snapshots
are children of the volume’s data and removing the parent underneath them
is not possible. Delete the snapshots first, then the volume.This is a clean refusal rather than a partial teardown, so nothing is lost
by trying.

