Saltar la navegación

Mover PEs y datos

Si queremos mover PEs, por ejemplo, porque queremos dejar libre un PV, o cualquier otro motivo, debemos usar el comando pvmove. Es recomendable hacer copias de seguridad cuando se hacen migraciones.

En primer lugar, consultamos las PEs de los PVs que tenemos:

# pvdisplay -m
  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               disco_virtual
  PV Size               100,00 MiB / not usable 4,00 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              24
  Free PE               0
  Allocated PE          24
  PV UUID               mHsm57-0CKQ-fBt7-VecZ-hR01-7e8F-jVUwKz
   
  --- Physical Segments ---
  Physical extent 0 to 23:
    Logical volume	/dev/disco_virtual/web
    Logical extents	0 to 23
   
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               disco_virtual
  PV Size               100,00 MiB / not usable 4,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              24
  Free PE               10
  Allocated PE          14
  PV UUID               Gtg7dE-k4YQ-nSgE-7KvZ-dbU2-Jrev-W1dBqf
   
  --- Physical Segments ---
  Physical extent 0 to 13:
    Logical volume	/dev/disco_virtual/web
    Logical extents	24 to 37
  Physical extent 14 to 23:
    FREE
   
  --- Physical volume ---
  PV Name               /dev/sde1
  VG Name               disco_virtual
  PV Size               50,00 MiB / not usable 2,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              12
  Free PE               12
  Allocated PE          0
  PV UUID               1H04tT-uiti-5obu-qO7r-DxUs-a6dd-DdnVuB
   
  --- Physical Segments ---
  Physical extent 0 to 11:
    FREE

Vamos a mover las 5 últimas PEs de /dev/sdb al comienzo de /dev/sde1 que está vacío en estos momentos:

# pvmove /dev/sdb:19-23 /dev/sde1:0-4
  /dev/sdb: Moved: 20,0%
  /dev/sdb: Moved: 100,0%
# e2fsck -f /dev/disco_virtual/web 
e2fsck 1.42.12 (29-Aug-2014)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura del directorio
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/disco_virtual/web: 12/38912 ficheros (0.0% no contiguos), 10860/155648 bloques

Tras finalizar la operación de movimiento, que puede llevar bastante tiempo, chequeamos el sistema de ficheros del LV afectado.

Veamos como aparecen PEs libres en /dev/sdb y ocupadas en /dev/sde1:

# pvdisplay -m
  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               disco_virtual
  PV Size               100,00 MiB / not usable 4,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              24
  Free PE               5
  Allocated PE          19
  PV UUID               mHsm57-0CKQ-fBt7-VecZ-hR01-7e8F-jVUwKz
   
  --- Physical Segments ---
  Physical extent 0 to 18:
    Logical volume	/dev/disco_virtual/web
    Logical extents	0 to 18
  Physical extent 19 to 23:
    FREE
   
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               disco_virtual
  PV Size               100,00 MiB / not usable 4,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              24
  Free PE               10
  Allocated PE          14
  PV UUID               Gtg7dE-k4YQ-nSgE-7KvZ-dbU2-Jrev-W1dBqf
   
  --- Physical Segments ---
  Physical extent 0 to 13:
    Logical volume	/dev/disco_virtual/web
    Logical extents	24 to 37
  Physical extent 14 to 23:
    FREE
   
  --- Physical volume ---
  PV Name               /dev/sde1
  VG Name               disco_virtual
  PV Size               50,00 MiB / not usable 2,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              12
  Free PE               7
  Allocated PE          5
  PV UUID               1H04tT-uiti-5obu-qO7r-DxUs-a6dd-DdnVuB
   
  --- Physical Segments ---
  Physical extent 0 to 4:
    Logical volume	/dev/disco_virtual/web
    Logical extents	19 to 23
  Physical extent 5 to 11:
    FREE

Si el movimiento fuese dentro del mismo PV hay que usar la opción --alloc anywhere, por ejemplo, pasemos las 5 primeras PEs de /dev/sdc a sus 5 últimas PEs:

# pvmove --alloc anywhere /dev/sdc:0-4 /dev/sdc:19-23
  /dev/sdc: Moved: 0,0%
  /dev/sdc: Moved: 100,0%
