Skip to main content

204.3 Logical Volume Manager


Este tópico mostra como gerenciar os discos com o LVM.



LVM - Logical Volume Manager


O LVM é uma forma de gerenciar o armazenamento no Linux, fornecendo maior controle sobre o gerenciamento do espaço consumido. Ao invés de trabalhar com partições vamos trabalhar com volumes lógicos, dessa maneira temos uma forma melhor de gerenciar o armazenamento do sistema.


O processo para trabalhar com LVM é:

  • Primeiro selecione quais discos/partições farão parte do LVM;

  • Crie os PV (Physical Volume) usando os discos/partições;

    • PV - É o mapeamento da partição com o dispositivo de armazenamento.
  • Crie os VG (Volume Group) usando os PVs;

    • VG - É a junção de todos os PVs em um único grupo (podemos ter mais de um, com discos diferentes).
  • Crie o LV (Logical Volume) a partir do VG.

    • LV - É a partição lógica, podemos ter várias.

A imagem abaixo representa todo o processo descrito acima:


LVM


Vamos instalar o pacote do lvm2 para gerenciar os discos (em suma ele já vem instalado). O arquivo de configuração fica em /etc/lvm/lvm.conf, esse arquivo é usado para configurar as propriedades do LVM como: localização do arquivo de log, onde escanear os recursos e etc.


Vamos criar o lvm com três discos, depois vou incluir mais um e farei todo o processo logado com root e não vou usar partição, apenas o disco inteiro:

# Os discos que vou usar vai de 'vdb' até 'vdd':
root:\# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 128G 0 disk
├─vda1 252:1 0 487M 0 part /boot
├─vda2 252:2 0 1.9G 0 part [SWAP]
└─vda3 252:3 0 125.6G 0 part /
vdb 252:16 0 10G 0 disk
vdc 252:32 0 10G 0 disk
vdd 252:48 0 10G 0 disk
vde 252:64 0 10G 0 disk

# Crie os PVs:
root:\# pvcreate /dev/vd{b,c,d,e}
Physical volume "/dev/vdb" successfully created.
Physical volume "/dev/vdc" successfully created.
Physical volume "/dev/vdd" successfully created.
Physical volume "/dev/vde" successfully created.

# Liste os PVs criados (se quiser mais detalhes use o 'pvdisplay'):
root:\# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb lvm2 --- 10.00g 10.00g
/dev/vdc lvm2 --- 10.00g 10.00g
/dev/vdd lvm2 --- 10.00g 10.00g


# Crie o VG usando os PVs:
root:\# vgcreate vgtest -s2 /dev/vd{b..d}
Volume group "vgtest" successfully created

# Liste o VG:
root:\# vgs
VG #PV #LV #SN Attr VSize VFree
vgtest 3 0 0 wz--n- 29.99g 29.99g

# Liste com mais detalhes:
root:\# vgdisplay
--- Volume group ---
VG Name vgtest
System ID
Format lvm2
Metadata Areas 3
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 3
Act PV 3
VG Size 29.99 GiB
PE Size 2.00 MiB
Total PE 15357
Alloc PE / Size 0 / 0
Free PE / Size 15357 / 29.99 GiB
VG UUID C7ke7S-DOKH-r2u6-YV5k-838p-sf2f-A22Rkx

A opção -s ou --physicalextentsize usada em conjunto com vgcreate determina o tamanho do PE. Cada volume (PV) em um Grupo de Volume (VG) é subdividido em partes de tamanho fixo chamadas extensões, essas extensões em um PV são chamadas Extensões Físicas ou Physical Extents (PE), portanto, ao definir o PE como -s2 estamos dizendo que ele terá 2MB de tamanho por extensão, por padrão ele tem 4MB.


As extensões em um LV são chamadas de LE. De maneira geral, cada extensão lógica (LE) é mapeada para uma extensão física (PE), mas isso pode mudar se forem usados recursos como o espelhamento de disco (para mais detalhes consulte aqui). Os Grupos de Volumes (VG) podem ser subdivididos em Volumes Lógicos (LVs), com funcionalidade semelhante à das partições, mas com mais flexibilidade.

O tamanho de um Volume Lógico (LV), é especificado durante a sua criação, só que na verdade é definido pelo tamanho das extensões físicas (PE) que por padrão possui 4 MB, multiplicado pelo número de extensões no volume. Com isso, é fácil entender que para aumentar um Volume Lógico (LV), por exemplo, basta adicionar mais extensões do pool disponível no Grupo de Volumes (VG). Da mesma forma, as extensões podem ser removidas para reduzir o LV.

