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

# Volúmenes

> Crear un volumen, los tipos que se ofrecen, adjuntarlo a una instancia, hacerlo crecer y eliminarlo.

<a id="creating-a-volume" />

## Crear un volumen

La creación es asíncrona. `POST /v1/volumes` responde **`202`** con el volumen en `creating`; consulta `GET /v1/volumes/{volume_id}` hasta que `status` se vuelva `available` o `error`. `error` significa un error de fallo activo — lea `faults`. Consulte [Fallos de recursos](/es/resource-faults).

<Tabs>
  <Tab title="Console">
    Vaya a **Storage → Volumes** y elija **Create Volume**. Dale un **Name**, deja **Source** en **Blank volume**, luego establece **Size (GB)** y elige un **Tier**: **SSD** o **NVMe**. La tarjeta **Tags** toma los mismos pares clave/valor que la API.

    Ambos niveles incluyen 3.000 IOPS y 125 MiB/s, independientemente del tamaño. Puede aprovisionar IOPS y rendimiento adicionales en los campos de rendimiento.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    POST https://storage.sa-saopaulo-1.basaltic.sh/v1/volumes
    {
      "name": "app-data-01",
      "volume_type": "ssd",
      "size_gb": 100,
      "tags": { "env": "production" }
    }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic storage volume create \
      --name app-data-01 --volume-type ssd --size-gb 100 \
      --tags env=production
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    cfg, err := basaltic.NewConfig(ctx,
        basaltic.WithClientCredentials(os.Getenv("BASALTIC_ACCESS_KEY_ID"), os.Getenv("BASALTIC_SECRET_ACCESS_KEY")),
        basaltic.WithRegion("sa-saopaulo-1"),
    )
    if err != nil {
        log.Fatal(err)
    }

    vol, err := storage.New(cfg).CreateVolume(ctx, &storage.VolumeCreateRequest{
        Name:       "app-data-01",
        VolumeType: "ssd",
        SizeGB:     100,
        Tags:       storage.Tags{"env": "production"},
    })
    ```

    La llamada devuelve con el volumen en `creating`; poll `GetVolume` hasta que llegue a `available`.
  </Tab>
</Tabs>

<ResponseField name="name" type="unique within your account">
  Coincide con `^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$`. Aparece en el CRN, por lo que tiene que ser URL-safe. Un nombre duplicado es `409 VOLUME_NAME_EXISTS`. El nombre se fija después de la creación porque las políticas de IAM se dirigen al volumen por su CRN. Las actualizaciones que contienen `name` devuelven un error de validación, incluyendo valores sin cambios, vacíos o `null`. Los volúmenes existentes conservan sus nombres actuales.
</ResponseField>

<ResponseField name="size_gb" type="1–16384" required>
  El límite máximo coincide con el límite máximo de un dispositivo de bloque único en otras partes de la industria. Es un límite de sanidad por volumen, no su cuota: el uso agregado se controla por separado.
</ResponseField>

<ResponseField name="volume_type" type="ssd | nvme" required>
  Vea más abajo. `GET /v1/volume-types` lista exactamente lo que puede crear.
</ResponseField>

<Tip>
  Enviar un encabezado `Idempotency-Key`. Al volver a intentar con la misma clave se devuelve el resultado original en lugar de crear un segundo volumen; al volver a usar la clave con un cuerpo diferente se rechaza con `422`.
</Tip>

<a id="volume-types" />

## Tipos de volumen

`GET /v1/volume-types` muestra los niveles de almacenamiento disponibles. Los nuevos volúmenes en ambos niveles incluyen **3.000 IOPS y 125 MiB/s**, independientemente de la capacidad.

<Columns cols={2}>
  <Card title="ssd" icon="gauge">
    Almacenamiento en bloque SSD con **3.000 IOPS / 125 MiB/s** incluido.
  </Card>

  <Card title="NVME" icon="zap">
    Almacenamiento en bloque NVMe con **3.000 IOPS / 125 MiB/s** incluido.
  </Card>
</Columns>

Los límites se aplican a lecturas y escrituras combinadas, por volumen. El límite que la carga de trabajo alcance primero determina su tasa máxima. Todos los volúmenes tienen límites sostenidos sin créditos de ráfaga. Aumentar la capacidad no aumenta las IOPS ni el rendimiento.

Los volúmenes existentes y nuevos incluyen exactamente **3.000 IOPS/125 MiB/s**, sin excepciones basadas en la capacidad ni créditos de ráfaga. El rendimiento adicional solo se habilita cuando lo aprovisiona explícitamente. La respuesta `included_io_limits` del volumen y sus detalles de consola muestran esta línea de base fija. `bytes_per_sec` se expresa en bytes por segundo; 125 MiB/s es 131,072,000 bytes por segundo.

<Info>
  Estos límites son límites de rendimiento, no una garantía de latencia. Los resultados reales dependen del tamaño de la operación, la concurrencia, la carga de trabajo del invitado y la capacidad de almacenamiento disponible. A 4 KiB por operación, 3.000 IOPS es aproximadamente 11,72 MiB/s; alcanzar 125 MiB/s requiere operaciones más grandes.
</Info>

El tipo es fijo en la creación, y no hay llamada que lo cambie. Para pasar a un nivel diferente, crea un volumen del tipo que desees y copia los datos desde el interior del huésped.

<a id="provisioning-more-performance" />

## Aprovisionamiento de más rendimiento

Aumente las IOPS, el rendimiento o ambos sin aumentar la capacidad del disco ni reiniciar la instancia. Los totales seleccionables para un volumen estándar son:

| Tipo | IOPS incluidos / MiB/s | IOPS máximo / MiB/s |
| - | - | - |
| SSD | 3,000 / 125 | 8,000 / 250 |
| NVMe | 3,000 / 125 | 12,000 / 500 |

El rendimiento adicional cuesta **R$0.02 por IOPS-mes** y **R$0.20 por MiB/s-mes**, por encima de los 3,000 IOPS / 125 MiB/s incluidos. Las mismas tarifas se aplican a ambos niveles. A 3.000 IOPS y 500 MiB/s, un volumen NVMe estándar añade R$75 por un mes completo; a 12.000 IOPS y 500 MiB/s añade R$255. La capacidad de almacenamiento se factura por separado. Lee las tarifas actuales del [catálogo de precios públicos](/es/billing#the-public-price-catalogue), filtrado con `resource_type=volume-performance`.

Los cargos se prorratean desde el momento en que se aplica una configuración, utilizando el tiempo transcurrido en el mes de facturación UTC real. Usted paga por la asignación aprovisionada incluso cuando un volumen está desconectado o su instancia está detenida. Las operaciones reales y los bytes transferidos no determinan este cargo. Volver a la asignación incluida elimina el cargo adicional una vez que se aplican los límites inferiores; eliminar el volumen también termina la asignación.

<Tabs>
  <Tab title="Console">
    Abra el volumen en **Storage → Volumes** y elija **Change performance**. Establezca **Provisioned IOPS** y **Provisioned throughput (MiB/s)**, revise el precio mensual adicional y aplique el cambio. **Use included performance** restaura los valores incluidos en el formulario; aplíquelos para quitar el complemento.

    También puede elegir estos ajustes al crear un volumen. El **Summary** muestra **Additional performance** por separado de la capacidad de almacenamiento y lo suma una vez al total. Por ejemplo, 3.500 IOPS / 250 MiB/s añade R\$35/mes. [Creación de instancias](/es/compute/instances#performance-and-existing-disks) ofrece los mismos controles para cada disco de arranque y de datos nuevo.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    POST https://storage.sa-saopaulo-1.basaltic.sh/v1/volumes/{volume_id}/performance
    {
      "iops": 6000,
      "throughput_mib_s": 250
    }
    ```

    Enviar un encabezado `Idempotency-Key` para reintentos seguros. Para seleccionar el rendimiento durante la creación, ponga los mismos campos en el objeto `performance` de la solicitud.
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic storage volume update-performance <volume-id> \
      --iops 6000 --throughput-mib-s 250 \
      --idempotency-key report-volume-performance-1
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    iops, throughput := 6000, 250.0
    vol, err := storage.New(cfg).UpdateVolumePerformance(ctx, volumeID,
        &storage.VolumePerformanceRequest{
            IOPS:           &iops,
            ThroughputMiBS: &throughput,
        }, basaltic.WithIdempotencyKey("report-volume-performance-1"))
    ```
  </Tab>
</Tabs>

La API devuelve `202`. Sonda el volumen hasta que `performance.state` sea `applied`. `performance.requested` es el objetivo, mientras que `performance.applied` es la configuración reconocida. Esos objetos expresan el rendimiento como `bytes_per_sec`. La tarifa antigua aplicada sigue siendo facturada mientras un cambio está pendiente. Si un cambio se retrasa, la respuesta incluye su ID de operación y último error.

Se requiere al menos una dimensión para una actualización; las dimensiones omitidas conservan sus valores actuales. Utilice IOPS y MiB/s enteros. También se puede seleccionar una asignación de rendimiento heredada fraccionaria exacta para eliminar extras. Los valores deben estar entre la franquicia incluida del volumen y el límite máximo del nivel; cualquier franquicia incluida superior permanece disponible sin cargo adicional. El redimensionamiento, el reinicio, la readhesión y la migración conservan su selección.

Un aumento también requiere cuota de cuenta, capacidad regional y almacenamiento saludable. Un aumento rechazado no crea una nueva asignación facturable. Si hay otro cambio pendiente, vuelva a intentar el mismo objetivo o espere a que termine antes de elegir otro objetivo. Estos siguen siendo límites combinados de lectura/escritura en almacenamiento compartido, no una reserva dedicada o una garantía de latencia.

<a id="attaching-to-an-instance" />

## Adjuntar a una instancia

El adjunto es una operación de cómputo: la vinculación de dispositivos, el hot-plug de invitados y el orden de arranque se realizan en el lado de la instancia:

<Tabs>
  <Tab title="Console">
    Abra el volumen desde **Storage → Volumes** y elija **Attach to
    instance**. Seleccione la **Instance**; **Device name**, **Mount path** y **Filesystem** son opcionales. Si deja **Device name** en blanco, se asigna el siguiente nombre disponible y se establece una **Mount path**, el volumen se monta allí dentro del huésped, formateándolo primero solo si está en blanco.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    POST /v1/instances/{instance_id}/volumes
    { "volume": "7c9e6679-7425-40de-944b-e07fc1f90ae7" }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic compute instance attach-volume <instance-id> --volume <volume-id>
    ```

    `--device`, `--mount-path` y `--fstype` son opcionales y se comportan como los campos de la consola.
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    att, err := compute.New(cfg).AttachInstanceVolume(ctx, instanceID,
        &compute.AttachInstanceVolumeRequest{
            Volume: volumeID,
        })
    ```

    El archivo adjunto reside en el cliente de cómputo, no en el almacenamiento: la vinculación de dispositivos y el orden de arranque pertenecen a la instancia.
  </Tab>
</Tabs>

El volumen se mueve de `available` a `in_use`, y al separarlo vuelve a `available`. Vea [compute](/es/compute) para las ranuras de dispositivos, las opciones de montaje y la llamada detach.

<Warning>
  **Un volumen se conecta a una instancia a la vez.** No hay multiconexión: la vinculación es única por volumen, por lo que se rechaza una segunda conexión en lugar de entregar a dos invitados el mismo dispositivo de bloque.
</Warning>

<a id="what-happens-when-the-instance-is-deleted" />

### Qué sucede cuando se elimina la instancia

Cada adjunto lleva una bandera `delete_on_termination`, y la predeterminada difiere según cómo el volumen llegó allí:

| Volumen de ventas | `delete_on_termination` | Resultado cuando la instancia es eliminada |
| - | - | - |
| Volumen de arranque creado con la instancia | `true` | Destruido con la instancia. |
| Volumen de datos que adjuntaste | `false` | Sobrevive, vuelve a `available`. |

`PATCH /v1/instances/{instance_id}/volumes/{volume_id}` cambia el indicador de un archivo adjunto existente. Establezcalo deliberadamente en cualquier cosa que contenga datos que le interesen: el volumen de arranque predeterminado es el que se borra.

En la consola, el indicador es un interruptor **Eliminar al terminar** en la lista de volúmenes adjuntos de la **instancia**, no en la página del propio volumen. Pertenece al apego, así que ahí es donde vive.

El disco de arranque en sí no puede ser desconectado: si lo desconecte, se llevaría el sistema de archivos raíz del invitado con él, por lo que la llamada es rechazada.
[Créala mientras estás unido](#growing-a-volume).

<a id="growing-a-volume" />

## Crecimiento de un volumen

<Tabs>
  <Tab title="Console">
    Abra el volumen y elija **Extend**, o utilice la acción de fila **Extend** en **Storage → Volumes**. El cuadro de diálogo **Extend Volume** muestra **Current Size** y toma un **New Size (GB)**.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    POST /v1/volumes/{volume_id}/extend
    { "new_size_gb": 200 }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic storage volume extend <volume-id> --new-size-gb 200
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    vol, err := storage.New(cfg).ExtendVolume(ctx, volumeID, &storage.VolumeExtendRequest{
        NewSizeGB: 200,
    })
    ```
  </Tab>
