Ampliar disco en linux con LVM

Una de las ventajas de utilizar la virtualización en los servidores es que nos permite jugar con el hardware que se presenta a la máquina virtual, cambiando la cantidad de cpu, memoria, o disco dependiendo de las necesidades del cliente en cada momento de la vida del servicio, sin necesidad de parar el servicio o, como mucho, realizando un rápido reinicio. Algo impensable cuando se trabaja con servidores físicos.

Es por eso que, quizás, una de las tareas más comunes con estos servidores es la de ampliar el disco disponible y, si tenemos la previsión de haberlo configurado usando LVM (en el caso de máquinas Linux), es muy posible que consigamos hacerlo sin necesidad de parar el servicio.

LVM es un sistema de gestión de volúmenes que permite poner una capa de abstracción entre los discos conectados al servidor (físicos o virtuales) y el disco lógico que ve el sistema operativo. Mediante este sistema podemos ampliar, reducir, o incluso migrar los datos de un disco a otro sin necesidad de parar los servicios del equipo.

Podéis leer más información en la página del HOWTO oficial: http://tldp.org/HOWTO/LVM-HOWTO/

En nuestro caso vamos a ver como nos puede ayudar este sistema para hacer la ampliación de un disco.

Entorno de pruebas

Para hacer la prueba he utilizado un entorno con las siguientes características:

  • Máquina virtual sobre VMWare Workstation
  • S.O. Linux Debian 7 64b
  • Una unidad de disco sda de 10Gb con las siguientes particiones:
    • sda1 de 230Mb de tipo ext2 montada en /boot
    • sda2 del resto de capacidad como partición extendida
    • sda5 ocupando toda la partición extendida anterior de tipo LVM
  • Un “volume group” llamado “debian” con la partición /dev/sda5 y dos “logical volumes”:
    • /dev/debian/swap de 460Mb montado como swap
    • /dev/debian/root del resto (9,31Gb) de tipo ext4 montado en /

 

Trabajos previos

En primer lugar quiero recalcar que no me hago responsable de perdidas de datos, o cualquier otro problema derivado de seguir esta guía. Puedo asegurar que el procedimiento que describo lo he realizado varias veces, en sistemas diferentes, sin tener ningún problema, pero no puedo garantizar que no vaya a suponer un problema en otro sistema, así que lo primero que vamos a necesitar es una copia de seguridad completa de toda nuestra información.

¿Ya tenemos el backup? Pues ahora nos aseguraremos que tenemos las utilidades resize2fs, parted y partprobe disponibles en nuestro servidor. En debian estos programas se encuentran en los paquetes e2fsprogs y parted.

 

Pasos a seguir

En modo resumido, lo que tendremos que realizar será: ampliar el disco que presentamos a la máquina virtual, crear una partición nueva con el espacio libre que queda, ampliar el volumen lógico y, por último, ampliar la partición del sistema.

Ampliar disco

  • Desde la herramienta de administración de vmware (o la que corresponda) cambiamos el tamaño del disco presentado, ampliándolo hasta la capacidad que queramos que tenga.
  • Desde la máquina Linux forzamos un reescaneo del bus SCSI para que el sistema vea el cambio en el tamaño del disco, para eso usamos la siguiente instrucción:
    echo " - - - " > /sys/class/scsi_host/hostX/scan

    donde “hostX” es el bus donde se encuentra el disco virtual.
    Normalmente se encuentran tres buses (host0, host1 y host2). Se puede lanzar la instrucción en los tres para asegurarse.

  • Usando fdisk -l veremos que el disco ya se ve con el tamaño ampliado:
    root@debian:~# fdisk -l
    
    Disk /dev/sda: 11.8 GB, 11811160064 bytes
    255 heads, 63 sectors/track, 1435 cylinders, total 23068672 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000af450
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048      499711      248832   83  Linux
    /dev/sda2          501758    20969471    10233857    5  Extended
    /dev/sda5          501760    20969471    10233856   8e  Linux LVM
    
  • Aunque las particiones siguen teniendo el mismo tamaño:
    root@debian:~# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    rootfs                   9.2G  964M  7.8G  11% /
    
  • Debemos ampliar la partición extendida para que ocupe el 1GB de espacio contiguo que ahora está sin asignar. Para esto usamos la utilidad parted:
    root@debian:~# parted
    GNU Parted 2.3
    Using /dev/sda
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) select /dev/sda
    Using /dev/sda
    (parted) resize 2
    WARNING: you are attempting to use parted to operate on (resize) a file system.
    parted's file system manipulation code is not as robust as what you'll find in
    dedicated, file-system-specific packages like e2fsprogs.  We recommend
    you use parted only to manipulate partition tables, whenever possible.
    Support for performing most operations on most types of file systems
    will be removed in an upcoming release.
    Start?  [257MB]?
    End?  [10.7GB]? 11.8GB
    (parted) quit
    Information: You may need to update /etc/fstab.
    
  • Usando fdisk -l vemos que la partición extendida se ha ampliado correctamente:
    root@debian:~# fdisk -l
    Disk /dev/sda: 11.8 GB, 11811160064 bytes
    255 heads, 63 sectors/track, 1435 cylinders, total 23068672 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000af450
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048      499711      248832   83  Linux
    /dev/sda2          501758    23068671    11283457    5  Extended
    /dev/sda5          501760    20969471    10233856   8e  Linux LVM
    