# e2fsck -f /dev/disco_virtual/web 
e2fsck 1.42.12 (29-Aug-2014)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura del directorio
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/disco_virtual/web: 12/38912 ficheros (0.0% no contiguos), 10860/155648 bloques
# pvdisplay -m /dev/sdc
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               disco_virtual
  PV Size               100,00 MiB / not usable 4,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              24
  Free PE               10
  Allocated PE          14
  PV UUID               Gtg7dE-k4YQ-nSgE-7KvZ-dbU2-Jrev-W1dBqf
   
  --- Physical Segments ---
  Physical extent 0 to 4:
    FREE
  Physical extent 5 to 13:
    Logical volume	/dev/disco_virtual/web
    Logical extents	29 to 37
  Physical extent 14 to 18:
    FREE
  Physical extent 19 to 23:
    Logical volume	/dev/disco_virtual/web
    Logical extents	24 to 28

El comando pvmove también se puede utilizar para mover todos los datos de un PV a otro u otros PVs.

Vamos a añadir el dispositivo de bloque /dev/sdd a nuestro VG y posteriormente vamos a mover los datos del PV /dev/sdc:

# lvmdiskscan 
  /dev/disco_virtual/web [     152,00 MiB] 
  /dev/sda1              [       9,31 GiB] 
  /dev/sda2              [     702,00 MiB] 
  /dev/sdb               [     100,00 MiB] LVM physical volume
  /dev/sdc               [     100,00 MiB] LVM physical volume
  /dev/sdd               [     100,00 MiB] 
  /dev/sde1              [      50,00 MiB] LVM physical volume
  /dev/sde2              [      49,00 MiB] 
  2 disks
  3 partitions
  2 LVM physical volume whole disks
  1 LVM physical volume
# pvcreate /dev/sdd
  Physical volume "/dev/sdd" successfully created
# lvmdiskscan 
  /dev/disco_virtual/web [     152,00 MiB] 
  /dev/sda1              [       9,31 GiB] 
  /dev/sda2              [     702,00 MiB] 
  /dev/sdb               [     100,00 MiB] LVM physical volume
  /dev/sdc               [     100,00 MiB] LVM physical volume
  /dev/sdd               [     100,00 MiB] LVM physical volume
  /dev/sde1              [      50,00 MiB] LVM physical volume
  /dev/sde2              [      49,00 MiB] 
  1 disk
  3 partitions
  3 LVM physical volume whole disks
  1 LVM physical volume
# pvs
  PV         VG            Fmt  Attr PSize   PFree  
  /dev/sdb   disco_virtual lvm2 a--   96,00m      0 
  /dev/sdc   disco_virtual lvm2 a--   96,00m  40,00m
  /dev/sdd                 lvm2 ---  100,00m 100,00m
  /dev/sde1  disco_virtual lvm2 a--   48,00m  48,00m
# vgextend disco_virtual /dev/sdd
  Volume group "disco_virtual" successfully extended
# pvs
  PV         VG            Fmt  Attr PSize  PFree 
  /dev/sdb   disco_virtual lvm2 a--  96,00m     0 
  /dev/sdc   disco_virtual lvm2 a--  96,00m 40,00m
  /dev/sdd   disco_virtual lvm2 a--  96,00m 96,00m
  /dev/sde1  disco_virtual lvm2 a--  48,00m 48,00m
# pvmove /dev/sdc
  /dev/sdc: Moved: 100,0%
# pvs
  PV         VG            Fmt  Attr PSize  PFree 
  /dev/sdb   disco_virtual lvm2 a--  96,00m     0 
  /dev/sdc   disco_virtual lvm2 a--  96,00m 96,00m
  /dev/sdd   disco_virtual lvm2 a--  96,00m 40,00m
  /dev/sde1  disco_virtual lvm2 a--  48,00m 48,00m

Vemos, que LVM ha decidido pasar todos los datos de /dev/sdc a /dev/sdd, pues en las circunstancias actuales, es el único PV donde caben los datos. Podríamos nosotros haber especificado el destino de la siguiente forma:

# pvmove /dev/sdc /dev/sdd

Si hubiésemos especificado como destino de los datos a /dev/sde1, hubiésemos obtenido un error por falta de espacio:

# pvmove /dev/sdc /dev/sde1
Insufficient free space: 14 extents needed, but only 12 available
Unable to allocate mirror extents for pvmove0.
Failed to convert pvmove LV to mirrored

Es posible también, mover solo las PEs de un PV que pertenezcan a un LV concreto:

# pvmove -n nombre_LV PV_origen PV_destino...