Skip to content

Lvm logical volum manager

Con LVM podemos re-dimensionar espacios, añadir o quitar discos estando en caliente. De las particiones físicas reales se crean discos virtuales, y de esos virtuales creas las particiones a utilizar.

PV: phisical volume

  • Se refiere a particiones en un disco real.

VG: volum group

  • Discos virtuales que crea lvm partiendo de x numero de particiones PV.

LV: logical volum

  • Particiones del disco virtual de las que montaremos nuestros datos.

Ordenes

# display
lsblk # para ver nuestros discos
sudo pvs # ver volumens fisicos
sudo pvdisplay
sudo vgs # ver discos virtuales
sudo vgdisplay
sudo lvs # ver particiones logicas
sudo lvdisplay

# accion
sudo pvcreate /dev/<disco> # crear volumen fisico
sudo vgcreate <nombre de grupo> /dev/<disco>... # crear disco virtual

# crear  particion logica
sudo lvcreate -L +<tamaño que quieres 200M> -n <nombre partición> <grupo VG a asignar>
# Si quieres todo el espacio del disco 
sudo lvcreate -l <tamaño que quieres 100%free> -n <nombre partición> <grupo VG a asignar>

sudo mkfs.ext4 /dev/<grupo>/<partición> # formatear partición
sudo mount /dev/<grupo>/<partición> /mnt # montar

sudo vgextend <grupo> /dev/<disco> # añadir PV a disco virtual
sudo lvextend -L +<tamaño a aumentar M,G> /dev/<grupo>/<partición> # extender particion logica
# Si queremos aumentar a todo el disco disponible
sudo lvextend -l +100%free /dev/<grupo>/<partición>           

# aumentar el sistema de ficheros al completo de la partición
sudo resize2fs /dev/<grupo>/<partición>  # en modo ext4
sudo xfs_growfs /dev/<grupo>/<partición>  # en modo xfs                                   

# reducir
sudo e2fsck -f /dev/<grupo>/<partición> # reducir fs solo en ext algo 2,3,4 
sudo resize2fs /dev/<grupo>/<partición> <tamaño a reducir (500M)> # reducir fs 
sudo lvresize -L -<tamaño a quitar (500M)> /dev/<grupo>/<partición> # reducir particion logica

Entorno de Pruebas

Se esta simulando dos discos físicos, que se convertirán en PV y estos formaran un disco virtua VG para jugar con las particiones LV.

  m06 dd if=/dev/zero of=disc1.img bs=1k count=100k
➜  m06 dd if=/dev/zero of=disc2.img bs=1k count=100k
104857600 bytes (105 MB, 100 MiB) copied, 0,154778 s, 677 MB/s

➜  m06 sudo losetup /dev/loop0 disc1.img   m06 sudo losetup /dev/loop1 disc2.img
➜  m06 sudo losetup -a
/dev/loop1: [2054]:5249112 (/var/tmp/m06/disc2.img)
/dev/loop0: [2054]:5248922 (/var/tmp/m06/disc1.img)

Crear PV

  m06 sudo pvcreate /dev/loop0
  Physical volume "/dev/loop0" successfully created.
➜  m06 sudo pvcreate /dev/loop1
  Physical volume "/dev/loop1" successfully created.

➜  m06 sudo pvdisplay /dev/loop0
  "/dev/loop0" is a new physical volume of "100,00 MiB"
  --- NEW Physical volume ---
  PV Name               /dev/loop0
  VG Name               
  PV Size               100,00 MiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               RqLfk2-OQIg-yH3z-flxD-wNVs-S9SE-omUu5G

# display en formato reducido  m06 sudo pvs /dev/loop0
  PV         VG Fmt  Attr PSize   PFree  
  /dev/loop0    lvm2 ---  100,00m 100,00m

Crear VG

  m06 sudo vgcreate diskedt /dev/loop0 /dev/loop1
  Volume group "diskedt" successfully created

➜  m06 sudo vgdisplay diskedt
  --- Volume group ---
  VG Name               diskedt
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               192,00 MiB
  PE Size               4,00 MiB
  Total PE              48
  Alloc PE / Size       0 / 0   
  Free  PE / Size       48 / 192,00 MiB
  VG UUID               wjjoFH-mOou-7wzb-leiN-ofVX-0Q65-Mw3PRp