</Tabs>

La llamada responde **`202`** con el volumen en `extending` y devuelve `available` para un volumen separado o `in_use` para un volumen conectado, en el nuevo tamaño. Los volúmenes de arranque y de datos pueden crecer con la instancia en ejecución o detenida; no es necesario desconectarlos. `new_size_gb` debe ser estrictamente mayor que el tamaño actual; cualquier otra cosa es `400 VOLUME_SIZE_INVALID`.

<Warning>
  **Un volumen no puede reducirse.** No hay ninguna llamada que reduzca `size_gb`, y la cuota que se ha confirmado en el tamaño más grande permanece confirmada. Crece en los pasos que realmente necesitas.
</Warning>

El crecimiento del volumen no aumenta su partición o sistema de archivos. Espere hasta que el volumen deje de `extending`, luego compruebe el tamaño del dispositivo dentro del invitado:

```bash theme={null}
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS
```

El dispositivo de bloque de la instancia se actualiza automáticamente. Si el invitado sigue mostrando el tamaño anterior, utilice el método de reescaneo admitido por su controlador de dispositivo o reinicie la instancia. Para un controlador que expone un archivo de reescaneo (no todos los dispositivos de bloque virtio lo hacen), el comando es:

```bash theme={null}
# Only if this file exists and vda is the volume you extended:
echo 1 | sudo tee /sys/class/block/vda/device/rescan
```