Segue abaixo uma imagem para facilitar o entendimento:


LVM-detail


Exemplo com dois VG:


LVM-detail2


Agora com o VG criado vamos criar os LVs, mas antes, precisamos ativar o VG que foi criado:

root:\# vgchange -a y vgtest
0 logical volume(s) in volume group "vgtest" now active

# -a = Activation
# y = Yes (essa opção não é obrigatória)

# Agora crie dois LVs:
root:\# lvcreate -L 10G vgtest -n lvtest
Logical volume "lvtest" created.

# -L = Tamanho do PE;
# -n = Nome do LV.

Com o LV criado já podemos formatar e depois montar ele.

# Formate com ext4:
root:\# mkfs.ext4 /dev/vgtest/lvtest
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 320b4d83-cc51-4d53-aa15-4fc35dd07f23
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

# Monte o LV:
root:\# mount /dev/vgtest/lvtest /mnt/

# Veja a montagem:
root:\# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 9.8G 37M 9.3G 1% /mnt

## É possível montar usando o caminho ‘/dev/mapper/vgtest-lvtest’.


Adicionar outro disco para o VG


Adicione outro disco para o VG (Como o PV já foi criado não será necessário):

# Adicione o PV do disco ao VG:
root:\# vgextend vgtest /dev/vde
Volume group "vgtest" successfully extended


# Veja se o PV foi adicionado ao VG:
root:\# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb vgtest lvm2 a-- <10.00g 0
/dev/vdc vgtest lvm2 a-- <10.00g <10.00g
/dev/vdd vgtest lvm2 a-- <10.00g <10.00g
/dev/vde vgtest lvm2 a-- <10.00g <10.00g


# Veja se aumentou o tamanho do VG:
root:\# vgs
VG #PV #LV #SN Attr VSize VFree
vgtest 4 1 0 wz--n- 39.99g 29.99g

Com isso conseguindo aumentar o tamanho do VG, sendo assim, temos mais espaço disponível para nossos Lvs.



Aumentar o tamanho do LV


Agora vamos aumentar o tamanho do LV:

# Veja o tamanho do LV:
root:\# fdisk -l /dev/mapper/vgtest-lvtest
Disk /dev/mapper/vgtest-lvtest: 10 GiB, 10737418240 bytes, 20971520 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

root:\# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 9.8G 37M 9.3G 1% /mnt


# Desmonte o LV que montamos:
root:\# umount /mnt/


# Adicionando mais 5GB ao nosso LV:
root:\# lvextend -L +5G /dev/vgtest/lvtest
Size of logical volume vgtest/lvtest changed from 10.00 GiB (5120 extents) to 15.00 GiB (7680 extents).
Logical volume vgtest/lvtest successfully resized.

### -L 15G = Exatamente 15GB;

# Veja o tamanho do disco no sistema:
root:\# fdisk -l /dev/mapper/vgtest-lvtest
Disk /dev/mapper/vgtest-lvtest: 15 GiB, 16106127360 bytes, 31457280 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

# Vou montar o LV para que veja que o tamanho ocupado pelo filesystem nao mudou,
# não é necessário fazer isso:
root:\# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 9.8G 37M 9.3G 1% /mnt

# Agora faça com que o filesystem preencha todo o volume:
root:\# resize2fs /dev/vgtest/lvtest
resize2fs 1.45.5 (07-Jan-2020)
Resizing the filesystem on /dev/vgtest/lvtest to 3932160 (4k) blocks.
The filesystem on /dev/vgtest/lvtest is now 3932160 (4k) blocks long.

# Agora sim monte o LV e veja se aumentou:
root:\# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 15G 41M 14G 1% /mnt

Exemplo de como aumentar um LV que tem o Luks, esse é a raiz de um server:

# Veja os PVs (Nesse caso ele já foi aumentado de tamanho, mas estou deixando os comandos aqui):
root:\# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/dm_crypt-0 ubuntu-vg lvm2 a-- <445.11g 0

# Com o nome do VG, verifique o nome do LV:
root:\# ls /dev/ubuntu-vg/
ubuntu-lv

# Agora aumente para ocupar todo o espaço disponível no PV:
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

# Agora faça com que o filesystem preencha todo o volume:
resize2fs /dev/ubuntu-vg/ubuntu-lv

# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 438G 302G 118G 73% /


Reduzir o tamanho do LV


Agora vamos reduzir o tamanho do LV para 5G, muitas vezes é necessário fazer um e2fsck para verificar o filesystem, lembrando que só é possível fazer isso caso tenha espaço livre, se não tiver vai perder os dados.