PE Unidad mínima de asignación

El PE es el tamaño en que divide los bloques del disco, por cada partición física o disco en este caso perdemos 4MiB que utiliza lvm para su gestión.

Se puede ver como con 2 discos de 100MiB cada uno debería obtener 200MiB y obtengo 192MiB, se pierde 4MiB por cada partición/disco real.

Crear LV

Al haberse dividido el disco virtual en bloques de 4MiB se podrá crear particiones lógicas con tamaño múltiple de 4, por ejemplo 148M o 152M, 150M no dejara, automáticamente se añadirá de 152M.

  m06 sudo lvcreate -L 50M -n sistema /dev/diskedt
  Rounding up size to full physical extent 52,00 MiB
  Logical volume "sistema" created.

➜  m06 sudo lvcreate -l 100%FREE -n dades /dev/diskedt
  Logical volume "dades" created.

➜  m06 sudo lvdisplay /dev/diskedt/sistema
  --- Logical volume ---
  LV Path                /dev/diskedt/sistema
  LV Name                sistema
  VG Name                diskedt
  LV UUID                84OwTh-abyU-SxTZ-1uGT-Qrp7-murD-7eTayk
  LV Write Access        read/write
  LV Creation host, time pc02, 2020-02-03 19:26:09 +0100
  LV Status              available
  # open                 0
  LV Size                52,00 MiB
  Current LE             13
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

Se puede ver como esta partición LV ocupa 52MiB y utiliza 13 bloques "Current LE" .

-l 100%FREE especifica que el tamaño del lv sera el 100% del espacio disponible.

Estructura

Se puede ver como el VG diskedt contiene dos PV loop0 y loop1, y hay dos LV particiones lógicas en diskedt, con la gracia que dades se a repartido automáticamente en 2 particiones físicas.

  m06 sudo lsblk   
NAME              MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0               7:0    0   100M  0 loop 
├─diskedt-sistema 253:0    0    52M  0 lvm  
└─diskedt-dades   253:1    0   140M  0 lvm  
loop1               7:1    0   100M  0 loop 
└─diskedt-dades   253:1    0   140M  0 lvm    m06 sudo lvs
  LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  dades   diskedt -wi-a----- 140,00m                                                    
  sistema diskedt -wi-a-----  52,00m    

El matiz es que el sistema ve un disco diskedt con 2 particiones sistema y dades, y lo que haya por debajo no le importa demasiado.

Formatear particiones y montar

  m06 sudo mkfs.ext4 /dev/diskedt/dades     m06 sudo mount /dev/diskedt/dades /mnt/dades   m06 sudo df -h
S.ficheros                  Tamaño Usados  Disp Uso% Montado en
...
/dev/mapper/diskedt-dades     132M   1,6M  121M   2% /mnt/dades
/dev/mapper/diskedt-sistema    47M   1,1M   42M   3% /mnt/sistema

Añadir disco

Simulo que necesito mas espacio para el sistema y añado un disco físico al pc, y lo añado al disco virtual diskedt.

  m06 dd if=/dev/zero of=disk3.img bs=1k count=100k
➜  m06 sudo losetup /dev/loop2 disc3.img

➜  m06 sudo pvcreate /dev/loop2
  Physical volume "/dev/loop2" successfully created.

# extender vg  m06 sudo vgextend diskedt /dev/loop2 
  Volume group "diskedt" successfully extended

➜  m06 sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree 
  diskedt   3   2   0 wz--n- 288,00m 96,00m

Podemos ver que ahora diskedt tiene 96MiB de espacio libre.

Expandir partición

Sumamos 30MiB a los 52MiB que tenia la particion LV sistema

  m06 sudo lvextend -L +30 /dev/diskedt/sistema /dev/loop2
  Rounding size to boundary between physical extents: 32,00 MiB.
  Size of logical volume diskedt/sistema changed from 52,00 MiB (13 extents) to 84,00 MiB   m06 sudo lvdisplay /dev/diskedt/sistema 
  --- Logical volume ---
  LV Path                /dev/diskedt/sistema
  LV Name                sistema
  VG Name                diskedt
  LV UUID                84OwTh-abyU-SxTZ-1uGT-Qrp7-murD-7eTayk
  LV Write Access        read/write
  LV Creation host, time pc02, 2020-02-03 19:26:09 +0100
  LV Status              available
  # open                 1
  LV Size                84,00 MiB
  Current LE             21
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

