LVM dicas rápidas

1. LVM

LVM significa “Logic Volume Manager”, em português “Gerenciador de volume lógico”, ele gerencia discos e dispositivos de armazenamento em massa. No LVM um volume é o equivalente a uma partição de um disco.

1.1 Usos do LVM

O LVM é muito utilizado em servidores linux por oferecer uma capacidade de ajuste dinâmico de seus volumes.

Se você por exemplo que refazer o desenho de partições de um disco, no método tradicional você precisaria fazer backup dos dados, apagar as partições, criar um novo layout de partições, formatar as partições, reinstalar o sistema operacional e depois ainda fazer o restore dos dados, algo chato e demorado.

Se você utilizar LVM estará administrando seu armazenamento em uma camada de abstração, você trabalhará com volumes físicos (PV), grupos de volumes (VG) e volumes lógicos (LV), guarde esses nomes.

Quando você cria uma partição do disco destinada a uso via LVM esta partição será um PV (Physical Volume), e fará parte de algum VG (Volume Group), já os LV são ‘fatias’ de algum VG.

Um VG pode ser criado com um ou mais PVs e o LVM lhe permite adicionar outros PVs a um VG para aumentar a capacidade de armazenamento quando for necessário.

Imagine um VG como se fosse um grande dispositivo de armazenamento composto por vários PVs, a capacidade total de armazenamento de um VG é a soma da capacidade dos PVs associados a ele.

LVs (Logical Volumes) são fatias do seu VG (volume group), imagine que você tem um VG com capacidade de 100 GB, você pode ter 10 LVs de 10GB ou dois LVs de 50GB, isso é configurável, para o sistema operacional linux, um LV equivale a uma partição de um disco, pode ser formatada e montada da mesma forma que uma partição de um disco comum.

A grande vantagem do LVM é que você pode redimensionar VGs e LVs, aumentando ou diminuindo seu tamanho, e se estiver utilizando um sistema de arquivos que suporte resize, algo como ext3 ou ext4, poderá também aumentar e diminuir o sistema de arquivos sem precisar reconstruir todas as partições e reinstalar seu ambiente.

1.2 Vantagens

Se o seu /var está quase cheio, e se você estiver utilizando LVM, bastará adicionar um novo PV (Physical Volume) ao VG (Volume Group) que possui o LV (Logical Volume) utilizado para o o ponto de montagem /VAR, após aumentar a capacidade do VG, você poderá com poucos comandos - em poucos minutos - aumentar o tamanho do /var sem grandes impactos em seu ambiente.

Especificamente para aumentar ou diminuir o /var, será necessário parar a máquina, mas dependendo da partição não será preciso.

Você pode também diminuir um LV que não esteja usando muito espaço para aumentar outro que esteja precisando de espaço, desde que estejam no mesmo VG.

O LVM torna a administração de partições algo muito flexível.

1.3 Desvantagens

Um VG é composto por PVs, se um PV quebrar você perde o VG e os LVs, isso pode ser um grande problema, portanto, é importante ter confiança nos discos envolvidos em um ambiente LVM.

Se possível é interessante utilizar RAID para poder perder um ou mais discos de um LVM sem perder seu VG inteiro.

Há quem diga também que por ser uma camada a mais em seu ambiente, haverá perda de performance em relação a gravação e leitura em um PV, contudo, acho que isso é imperceptível na grande maioria dos ambientes.

Normalmente o LVM versão 2 já vem instalado na maioria das distribuições linux, em Debian e CentOS está disponível desde a instalação.

2. Mão na massa

Vamos aprender a trabalhar com LVM, no estilo dicas rápidas.

2.1 Criando partição LVM

Vamos particionar o disco sdb como exemplo

fdisk /dev/sdb

Acesse a ajuda

Command (m for help): m

Acompanhe a saída

Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Vamos criar uma nova partição

Command (m for help): n

Escolha o tipo de partição

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended

Eu escolhi primária, as quatro primeiras partições de um disco podem ser primárias, se você pretende ter mais de quatro partições, crie 3 primárias e uma extendida.

Select (default p): p

Esta será a primeira partição

Partition number (1-4, default 1): 1

Agora o fdisk me pergunta em qual setor essa partição deve começar e depois ele também pergunta o tamanho, eu vou dar ENTER e depois ENTER para usar todo o disco a partir do primeiro setor.

First sector (2048-125829119, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-125829119, default 125829119):
Using default value 125829119

Agora vou imprimir as partições

Command (m for help): p

Acompanhe a saída

Disk /dev/sdb: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders, total 125829120 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
Disk identifier: 0xe61fc21b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   125829119    62913536   83  Linux

Veja que uma partição foi criada, agora vamos definir o tipo da partição, veja os tipos disponíveis

command (m for help): l

Acompanhe a saída

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware aMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1 80  Old Minix

Agora vamos definir o tipo da partição

Command (m for help): t

Escolha LVM (tipo 8e)

Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Vamos imprimir novamente a tabela de partições do disco