# Tente fazer o resize:
root:\# resize2fs /dev/vgtest/lvtest 5G
resize2fs 1.45.5 (07-Jan-2020)
Please run 'e2fsck -f /dev/vgtest/lvtest' first.


# Como não deu, faça o fsck para ext4:
root:\# e2fsck -f /dev/vgtest/lvtest
e2fsck 1.45.5 (07-Jan-2020)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information


# Faça o resize:
root:\# resize2fs /dev/vgtest/lvtest 5G
resize2fs 1.45.5 (07-Jan-2020)
Resizing the filesystem on /dev/vgtest/lvtest to 1310720 (4k) blocks.
The filesystem on /dev/vgtest/lvtest is now 1310720 (4k) blocks long.


# Vou montar o LV e mostrar o novo tamanho:
root:\# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 4.9G 33M 4.6G 1% /mnt


# Agora vamos diminuir o tamanho do LV:
root:\# lvreduce -L 5G /dev/vgtest/lvtest
WARNING: Reducing active logical volume to 5.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vgtest/lvtest? [y/n]: y
Size of logical volume vgtest/lvtest changed from 15.00 GiB (7680 extents) to 5.00 GiB (2560 extents).
Logical volume vgtest/lvtest successfully resized.


Renomear o VG e LV


Vamos ver como mudar o nome do VG e do LV:

# Renomear o VG:
root:\# vgrename vgtest vgtest-new
Volume group "vgtest" successfully renamed to "vgtest-new"


# Renomear o LV:
root:\# lvrename /dev/vgtest-new/lvtest /dev/vgtest-new/lvtest-new
Renamed "lvtest" to "lvtest-new" in volume group "vgtest-new"

Ainda é possível remover com vgremove e lvremove.



Snapshot com LVM


Primeiro crie arquivos dentro do LV, faça o snapshot, apague os arquivos e por fim volte o snapshot.

# monte o LV:
root:\# mount /dev/vgtest-new/lvtest-new /mnt/

# Crie os arquivos:
root:\# mkdir /mnt/lvt{1..10}

root:\# touch /mnt/arquivo-{a..z}{1..10}

