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

No hay comentarios

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.


Error: Your Requested widget " ai_widget-6" is not in the widget list.
  • [do_widget_area above-nav-left]
    • [do_widget_area above-nav-right]
      • [do_widget_area footer-1]
        • [do_widget id="wpp-4"]
      • [do_widget_area footer-2]
        • [do_widget id="recent-posts-4"]
      • [do_widget_area footer-3]
        • [do_widget id="recent-comments-3"]
      • [do_widget_area footer-4]
        • [do_widget id="archives-4"]
      • [do_widget_area logo-bar]
        • [do_widget id="oxywidgetwpml-3"]
      • [do_widget_area menu-bar]
        • [do_widget id="search-3"]
      • [do_widget_area sidebar]
        • [do_widget id="search-4"]
        • [do_widget id="ai_widget-2"]
        • [do_widget id="categories-5"]
        • [do_widget id="ai_widget-3"]
        • [do_widget id="ai_widget-4"]
        • [do_widget id="ai_widget-5"]
      • [do_widget_area sub-footer-1]
        • [do_widget id="text-4"]
      • [do_widget_area sub-footer-2]
        • [do_widget_area sub-footer-3]
          • [do_widget_area sub-footer-4]
            • [do_widget_area upper-footer-1]
              • [do_widget id="search-2"]
              • [do_widget id="recent-posts-2"]
              • [do_widget id="recent-comments-2"]
              • [do_widget id="archives-2"]
              • [do_widget id="categories-2"]
              • [do_widget id="meta-2"]
            • [do_widget_area upper-footer-2]
              • [do_widget_area upper-footer-3]
                • [do_widget_area upper-footer-4]
                  • [do_widget_area widgets_for_shortcodes]
                    • [do_widget id="search-5"]
                    • [do_widget id="ai_widget-6"]
                  • [do_widget_area wp_inactive_widgets]
                    • [do_widget id="wpp-2"]
                    • [do_widget id="text-1"]
                    • [do_widget id="recent-posts-3"]
                    • [do_widget id="categories-3"]
                    • [do_widget id="archives-3"]
                    • [do_widget id="icl_lang_sel_widget-3"]

                  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:

                  Creación de snapshot o instantánea de un volumen
                  Progreso de la creación de un snapshot desde la consola de AWS

                  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:

                  Creación de volúmen a partir de snapshot desde la consola de AWS - Paso 1
                  Creación de volúmen a partir de snapshot desde la consola de AWS - Paso 2

                  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:

                  Vincular volumen a instancia desde la consola de AWS - Paso 1
                  Vincular volumen a instancia desde la consola de AWS - Paso 2

                  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" 
                  }

                  Error: Your Requested widget " ai_widget-6" is not in the widget list.
                  • [do_widget_area above-nav-left]
                    • [do_widget_area above-nav-right]
                      • [do_widget_area footer-1]
                        • [do_widget id="wpp-4"]
                      • [do_widget_area footer-2]
                        • [do_widget id="recent-posts-4"]
                      • [do_widget_area footer-3]
                        • [do_widget id="recent-comments-3"]
                      • [do_widget_area footer-4]
                        • [do_widget id="archives-4"]
                      • [do_widget_area logo-bar]
                        • [do_widget id="oxywidgetwpml-3"]
                      • [do_widget_area menu-bar]
                        • [do_widget id="search-3"]
                      • [do_widget_area sidebar]
                        • [do_widget id="search-4"]
                        • [do_widget id="ai_widget-2"]
                        • [do_widget id="categories-5"]
                        • [do_widget id="ai_widget-3"]
                        • [do_widget id="ai_widget-4"]
                        • [do_widget id="ai_widget-5"]
                      • [do_widget_area sub-footer-1]
                        • [do_widget id="text-4"]
                      • [do_widget_area sub-footer-2]
                        • [do_widget_area sub-footer-3]
                          • [do_widget_area sub-footer-4]
                            • [do_widget_area upper-footer-1]
                              • [do_widget id="search-2"]
                              • [do_widget id="recent-posts-2"]
                              • [do_widget id="recent-comments-2"]
                              • [do_widget id="archives-2"]
                              • [do_widget id="categories-2"]
                              • [do_widget id="meta-2"]
                            • [do_widget_area upper-footer-2]
                              • [do_widget_area upper-footer-3]
                                • [do_widget_area upper-footer-4]
                                  • [do_widget_area widgets_for_shortcodes]
                                    • [do_widget id="search-5"]
                                    • [do_widget id="ai_widget-6"]
                                  • [do_widget_area wp_inactive_widgets]
                                    • [do_widget id="wpp-2"]
                                    • [do_widget id="text-1"]
                                    • [do_widget id="recent-posts-3"]
                                    • [do_widget id="categories-3"]
                                    • [do_widget id="archives-3"]
                                    • [do_widget id="icl_lang_sel_widget-3"]

                                  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   50G  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  100G  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   48G  50% /var/respaldo
                                   

                                  Sobre el autor

                                  Daniel López Azaña
                                  Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

                                  Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

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

                                  Artículos relacionados

                                  Deja una respuesta

                                  Tu dirección de correo electrónico no será publicada.