Daniel López Azaña

Tema

Social Media

Blog

GNU/Linux, Open Source, Cloud Computing, DevOps y más...

Cómo ampliar el tamaño de un volumen EBS y de una partición ext4 en AWS

Logo AWS EBSCuando se nos llena completamente el sistema de ficheros de una partición ext4 alojada en un volumen EBS de Amazon Web Services y no podemos hacer nada por liberar espacio al no querer perder ninguno de los datos almacenados, el único remedio que nos queda es ampliar el volumen y hacer crecer la partición asociada hasta el 100% de su capacidad para disponer nuevamente de espacio libre de almacenamiento.

Partimos en nuestro ejemplo de un volumen de 50 GB lleno al 100% que queremos ampliar a uno nuevo del doble de tamaño, 100 GB:

~# df -h /var/respaldo
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdg1       50G   47G     0 100% /var/respaldo
~# lsblk | grep xvdg
xvdg    202:96   0   50G  0 disk 
└─xvdg1 202:97   0   50G  0 part

Estos son los pasos para conseguirlo:

1. Desmontar sistema de ficheros

El primer paso consistirá en desmontar el sistema o sistemas de ficheros que haya funcionando en ese momento sobre nuestro volumen EBS:

~# sync
~# umount /var/respaldo

2. Desvincular el volumen de su instancia

A continuación localizaremos en la consola de Amazon el volumen y lo desvincularemos de su instancia:

Desvincular volumen de una instancia

Podemos hacer lo mismo también desde la línea de comandos (AWS CLI):

~# aws ec2 describe-instances --region eu-west-1 --filters Name=tag-key,Values="Name" Name=tag-value,Values="*gnadmin*" | grep InstanceId
                    "InstanceId": "i-02ed7d0bda0768883",
~# aws ec2 describe-volumes --region eu-west-1 --filters Name=attachment.instance-id,Values=i-02ed7d0bda0768883 --filters Name=tag-key,Values="Name" Name=tag-value,Values="*respaldo*" --query 'Volumes[*].{ID:VolumeId,Tag:Tags}'
[
    {
        "Tag": [
            {
                "Key": "Name",
                "Value": "gnadmin11 - /var/respaldo"
            }
        ],
        "ID": "vol-0ca0db0a8d60f1aa5"
    }
]
~# aws ec2 detach-volume --volume-id vol-0ca0db0a8d60f1aa5
{
    "AttachTime": "2016-12-01T18:19:50.000Z",
    "InstanceId": "i-02ed7d0bda0768883",
    "VolumeId": "vol-0ca0db0a8d60f1aa5",
    "State": "detaching",
    "Device": "/dev/sdg"
}

Como puede verse, el estado del volumen cuando lanzamos el comando anterior es detaching. Tendremos que esperar a que pase a estado available para poder continuar con el procedimiento, pero no te preocupes, es prácticamente instantáneo:

~# aws ec2 describe-volumes --region eu-west-1 --volume-id vol-0ca0db0a8d60f1aa5 | grep State
            "State": "available",

3. Crear snapshot del volumen

Tomaremos una «foto» del estado del volumen actual con todo su contenido creando un snapshot o instantánea:

Podemos conseguir el mismo resultado con el comando create-snapshot de aws-cli :

~# aws ec2 create-snapshot --region eu-west-1 --volume-id vol-0ca0db0a8d60f1aa5 --description "Backup temporal /var/respaldo" | grep SnapshotId

En este caso tendremos que esperar bastante tiempo a que termine, sobre todo en volúmenes de grandes dimensiones. Mientras tanto podemos consultar el progreso con el siguiente comando:

~# aws ec2 describe-snapshots --region eu-west-1 --snapshot-id snap-008c4162b8fb6b76d | egrep "Progress|State"
            "State": "pending",
            "Progress": "27%",

4. Crear nuevo volumen de mayor tamaño a partir del snapshot creado