# Veja os arquivos:
root:\# ls /mnt/
arquivo-a1 arquivo-c1 arquivo-e1 arquivo-g1 arquivo-i1 arquivo-k1 arquivo-m1 arquivo-o1 arquivo-q1 arquivo-s1 arquivo-u1 arquivo-w1 arquivo-y1 lost+found
arquivo-a10 arquivo-c10 arquivo-e10 arquivo-g10 arquivo-i10 arquivo-k10 arquivo-m10 arquivo-o10 arquivo-q10 arquivo-s10 arquivo-u10 arquivo-w10 arquivo-y10 lvt1
arquivo-a2 arquivo-c2 arquivo-e2 arquivo-g2 arquivo-i2 arquivo-k2 arquivo-m2 arquivo-o2 arquivo-q2 arquivo-s2 arquivo-u2 arquivo-w2 arquivo-y2 lvt10
arquivo-a3 arquivo-c3 arquivo-e3 arquivo-g3 arquivo-i3 arquivo-k3 arquivo-m3 arquivo-o3 arquivo-q3 arquivo-s3 arquivo-u3 arquivo-w3 arquivo-y3 lvt2
arquivo-a4 arquivo-c4 arquivo-e4 arquivo-g4 arquivo-i4 arquivo-k4 arquivo-m4 arquivo-o4 arquivo-q4 arquivo-s4 arquivo-u4 arquivo-w4 arquivo-y4 lvt3
arquivo-a5 arquivo-c5 arquivo-e5 arquivo-g5 arquivo-i5 arquivo-k5 arquivo-m5 arquivo-o5 arquivo-q5 arquivo-s5 arquivo-u5 arquivo-w5 arquivo-y5 lvt4
arquivo-a6 arquivo-c6 arquivo-e6 arquivo-g6 arquivo-i6 arquivo-k6 arquivo-m6 arquivo-o6 arquivo-q6 arquivo-s6 arquivo-u6 arquivo-w6 arquivo-y6 lvt5
arquivo-a7 arquivo-c7 arquivo-e7 arquivo-g7 arquivo-i7 arquivo-k7 arquivo-m7 arquivo-o7 arquivo-q7 arquivo-s7 arquivo-u7 arquivo-w7 arquivo-y7 lvt6
arquivo-a8 arquivo-c8 arquivo-e8 arquivo-g8 arquivo-i8 arquivo-k8 arquivo-m8 arquivo-o8 arquivo-q8 arquivo-s8 arquivo-u8 arquivo-w8 arquivo-y8 lvt7
arquivo-a9 arquivo-c9 arquivo-e9 arquivo-g9 arquivo-i9 arquivo-k9 arquivo-m9 arquivo-o9 arquivo-q9 arquivo-s9 arquivo-u9 arquivo-w9 arquivo-y9 lvt8
arquivo-b1 arquivo-d1 arquivo-f1 arquivo-h1 arquivo-j1 arquivo-l1 arquivo-n1 arquivo-p1 arquivo-r1 arquivo-t1 arquivo-v1 arquivo-x1 arquivo-z1 lvt9
arquivo-b10 arquivo-d10 arquivo-f10 arquivo-h10 arquivo-j10 arquivo-l10 arquivo-n10 arquivo-p10 arquivo-r10 arquivo-t10 arquivo-v10 arquivo-x10 arquivo-z10
arquivo-b2 arquivo-d2 arquivo-f2 arquivo-h2 arquivo-j2 arquivo-l2 arquivo-n2 arquivo-p2 arquivo-r2 arquivo-t2 arquivo-v2 arquivo-x2 arquivo-z2
arquivo-b3 arquivo-d3 arquivo-f3 arquivo-h3 arquivo-j3 arquivo-l3 arquivo-n3 arquivo-p3 arquivo-r3 arquivo-t3 arquivo-v3 arquivo-x3 arquivo-z3
arquivo-b4 arquivo-d4 arquivo-f4 arquivo-h4 arquivo-j4 arquivo-l4 arquivo-n4 arquivo-p4 arquivo-r4 arquivo-t4 arquivo-v4 arquivo-x4 arquivo-z4
arquivo-b5 arquivo-d5 arquivo-f5 arquivo-h5 arquivo-j5 arquivo-l5 arquivo-n5 arquivo-p5 arquivo-r5 arquivo-t5 arquivo-v5 arquivo-x5 arquivo-z5
arquivo-b6 arquivo-d6 arquivo-f6 arquivo-h6 arquivo-j6 arquivo-l6 arquivo-n6 arquivo-p6 arquivo-r6 arquivo-t6 arquivo-v6 arquivo-x6 arquivo-z6
arquivo-b7 arquivo-d7 arquivo-f7 arquivo-h7 arquivo-j7 arquivo-l7 arquivo-n7 arquivo-p7 arquivo-r7 arquivo-t7 arquivo-v7 arquivo-x7 arquivo-z7
arquivo-b8 arquivo-d8 arquivo-f8 arquivo-h8 arquivo-j8 arquivo-l8 arquivo-n8 arquivo-p8 arquivo-r8 arquivo-t8 arquivo-v8 arquivo-x8 arquivo-z8
arquivo-b9 arquivo-d9 arquivo-f9 arquivo-h9 arquivo-j9 arquivo-l9 arquivo-n9 arquivo-p9 arquivo-r9 arquivo-t9 arquivo-v9 arquivo-x9 arquivo-z9

Agora faça o snapshot:

root:\# lvcreate -L 0.1G -s -n snap-lvtest-new /dev/vgtest-new/lvtest-new
Rounding up size to full physical extent 104.00 MiB
Logical volume "snap-lvtest-new" created.

# -s = Snapshot;
# -n = Nome;

O snapshot tem que ter entre 10% até 20% do tamanho do LV para o snpashot, usei 20%.


Monte o novo volume com o snapshot e verifique:

# Montando:
root:\# mount /dev/vgtest-new/snap-lvtest-new /media/