command (m for help): p

Acompanhe a saída

Disk /dev/sdb: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders, total 125829120 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
Disk identifier: 0xe61fc21b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   125829119    62913536   8e  Linux LVM

Ótimo, tudo certo, agora vamos gravar essa configuração no disco

Command (m for help): w

Acompanhe a saída

The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Agora já podemos sair do fdisk

Command (m for help): q

Pronto, para ter certeza que está tudo certo rode o comando abaixo

fdisk -l /dev/sdb

Acompanhe a saída

Disk /dev/sdb: 64.4 GB, 64424509440 bytes
128 heads, 39 sectors/track, 25206 cylinders, total 125829120 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
Disk identifier: 0xe61fc21b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   125829119    62913536   8e  Linux LVM

Veja que a partição sdb1 foi criada corretamente

2.2 Criando PV

Agora que já temos uma partição LVM, podemos criar um volume físico (PV)

pvcreate /dev/sdb1

Vamos checar os PVs

pvscan

Veja detalhes dos PVs

pvdisplay

Acompanhe a saída

"/dev/sdb1" is a new physical volume of "60.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               60.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               KtmCte-RHtK-XgTi-rLnd-qGL0-0OZe-8KHm4b

Beleza, agora podemos criar um VG

2.3 Criando VG

Depois de criar os volumes físicos, podemos criar os grupos de volume

vgcreate fileserver /dev/sdb1

Verifique os VGs existentes

vgscan

Veja detalhes dos VGs

vgdisplay

Acompanhe a saída

--- Volume group ---
  VG Name               fileserver
  System ID
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               60.00 GiB
  PE Size               4.00 MiB
  Total PE              15359
  Alloc PE / Size       0 / 0
  Free  PE / Size       15359 / 60.00 GiB
  VG UUID               JYkvTQ-hZ3R-Mib0-tIzm-CXmr-7NWH-UPu8UT

2.4 Adicionando PV a VG

Se você quer expandir o seu VG adicionando outra partição use o comando abaixo

vgextend fileserver /dev/sdc1

2.5 Criando LV

Agora que temos um grupo de volumes, vamos criar um volume lógico

lvcreate --name public --size 40G fileserver

Verique os LVs

lvscan

Veja detalhes dos LVs

lvdisplay

Acompanhe a saída

  --- Logical volume ---
  LV Path                /dev/fileserver/fileserver-public
  LV Name                public
  VG Name                fileserver
  LV UUID                Qn8u3P-Olgx-whQE-eLPn-OiaH-eguo-jfM8Vg
  LV Write Access        read/write
  LV Creation host, time debian64, 2013-05-16 11:51:59 -0300
  LV Status              available
  # open                 1
  LV Size                40.00 GiB
  Current LE             39424
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2

2.6 Formatando a partição

Depois de criar o LV já podemos formatá-lo

mkfs.ext4 /dev/mapper/fileserver-public

2.7 Montando a partição

mkdir /srv/public
mount /dev/mapper/fileserver-public /srv/public   

2.8 Configurando fstab

Verifique o identificador único das partições

blkid /dev/sdb1

Acompanhe a saída

/dev/mapper/fileserver-public: UUID="811782cc-ddc3-43ca-8ba8-f67efa80f229" TYPE="ext4"     

No fstab insira a seguinte linha

UUID=811782cc-ddc3-43ca-8ba8-f67efa80f229 /srv/public               ext4    defaults 0       1

2.9 Aumentando LV (ext4)

Desmonte a partição

umount /srv/public

Vamos estender o volume lógico adicionando mais 114 GB ao LV

lvextend -L +114GB /dev/mapper/fileserver-public

Acompanhe a saída

Extending logical volume fileserver to 154.00 GiB
Logical volume mirrordata successfully resized 

E depois vamos passar o e2fsck para o verificar o LV

e2fsck -f /dev/mapper/fileserver-public 

Agora vamos aumentar a partição ext4

resize2fs -p /dev/mapper/fileserver-public

Rode novamente o e2fsck para checar a partição que fora estendida

e2fsck -f /dev/mapper/fileserver-public

Monte a nova partição

mount /srv/public

Pronto, partição estendida.

2.10 Diminuindo LV (ext4)

Desmonte o filesystem

umount /srv/public

Antes de prosseguir verifique a partição

e2fsck -f /dev/mapper/fileserver-public

Diminua o LV em 40GB

resize2fs -p /dev/mapper/fileserver-public 40G

Diminua a partição ext4 em 40 gigas

lvreduce -L 40G /dev/mapper/fileserver-public

Verifique a partição

e2fsck -f /dev/mapper/fileserver-public

Rode mais uma vez o o resize para se certificar que partição vai ficar do mesmo tamanho do LV

resize2fs -p /dev/mapper/fileserver-public

Verifique a partição

e2fsck -f /dev/mapper/fileserver-public

Monte a partição

mount /srv/public

Pronto.

3. Referências