Tal y como había indicado al principio, vamos a crear ahora un volumen mayor de 100 GB a partir del snapshot que hemos tomado en el punto anterior. El tipo de volumen del ejemplo es magnetic , pero puedes seleccionar el tipo que mejor se adapte al uso que vayas a darle:

Para hacer lo mismo desde la línea de comandos ejecutaremos lo siguiente:

~# aws ec2 create-volume --size 100 --region eu-west-1 --availability-zone eu-west-1a --snapshot-id snap-008c4162b8fb6b76d --volume-type standard 
{ 
    "Size": 100, 
    "SnapshotId": "snap-008c4162b8fb6b76d", 
    "Encrypted": true, 
    "VolumeType": "standard", 
    "AvailabilityZone": "eu-west-1a", 
    "VolumeId": "vol-0b87a40a0ff017f69", 
    "CreateTime": "2017-05-23T14:01:25.890Z", 
    "State": "creating" 
}

5. Vincular el nuevo volumen a la instancia

Una vez creado el volumen y que éste haya pasado a estado available ya estará disponible para ser vinculado a la instancia desde la consola de AWS:

O desde la línea de comandos:

~# aws ec2 attach-volume --volume-id vol-0b87a40a0ff017f69 --instance-id i-02ed7d0bda0768883 --device /dev/sdg 
{ 
    "VolumeId": "vol-0b87a40a0ff017f69", 
    "InstanceId": "i-02ed7d0bda0768883", 
    "Device": "/dev/sdg", 
    "AttachTime": "2017-05-23T14:35:26.200Z", 
    "State": "attaching" 
}

6. Redimensionar partición para hacerla crecer hasta el 100% del espacio disponible

Tras vincular el nuevo volumen a la instancia, podemos ver con el comando lsblk como el volumen tiene ahora un tamaño de 100 GB, pero la partición que teníamos sigue siendo de 50 GB:

~# lsblk | grep xvdg 
xvdg    202:96   0  100G  0 disk  
└─xvdg1 202:97   0   <strong>50G</strong>  0 part

Por ello ahora será necesario redimensionarla para aumentar su tamaño a 100 GB de forma que se aproveche el 100% del espacio disponible. Puede ser necesario desmontar previamente el sistema de ficheros, ya que el sistema operativo realiza el montaje automáticamente tras la vinculación del volumen a la instancia si encuentra la información necesaria de la partición en el fichero /etc/fstab:

~# umount /var/respaldo
~# parted /dev/xvdg resizepart 1 100%
Warning: Not all of the space available to /dev/xvdg appears to be used, you can fix the GPT to use all of the space (an extra 104857600 blocks) or continue with the current setting?  
Fix/Ignore? Fix
Information: You may need to update /etc/fstab.
~# lsblk | grep xvdg 
xvdg    202:96   0  100G  0 disk  
└─xvdg1 202:97   0  <strong>100G</strong>  0 part /var/respaldo

7. Redimensionar el sistema de ficheros ext4 hasta el 100% de la partición

Del mismo modo que era necesario redimensionar la partición para que ocupe el 100% del volumen, ahora hay que hacer lo mismo con el sistema de ficheros con el que está formateada la partición, ext4 en nuestro ejemplo. Podremos conseguirlo usando el comando resize2fs :

~# resize2fs /dev/xvdg1 
resize2fs 1.42.13 (17-May-2015) 
Filesystem at /dev/xvdg1 is mounted on /var/respaldo; on-line resizing required 
old_desc_blocks = 4, new_desc_blocks = 7 
The filesystem on /dev/xvdg1 is now 26214139 (4k) blocks long.

8. Comprobar opcionalmente la integridad del sistema de ficheros

Aunque el redimensionamiento que realiza el comando resize2fs es muy seguro y es improbable que ocurra una corrupción de datos, no viene mal realizar una verificación completa del sistema de ficheros antes de volver a utilizarlo. Previamente puede ser necesario desmontarlo, pues de nuevo se habrá montado automáticamente tras el redimensionamiento con resize2fs :