# Verificando:
root:\# ls /media/
arquivo-a1 arquivo-c1 arquivo-e1 arquivo-g1 arquivo-i1 arquivo-k1 arquivo-m1 arquivo-o1 arquivo-q1 arquivo-s1 arquivo-u1 arquivo-w1 arquivo-y1 lost+found
arquivo-a10 arquivo-c10 arquivo-e10 arquivo-g10 arquivo-i10 arquivo-k10 arquivo-m10 arquivo-o10 arquivo-q10 arquivo-s10 arquivo-u10 arquivo-w10 arquivo-y10 lvt1
arquivo-a2 arquivo-c2 arquivo-e2 arquivo-g2 arquivo-i2 arquivo-k2 arquivo-m2 arquivo-o2 arquivo-q2 arquivo-s2 arquivo-u2 arquivo-w2 arquivo-y2 lvt10
arquivo-a3 arquivo-c3 arquivo-e3 arquivo-g3 arquivo-i3 arquivo-k3 arquivo-m3 arquivo-o3 arquivo-q3 arquivo-s3 arquivo-u3 arquivo-w3 arquivo-y3 lvt2
arquivo-a4 arquivo-c4 arquivo-e4 arquivo-g4 arquivo-i4 arquivo-k4 arquivo-m4 arquivo-o4 arquivo-q4 arquivo-s4 arquivo-u4 arquivo-w4 arquivo-y4 lvt3
arquivo-a5 arquivo-c5 arquivo-e5 arquivo-g5 arquivo-i5 arquivo-k5 arquivo-m5 arquivo-o5 arquivo-q5 arquivo-s5 arquivo-u5 arquivo-w5 arquivo-y5 lvt4
arquivo-a6 arquivo-c6 arquivo-e6 arquivo-g6 arquivo-i6 arquivo-k6 arquivo-m6 arquivo-o6 arquivo-q6 arquivo-s6 arquivo-u6 arquivo-w6 arquivo-y6 lvt5
arquivo-a7 arquivo-c7 arquivo-e7 arquivo-g7 arquivo-i7 arquivo-k7 arquivo-m7 arquivo-o7 arquivo-q7 arquivo-s7 arquivo-u7 arquivo-w7 arquivo-y7 lvt6
arquivo-a8 arquivo-c8 arquivo-e8 arquivo-g8 arquivo-i8 arquivo-k8 arquivo-m8 arquivo-o8 arquivo-q8 arquivo-s8 arquivo-u8 arquivo-w8 arquivo-y8 lvt7
arquivo-a9 arquivo-c9 arquivo-e9 arquivo-g9 arquivo-i9 arquivo-k9 arquivo-m9 arquivo-o9 arquivo-q9 arquivo-s9 arquivo-u9 arquivo-w9 arquivo-y9 lvt8
arquivo-b1 arquivo-d1 arquivo-f1 arquivo-h1 arquivo-j1 arquivo-l1 arquivo-n1 arquivo-p1 arquivo-r1 arquivo-t1 arquivo-v1 arquivo-x1 arquivo-z1 lvt9
arquivo-b10 arquivo-d10 arquivo-f10 arquivo-h10 arquivo-j10 arquivo-l10 arquivo-n10 arquivo-p10 arquivo-r10 arquivo-t10 arquivo-v10 arquivo-x10 arquivo-z10
arquivo-b2 arquivo-d2 arquivo-f2 arquivo-h2 arquivo-j2 arquivo-l2 arquivo-n2 arquivo-p2 arquivo-r2 arquivo-t2 arquivo-v2 arquivo-x2 arquivo-z2
arquivo-b3 arquivo-d3 arquivo-f3 arquivo-h3 arquivo-j3 arquivo-l3 arquivo-n3 arquivo-p3 arquivo-r3 arquivo-t3 arquivo-v3 arquivo-x3 arquivo-z3
arquivo-b4 arquivo-d4 arquivo-f4 arquivo-h4 arquivo-j4 arquivo-l4 arquivo-n4 arquivo-p4 arquivo-r4 arquivo-t4 arquivo-v4 arquivo-x4 arquivo-z4
arquivo-b5 arquivo-d5 arquivo-f5 arquivo-h5 arquivo-j5 arquivo-l5 arquivo-n5 arquivo-p5 arquivo-r5 arquivo-t5 arquivo-v5 arquivo-x5 arquivo-z5
arquivo-b6 arquivo-d6 arquivo-f6 arquivo-h6 arquivo-j6 arquivo-l6 arquivo-n6 arquivo-p6 arquivo-r6 arquivo-t6 arquivo-v6 arquivo-x6 arquivo-z6
arquivo-b7 arquivo-d7 arquivo-f7 arquivo-h7 arquivo-j7 arquivo-l7 arquivo-n7 arquivo-p7 arquivo-r7 arquivo-t7 arquivo-v7 arquivo-x7 arquivo-z7
arquivo-b8 arquivo-d8 arquivo-f8 arquivo-h8 arquivo-j8 arquivo-l8 arquivo-n8 arquivo-p8 arquivo-r8 arquivo-t8 arquivo-v8 arquivo-x8 arquivo-z8
arquivo-b9 arquivo-d9 arquivo-f9 arquivo-h9 arquivo-j9 arquivo-l9 arquivo-n9 arquivo-p9 arquivo-r9 arquivo-t9 arquivo-v9 arquivo-x9 arquivo-z9