Ampliar el volumen

  • Creamos una partición nueva de tipo LVM dentro de la extendida usando el espacio libre con fdisk:
    root@debian:~# fdisk /dev/sda
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 1 extended, 2 free)
       l   logical (numbered from 5)
    Select (default p): l
    Adding logical partition 6
    First sector (20971520-23068671, default 20971520):
    Using default value 20971520
    Last sector, +sectors or +size{K,M,G} (20971520-23068671, default 23068671):
    Using default value 23068671
    Command (m for help): t
    Partition number (1-6): 6
    Hex code (type L to list codes): 8e
    Changed system type of partition 6 to 8e (Linux LVM)
    
    Command (m for help): p
    
    Disk /dev/sda: 11.8 GB, 11811160064 bytes
    255 heads, 63 sectors/track, 1435 cylinders, total 23068672 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000af450
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048      499711      248832   83  Linux
    /dev/sda2          501758    23068671    11283457    5  Extended
    /dev/sda5          501760    20969471    10233856   8e  Linux LVM
    /dev/sda6        20971520    23068671     1048576   8e  Linux LVM
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    
  •  Ejecutamos partprobe para que el sistema operativo vea la nueva partición.
  •  Formateamos la partición nueva como LVM:
    pvcreate /dev/sda6
  • Añadimos la partición al “volume group” donde se encuentra el “logical volume” y, por consiguiente, la partición a ampliar. En nuestro caso el vg es “debian”:
    root@debian:~# vgextend debian /dev/sda6
      Volume group "debian" successfully extended
    root@debian:~# vgdisplay
      --- Volume group ---
      VG Name               debian
      System ID
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  4
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               10.75 GiB
      PE Size               4.00 MiB
      Total PE              2753
      Alloc PE / Size       2498 / 9.76 GiB
      Free  PE / Size       255 / 1020.00 MiB
      VG UUID               qYKgKQ-cshc-2eCk-mn0Z-jZAR-xkry-mYKiHw
    
  • Ampliamos el “logical volume” con el espacio nuevo:
    root@debian:~# lvextend -l +255 /dev/debian/root
      Extending logical volume root to 10.30 GiB
      Logical volume root successfully resized
    root@debian:~# lvdisplay /dev/debian/root
      --- Logical volume ---
      LV Path                /dev/debian/root
      LV Name                root
      VG Name                debian
      LV UUID                wRrnKO-2BYp-WM8T-8sau-drDq-ytZe-K0CRoR
      LV Write Access        read/write
      LV Creation host, time debian, 2013-10-01 11:30:25 +0200
      LV Status              available
      # open                 1
      LV Size                10.30 GiB
      Current LE             2638
      Segments               2
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           254:0
    
    root@debian:~# vgdisplay
      --- Volume group ---
      VG Name               debian
      System ID
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  5
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               10.75 GiB
      PE Size               4.00 MiB
      Total PE              2753
      Alloc PE / Size       2753 / 10.75 GiB
      Free  PE / Size       0 / 0
      VG UUID               qYKgKQ-cshc-2eCk-mn0Z-jZAR-xkry-mYKiHw
    

Ampliar la partición

  • Por último, extendemos la partición con resize2fs:
    root@debian:~# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    rootfs                   9.2G  965M  7.8G  11% /
    …
    root@debian:~# resize2fs /dev/debian/root
    resize2fs 1.42.5 (29-Jul-2012)
    Filesystem at /dev/debian/root is mounted on /; on-line resizing required
    old_desc_blocks = 1, new_desc_blocks = 1
    Performing an on-line resize of /dev/debian/root to 2701312 (4k) blocks.
    The filesystem on /dev/debian/root is now 2701312 blocks long.
    
    root@debian:~# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    rootfs                    11G  967M  8.7G  10% /
    

 


So, what do you think ?