Antes de nada, este procedimiento es aplicable a servidores virtualizados con
libvirt y que utilizan
qemu como KVM. Yo lo he ejecutado sobre RHEL6.x, RHEL7.x y Debian8.x. Se trata de un caso concreto, tal y como se hizo.
ANTES DE EMPEZAR, PARA LA MÁQUINA Y HAZ UN BACKUP DE DISCO
Arranca la máquina y para servicios críticos. La información que necesitas tener MUY clara es
- el directorio que voy a reducir y qué volumen lógico es (LV)
- a qué grupo de volúmenes pertenece (VG)
- a qué volumen físico pertenece (PV)
y con toda esta información, puedo ver qué LV/VG/PVs voy a redimensionar. Si no estás familiarizado con el sistema LVM de Linux, por favor, pídele a otra persona que ejecute este proceso.
La estructura del LVM de este servidor es:
[root@server ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vda3 vgsys lvm2 a-- 29,25g 11,50g
/dev/vda5 vgdata lvm2 a-- 200,00g 12,00g
[root@server ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vgdata 1 3 0 wz--n- 200,00g 12,00g
vgsys 1 3 0 wz--n- 29,25g 11,50g
[root@server ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lv_home vgdata -wi-ao-- 4,00g
lv_ihs vgdata -wi-ao-- 180,00g
lv_opt vgdata -wi-ao-- 4,00g
lv_root vgsys -wi-ao-- 11,75g
lv_tmp vgsys -wi-ao-- 1,00g
lv_var vgsys -wi-ao-- 5,00g
En este ejemplo, el directorio /ihs se definió muy grande pero ya no se usa tanto espacio, así que tenemos que reducirlo. Los pasos que vamos a dar son los siguientes:
- detectar qué LV hay que reducir → ya lo hemos hecho, el lv_ihs
- detectar en qué VG y PV está alojado → son el vgdata y el /dev/vda5
- hacer un backup de todos los LVs alojados en el VG afectado
- eliminar los LVs, el VG y el PV
- redefinir a nivel de disco las particiones
- recortar el espacio del disco que ya no se va a utilizar y redimensionar el archivo
- montar de nuevo el PV, el VG y los LVs
- volcar el backup
Ahora sí, vamos por partes
Haz una copia del disco. Para la máquina y cópiala con otro nombre
Una vez arranques la máquina de nuevo, para servicios que puedan estar trabajando con los directorios que estén sobre los LVs con los que vamos a trabajar.
Para ver si hay algo en uso (librerías, archivos, lo que sea) yo utilizo el comando lsof de esta manera:
> lsof -l | grep “/ihs”
> lsof -l | grep “/opt”
> lsof -l | grep “/home”
Si alguno de estos comandos te devuelve algo, es porque hay algún archivo en uso y es probable que no hayas parado el servicio.
Lanzo los backups; puedo hacer un tgz o un dd; voy a probar con tgz
> tar -czvf /mnt/server/opt.tgz /opt
> tar -czvf /mnt/server/ihs.tgz /ihs
> tar -czvf /mnt/server/home.tgz /home
Después voy a desmontar los LVs y los elimino; aprovecho y comento las unidades en /etc/fstab para que cuando reinicie no tenga problemas
> umount /opt
> umount /ihs
> umount /home
> lvremove /dev/mapper/vgdata-lv_opt
> lvremove /dev/mapper/vgdata-lv_home
> lvremove /dev/mapper/vgdata-lv_ihs
> vi /etc/fstab → y comento las unidades desmontadas
Voy a desactivar el VG y lo elimino
> vgchange -a n vgdata
> vgremove vgdata
Y ahora elimino el disco vda5 del PV, que es el que contiene el VG que acabo de eliminar
> pvremove /dev/vda5
Antes de parar el servidor, doy de baja la partición desde fdisk
> fdisk /dev/vda
Dentro del fdisk con la p veo todas las particiones cómo están definidas. Las tareas que YO tengo que hacer son (es probable que TÚ tengas otras, dependerá de cómo se particionó el disco en su momento)
- eliminar la partición extendida vda5
- eliminar la partición primaria vda4
- añadir una nueva partición vda4 del tamaño que corresponda (1)
- indicar que el formato de la nueva partición vda4 es LVM
(1) El tamaño va a depender del tamaño que le vaya a dar a los nuevos LV; en mi caso, a /opt le damos 4GB, a /home le damos otros 4GB y a /ihs le damos 20GB, que hacen 28GB. Para no pillarme los dedos, voy a definir una partición de 30GB. El tamaño que le voy a dar a la unidad lo hago cuando la creo, y le asigno el tamaño con un +30G
Una vez he guardado los cambios en del fdisk, paro la máquina y redimensiono los discos. Recuerda que tienes que tener espacio para hacerlo; al menos vas a necesitar el mismo espacio que el que ocupa ahora el archivo del disco, como si lo fueras a duplicar.
> qemu-img convert Server.img -O raw Server.raw
de qcow2 a raw, porque en formato qcow2 no se pueden hacer resizes
> qemu-img resize Server.raw 50G → Cambio el tamaño del disco
> qemu-img convert Server.raw -O qcow2 Server.img → Convierto de raw a qcow2. Cuidado en este paso, si lo ejecutas así borrarás el disco original. Apunta a un fichero con otro nombre o en otro directorio
Arranca la máquina de nuevo (2) y empieza a montar de nuevo la estructura.
Creo el nuevo PV
> pvscan
> pvcreate /dev/vda4
Creo el nuevo VG
> vgcreate vgdata /dev/vda4
Creo los LVs y los formateo (3)
> lvcreate --size 4G -n lv_opt vgdata
> lvcreate --size 4G -n lv_home vgdata
> lvcreate --size 20G -n lv_ihs vgdata
> mkfs.ext4 /dev/vgdata/lv_opt
> mkfs.ext4 /dev/vgdata/lv_home
> mkfs.ext4 /dev/vgdata/lv_ihs
Descomento el /etc/fstab y monto las unidades
> mount -a
Por último restauro el contenido de las carpetas, muevo el contenido de los backups y los vuelco. Después reinicio el servidor y compruebo que los servicios arrancan correctamente
(2) Llegado a este punto, si no has comentado las unidades en el /etc/fstab cuando hemos eliminado los LVs, ahora la máquina no te va a arrancar. No te preocupes, el problema es que no encuentra las unidades para montarlas; podemos solucionarlo, aunque es un poco lento.
Para solucionarlo arranca con un LiveCD (Knoppix, por ejemplo) y vamos a comentar esas unidades en el /etc/fstab. Una vez arranque, hay que activar el soporte de LVM en Knoppix, así que abre una consola y ejecuta:
> sudo su -
> vgscan --mknodes
> vgchange -ay
> lvscan
> mount /dev/vgsys/lv_root /mnt/
> vi /mnt/etc/fstab
y comenta ahora las unidades. Guarda al salir y reinicia, ya deberías poder entrar en el SO.
(3) Si al crear una nueva partición para vgdata no pueda, prueba a arrancar con una distro Gparted y crea la partición sin problemas.