~# fsck.ext4 -f /dev/xvdg1 
e2fsck 1.42.13 (17-May-2015) 
Pass 1: Checking inodes, blocks, and sizes 
Pass 2: Checking directory structure 
Pass 3: Checking directory connectivity 
Pass 4: Checking reference counts 
Pass 5: Checking group summary information 
/dev/xvdg1: 610218/6553600 files (0.2% non-contiguous), 12654908/26214139 blocks

9. Montar el sistema de ficheros

Por último montaremos el sistema de ficheros y podremos comprobar cómo ahora su ocupación ha bajado al 50% y disponemos de casi 50 GB de espacio adicional, que era nuestro objetivo inicial:

~# mount /dev/xvdg1
~# df -h /dev/xvdg1
Filesystem      Size  Used Avail Use% Mounted on 
/dev/xvdg1       99G   47G   <strong>48G  50%</strong> /var/respaldo
Daniel López Azaña

Sobre el autor

Daniel López Azaña

Emprendedor tecnológico y arquitecto cloud con más de 20 años de experiencia transformando infraestructuras y automatizando procesos.

Especialista en integración de IA/LLM, desarrollo con Rust y Python, y arquitectura AWS & GCP. Mente inquieta, generador de ideas y apasionado por la innovación tecnológica y la IA.

Artículos relacionados

terraform-and-route53-logos

Cómo importar rápidamente todos los registros de una zona DNS de Route53 en Terraform

El comando terraform import nos permite importar en HashiCorp Terraform recursos que ya existían previamente en el proveedor con el que estemos trabajando, es este caso AWS. Sin embargo, sólo permite importar dichos registros uno por uno, con una ejecución de terraform import cada vez. Esto, aparte de ser tremendamente tedioso, en algunas situaciones se vuelve directamente impracticable. Este es el caso de los registros de una zona DNS de Route53. La tarea puede resultar inabarcable si tenemos varias zonas DNS, y cada una tiene decenas o cientos de registros. En este artículo te ofrezco un script en bash que te permitirá importar en Terraform todos los registros de una zona DNS de Route53 en cuestión de segundos o de pocos minutos.

8 de febrero de 2022
Script para cambiar automáticamente todos los volúmenes gp2 a gp3 con aws-cli

Script para cambiar automáticamente todos los volúmenes gp2 a gp3 con aws-cli

El pasado diciembre Amazon anunció sus nuevos volúmenes EBS gp3, los cuales ofrecen mejores prestaciones y un ahorro en el coste del 20% respecto a los que se venían utilizando hasta ahora, los gp2. Pues bien, tras probar satisfactoriamente estos nuevos volúmenes en varios clientes, no puedo hacer otra cosa más que recomendar su utilización, pues son todo ventajas y en estos 2 meses y medio que han transcurrido desde el anuncio no he apreciado ningún problema ni efecto secundario.

16 de febrero de 2021
AWS security groups

Cómo actualizar automáticamente todos nuestros grupos de seguridad EC2 de AWS cuando nuestra IP dinámica cambia

Uno de los mayores fastidios cuando trabajamos con AWS y nuestra conexión a Internet tiene IP dinámica es que cuándo ésta cambia, automáticamente dejamos de tener acceso a todos los servidores y servicios que habíamos protegido mediante un grupo de seguridad EC2 cuyas reglas sólo permiten el tráfico a ciertas IP’s específicas en lugar de abrir las conexiones a todo el mundo (0.0.0.0/0).Ciertamente lo más sencillo es siempre indicar en el grupo de seguridad que permitimos el tráfico en un puerto a todo el mundo, de modo que aunque tengamos IP dinámica en nuestra conexión a Internet siempre podremos continuar accediendo aunque ésta cambie. Pero abrir el tráfico a un puerto a todo el mundo no es la forma correcta de proceder desde el punto de vista de la seguridad, pues entonces cualquier atacante podrá tener acceso a ese puerto sin restricciones, y eso no es lo que queremos.

12 de enero de 2021

Comentarios

Sé el primero en comentar

Enviar comentario