Para **un sistema de archivos ext4 directamente en la partición 1 de `/dev/vda`**, con espacio libre inmediatamente después de esa partición, lo siguiente hace crecer la partición y el sistema de archivos. Confirme el dispositivo y el diseño con `lsblk` primero y tome una copia de seguridad. Estos comandos se ejecutan dentro de la instancia; no los ejecuta el servicio.

```bash theme={null}
sudo growpart /dev/vda 1
sudo resize2fs /dev/vda1
```

Para un volumen ext4 sin particiones, ejecute `resize2fs` en el dispositivo del volumen y omita `growpart`. XFS, LVM, discos cifrados y otros diseños de partición necesitan sus propios pasos de crecimiento; no use el ejemplo de ext4 para ellos.

<a id="deleting-a-volume" />

## Eliminar un volumen

`DELETE /v1/volumes/{volume_id}` responde **`202`**, cambia la fila a `deleting` y descompone el volumen de forma asincrónica. Pulse hasta que el volumen desaparezca.

Dos negaciones de saber acerca de:

<AccordionGroup>
  <Accordion title="409 - No se encontró la página" icon="link">
    El volumen está adjunto. Desconectar primero de la instancia. Delete también se rechaza durante los estados transitorios — `creating`, `extending`, `deleting` — por lo que una segunda operación no puede competir con la primera.
  </Accordion>

  <Accordion title="409 - No se encontró la página" icon="camera">
    Un volumen que todavía tiene instantáneas no se eliminará, porque esas instantáneas son hijos de los datos del volumen y no es posible eliminar el elemento principal debajo de ellos. Elimine primero las instantáneas y luego el volumen.

    Esto es un rechazo limpio en lugar de un desmantelamiento parcial, por lo que no se pierde nada por intentarlo.
  </Accordion>
</AccordionGroup>

Al eliminar un volumen también se eliminan todas sus [snapshot policies](/es/storage/snapshots#snapshot-policies) — las programaciones no tienen nada que capturar. Su cuota se libera una vez que finaliza el desmantelamiento, no cuando se acepta la llamada, por lo que la capacidad y el uso reportado permanecen alineados mientras se realiza una eliminación.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.