Se puede ver que ahora ocupa 21 bloques, repartidos en 2 segmentos.

  m06 lsblk
NAME              MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0               7:0    0   100M  0 loop 
├─diskedt-sistema 253:0    0    84M  0 lvm  /mnt/sistema
└─diskedt-dades   253:1    0   140M  0 lvm  /mnt/dades
loop1               7:1    0   100M  0 loop 
└─diskedt-dades   253:1    0   140M  0 lvm  /mnt/dades
loop2               7:2    0   100M  0 loop 
└─diskedt-sistema 253:0    0    84M  0 lvm  /mnt/sistema

Expandir sistema de archivos

Estando montado se ve como expande sin problemas el sistema de ficheros

  m06 df -h
S.ficheros                  Tamaño Usados  Disp Uso% Montado en
...
/dev/mapper/diskedt-dades     132M   1,6M  121M   2% /mnt/dades
/dev/mapper/diskedt-sistema    47M   1,1M   42M   3% /mnt/sistema

➜  m06 sudo resize2fs /dev/diskedt/sistema   m06 df -h
S.ficheros                  Tamaño Usados  Disp Uso% Montado en
...
/dev/mapper/diskedt-dades     132M   1,6M  121M   2% /mnt/dades
/dev/mapper/diskedt-sistema    78M   1,6M   72M   3% /mnt/sistema

Reducir partición

Para reducir una partición no es necesario desmontar, lvm ya se encarga del sistema de archivos el solo.

  m06 sudo lvreduce -L 50M -r /dev/diskedt/sistema   m06 sudo lvs
  LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  dades   diskedt -wi-ao---- 140,00m                                                    
  sistema diskedt -wi-ao----  52,00m          

Mover datos

Para mover los datos de un disco a otro se utiliza pvmove pero antes de nada hay que realizar ciertos pasos.

Simulo que e añadido un disco grande y voy a prescindir de los 2 pequeños que tengo.

# creo/inserto disco  m06 dd if=/dev/zero of=disk3.img bs=1k count=500k
524288000 bytes (524 MB, 500 MiB) copied, 0,705858 s, 743 MB/s
➜  m06 sudo losetup /dev/loop2 disk3.img 
# creo la marca de disco fisico  m06 sudo pvcreate /dev/loop2
# lo añado al disco virtual  m06 sudo vgextend diskedt /dev/loop2
# se puede ver que hay 3 pv y a crecido en tamaño  m06 sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree  
  diskedt   3   2   0 wz-pn- 688,00m 496,00m

# muevo datos al nuevo disco  m06 sudo pvmove /dev/loop0 /dev/loop2
➜  m06 sudo pvmove /dev/loop1 /dev/loop2
➜  m06 lsblk
NAME              MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0               7:0    0   100M  0 loop 
loop1               7:1    0   100M  0 loop 
loop2               7:2    0   500M  0 loop 
├─diskedt-sistema 253:0    0    52M  0 lvm  /mnt/sistema
└─diskedt-dades   253:1    0   140M  0 lvm  /mnt/dades

Todo esto con los datos montados, el usuario ni se entera de lo que pasa por debajo.

Reducir disco

Para extraer discos físicos al disco virtual y por lo tanto reducir de tamaño.

  m06 sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree  
  diskedt   3   2   0 wz--n- 688,00m 496,00m

➜  m06 sudo vgreduce diskedt /dev/loop0 /dev/loop1
  Removed "/dev/loop0" from volume group "diskedt"
  Removed "/dev/loop1" from volume group "diskedt"  m06 sudo vgs                                   
  VG      #PV #LV #SN Attr   VSize   VFree  
  diskedt   1   2   0 wz--n- 496,00m 304,00m

Borrado

Para borrar y desmontar todo, primero hay que desmontar y luego ir borrando desde arriba hacia abajo, LV, VG, PV.

# desmontar  m06 sudo umount /mnt/dades /mnt/sistema 
# borrado lv  m06 sudo lvremove /dev/diskedt/sistema /dev/diskedt/dades 
# borrado vg  m06 sudo vgremove diskedt
# borrado pv  m06 sudo pvremove /dev/loop{0..2}