LVM: Mover volúmenes lógicos entre discos físicos.

Asumámoslo, shit happens. A veces pasa que tu magnífico disco de 2TB lleno de porno interesantísimos proyectos, máquinas virtuales y archivos sensibles (porno) empieza a fallar. Si tienes backup de todo ésto, pues tampoco es ningún drama, excepto la parte de configurar de cero un nuevo sistema en otro disco y restaurar los datos. Cuando […]

image_pdf

Asumámoslo, shit happens.

A veces pasa que tu magnífico disco de 2TB lleno de porno interesantísimos proyectos, máquinas virtuales y archivos sensibles (porno) empieza a fallar. Si tienes backup de todo ésto, pues tampoco es ningún drama, excepto la parte de configurar de cero un nuevo sistema en otro disco y restaurar los datos. Cuando tienes el sistema más tuneado que los gorgoritos de Justin Bieber, pues es un peñazo insufrible.

Así que si eres mínimamente listo (o te ha pasado con anterioridad la mierda ésta), te lo montas para que el sistema vaya avisando (con smartctl, por ejemplo) conforme al disco duro de tus entretelas se le van acabando las horas de vuelo. Si además configuras todo el sistema con LVM (Fedora, Debian y otras ya te lo hacen por defecto al instalar), lo tienes hecho.

Asumimos un sistema con todos sus archivos y particiones dentro de un LVM basado en /dev/sdb1(excepto /boot, que sigue dando problemas). Asumiremos también que ya hemos pinchado el disco de recambio y que es correctamente reconocido por el sistema.

Creamos un nuevo volumen físico en /dev/sdc1 y echamos un vistazo a cómo está el patio a nivel de volúmenes físicos, grupos de volúmenes y volúmenes lógicos:

root@bestiaparda:/mnt# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created
root@bestiaparda:/mnt# pvscan
  PV /dev/sdb1   VG vg_deb   lvm2 [1,82 TiB / 1,55 TiB free]
  PV /dev/sdc1               lvm2 [1,82 TiB]
  Total: 2 [3,64 TiB] / in use: 1 [1,82 TiB] / in no VG: 1 [1,82 TiB]
root@bestiaparda:~# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  vg_deb lvm2 a--  1,82t 1,55t
  /dev/sdc1         lvm2 a--  1,82t 1,82t
root@bestiaparda:~# vgs
  VG     #PV #LV #SN Attr   VSize VFree
  vg_deb   2   5   0 wz--n- 3,64t 3,10t
root@bestiaparda:~# lvs
  LV          VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log [...]
  lv_ERP      vg_deb -wI-a-----  20,00g                                                    
  lv_home     vg_deb -wI-ao---- 200,00g                                                    
  lv_root     vg_deb -wI-ao----  46,56g                                                    
  lv_swap     vg_deb -wI-ao----   1,86g                                                    
  vfmbofh.net vg_deb -wI-a-----   8,00g                                                    
root@bestiaparda:~#

Cuidadín con el pvcreate, que como nos equivoquemos de partición, la liaremos parda. Por otra parte, si el disco es grande (en este caso de 2TB, conviene crear una partición y luego crear el pv en ella. Cosas del GPT.

Bueno, vemos que nuestro LVM reside en /dev/sdb1, que contiene un grupo de volúmenes (VG) llamado vg_deb y éste diversos volúmenes lógicos (LV), llamados lv_WHATEVER. También vemos que el sistema reconoce correctamente el nuevo volumen físico (PV) en /dev/sdc1.

Toca extender el VG con nuestro flamante PV nuevo:

root@bestiaparda:/mnt# vgextend vg_deb /deb/sdc1
  Volume group "vg_deb" successfully extended
root@bestiaparda:~# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  vg_deb lvm2 a--  1,82t 1,55t
  /dev/sdc1  vg_deb lvm2 a--  1,82t 1,82t
root@bestiaparda:~# 

Vemos que ya tenemos el nuevo PV asignado al VG, así que podemos proceder a mover todos los LV de un disco a otro del tirón. Sin desmontar ni nada. Fácil para todos.

root@bestiaparda:/mnt# pvmove /dev/sdb1 /dev/sdc1
/dev/sdb1: Moved: 0,0%
[...]
/dev/sdb1: Moved: 99,9%

Fácil. No rápido. Si tenéis tabaco, es un buen momento para un piti. O diez.
Es un movimiento bastante seguro. Internamente, LVM no elimina nada que no se haya copiado correctamente antes. Así que la cosa es a prueba de fallos. MUY a prueba de fallos. He visto sistemas recuperarse de un apagado a las bravas con un proceso como éste a medio hacer y no sólo arrancar tan ricamente, sino continuar el proceso allí donde se quedó.
Por cierto, no avisa con ningún mensaje en caso de éxito. Simplemente llega al 100% y para.

Veamos qué tenemos al acabar:

root@bestiaparda:/mnt# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  vg_deb lvm2 a--  1,82t 1,82t
  /dev/sdc1  vg_deb lvm2 a--  1,82t 1,55t

Como podemos ver, los datos se han movido sin más. Aunque la partición raíz del sistema que estemos moviendo esté en uso. Ole y ole.

Ya podemos eliminar el disco moribundo del LVM activo y respirar tranquilos:

root@bestiaparda:/mnt# vgreduce vg_deb /dev/sdb1
  Removed "/dev/sdb1" from volume group "vg_deb"
root@bestiaparda:/mnt# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped
root@bestiaparda:/mnt# 

Ahora, en la próxima parada del sistema, podremos eliminar físicamente el disco sin más problemas y darle un final PePero, a martillazos.

:wq

2 Comments

  1. Los discos tienen que ser del mismo tamaño, o pueden ser de tamaños diferentes?
    Por ejemplo /dev/sdb1 500GB y /dev/sdc1 160GB….

    Excelente tuto, gracias.

  2. Para este método, el disco de destino tiene que ser igual o mayor.

    Si tienes que mover a un disco más pequeño, te va a tocar parada de servicio. Arrancas con un live, reduces el FS, el LV y el PV y, posteriormente, haces el pvmove.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Mandanga de las cookies

Este sitio web utiliza cookies porque no hay más remedio. Como no me quiero complicar la vida, doy por hecho que aceptas dichas cookies si sigues deambulando por aquí. La política de coolies es simple: ésta ACEPTAR

Aviso de cookies