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% /