LVM no Linux

Introdução

LVM significa Logical Volume Manager. Como o nome diz, essa ferramenta é capaz de gerenciar os chamados volumes lógicos, substituindo assim as tradicionais partições nos discos. Ao longo do tempo, várias empresas fizeram suas implementações de LVM e o Linux não ficou para trás: ele também possui uma implementação (e muito boa) de LVM, que na época da escrita deste documento está na versão 2.

Utilizar volumes lógicos ao invés do esquema de particionamento comum traz algumas boas vantagens. Mas antes de saber destas vantagens, precisamos saber o que são esses tais volumes lógicos. Um volume lógico é nada mais nada menos que uma representação virtuais de pedaços de um dispositivo fixo. Enquanto as partições definem estes pedaços “cruamente”, o volume lógico permite flexibilidade na hora de definir quem são esses pedaços. Por exemplo, um volume lógico pode ter seu espaço dividido em 3 ou mais HDs, mas para o sistema operacional vai parecer como se fosse apenas um dispositivo. Sendo assim começa a ficar clara as vantagens, não?

Vantagens e talvez desvantagens

Vamos supor que eu tenha comprado um HD de 60GB. Quando eu instalei o meu Linux, particionei ele da seguinte forma:

Partição Tamanho
/boot 666MB
/ 10GB
/home 49GB

Deixei 49GB para os arquivos de meu usuário (/home). Mas suponha que eu enchi esta partição com filmes pirateados. Em um cenário normal, eu teria que reformatar e refazer as partições para colocar mais espaço no /home, ou comprar um novo HD maior e refazer tudo, depois copiando os dados. Isso não seria legal, né? Com o LVM, é possível você fazer isso de forma totalmente transparente para o sistema operacional: isso quer dizer que você pode redimensionar estas partições, ou pode adicionar um espaço de um novo HD em um volume lógico já criado.

Outra vantagem é a criação dos chamados LVM Snapshots, que falarei mais à frente neste artigo. Basicamente um snapshot é uma “parada no tempo” que você faz no volume lógico. Quando você o faz, o LVM faz uma cópia exata do volume lógico, congelado na hora que você pediu. Com isso você pode usar o volume lógico para testes, backups e outros fins, sem modificar o original, que continuará trabalhando normalmente.

O LVM acaba por também executar alguns conceitos de RAID. Ao você indicar, por exemplo, 2 HDs para funcionar como apenas um volume lógico, o LVM caso esteja trabalhando de uma certa forma, estará dividindo os dados entre os HDs, aumentando a velocidade. Esse é o conceito do RAID0.

Talvez duas das únicas desvantagens que poderíamos levantar sobre o LVM seriam a dificuldade que as pessoas tem em se adaptar à este novo modelo (sempre a resistência a mudanças) e uma forma de pensar em como montar o LVM sem comprometer a segurança dos dados caso um HD falhe. Por exemplo, se um volume lógico conter 3 HDs, e um deles falhar, pode ser que este volume lógico fique corrompido. Para situações mais complexas como esta, geralmente se usa um conjunto de técnicas de RAID e LVM.

Tanto para servidores de grande porte, com muito espaço e uso de disco, quanto para as nossas máquinas caseiras do dia-a-dia, o LVM é uma ferramenta bastante útil. É por isso que conhecer a ferramenta é importante e é por isto que estamos aqui 😉

DICA: Se você quer brincar com fogo e não se queimar (leia-se: se você quer ficar mexendo com LVM sem precisar estragar todos os seus HDs), há um tutorial na Página do Eitch chamado Partições em Arquivos que pode ser muito útil para você. Recomendo a leitura se você não quiser se arriscar muito. É fácil e rápido e depois é só substituir os HDs aqui pelos arquivos.

Instalando

Atualmente todas as versões mais atuais do kernel 2.6 já vêm com o LVM e suas ferramentas inclusas. A maioria das distribuições de Linux também incluem os pacotes necessários para o funcionamento do mesmo. Ou seja, na grande maioria dos casos, seu sistema deverá estar pronto para utilizar o LVM. Por este motivo não vou me extender sobre isso.

Neste artigo trabalhamos apenas com o LVM2.

Caso seu sistema for muito antigo e não possuir estas funcionalidades, você terá que obter o código-fonte do LVM, compilá-lo junto ao seu kernel e fazer todo o trabalho adicional. Basicamente você precisará compilar e instalar o device-mapper e o lvm2. Acesse os seguintes endereços para fazê-lo:

As próprias páginas têm respectivas instruções de construção.

Colocando o LVM em ação

Para começar a usar o LVM, você precisará escolher quais dispositivos (partições) deseja usar com o LVM. Então o primeiro passo é preparar os dispositivos físicos através do utilitário fdisk. Neste documento iremos usar 3 HDs: /dev/sdb, /dev/sdc, /dev/sdd, cada um com 2GB de espaço cada. Para criar as partições prontas para trabalhar com o LVM, utilize o fdisk e crie partições do tipo 8e (Linux LVM). Veja o exemplo abaixo da criação da primeira partição em /dev/sdb:

# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0cad2d95

Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): 261

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

Command (m for help): p

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0cad2d95

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         261     2096451   8e  Linux LVM

Command (m for help): w
The partition table has been altered!

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

No bloco acima eu executei o fdisk no HD /dev/sdb e criei uma partição utilizando todos os cilindros (tamanho máximo – 2GB), e configurando o tipo de partição para 8e, gerando então uma partição Linux LVM. Eu repeti o mesmo processo no HD /dev/sdc, enquanto que no /dev/sdd eu criei uma partição de aproximadamente 800MB.

Agora que preparamos as partições para serem usadas pelo LVM, está na hora de colocá-las em ação! As ferramentas do LVM podem ser usadas de duas maneiras: através de um prompt geral do lvm ou através de comandos na shell do sistema. Aqui neste documento estarei utilizando o prompt geral, que pode ser executado através do comando:

# lvm

Com este comando você cairá em um prompt “lvm>”. Dentro deste prompt você pode utilizar o comando help e todos os outros comandos que o LVM possui.

LVM e os dispositivos físicos

Vamos começar adicionando ao LVM as três partições que criamos anteriormente com o fdisk. Para adicionar dispositivos físicos no LVM, utilizamos o comando pvcreate, por exemplo:

lvm> pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdd1" successfully created

Agora as três partições estão disponíveis para alocarmos como quisermos no LVM. Caso você queira listar todos os dispositivos físicos atualmente registrados no LVM, utilize os comandos pvs e/ou pvdisplay. Você também pode remover um dispositivo do LVM com o comando pvremove se quiser.

Vamos ver como os nossos dispositivos físicos ficaram:

lvm> pvdisplay
--- NEW Physical volume ---
PV Name               /dev/sdb1
VG Name
PV Size               2.00 GB
Allocatable           NO
PE Size (KByte)       0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               X49M4Q-l9jl-u93u-17yF-kF8a-gusv-6z6267

--- NEW Physical volume ---
PV Name               /dev/sdc1
VG Name
PV Size               2.00 GB
Allocatable           NO
PE Size (KByte)       0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               Rw3RyW-emUx-OYeJ-58eo-XOG0-ctWu-obtDOE

--- NEW Physical volume ---
PV Name               /dev/sdd1
VG Name
PV Size               784.39 MB
Allocatable           NO
PE Size (KByte)       0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               WGCxed-i30s-IuJ4-sgc5-CVJo-lL13-uU9DoI

Grupos de Volumes

Uma vez em que os dispositivos físicos já estejam preparados para serem utilizados no LVM, está na hora de começar a criar grupos de volumes. Um grupo de volume nada mais é que a especificação de qual fatia do dispositivo físico será utilizada nos volumes lógicos.

No nosso exemplo aqui, temos 3 dispositivos físicos, certo? Supomos que eu queira criar dois grupos de volumes: O primeiro e o segundo dispositivos físicos serão o Grupo 1 e o terceiro dispositivo será o Grupo 2. Quando eu for criar os volumes lógicos no Grupo 1, os dados estarão nos HDs 1 e 2, enquanto que os volumes do Grupo 2 estarão no HD 3. Desta forma você pode escolher e planejar quais partições vão ficar em quais HDs.

Indo para a prática, vamos fazer o que eu disse acima. O comando para criar um grupo de volume é o vgcreate:

lvm> vgcreate Grupo01 /dev/sdb1 /dev/sdc1
Volume group "Grupo01" successfully created
lvm> vgcreate Grupo02 /dev/sdd1
Volume group "Grupo02" successfully created

Agora vamos verificar o que foi feito através do comando vgdisplay:

lvm> vgdisplay
--- Volume group ---
VG Name               Grupo02
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               784.00 MB
PE Size               4.00 MB
Total PE              196
Alloc PE / Size       0 / 0
Free  PE / Size       196 / 784.00 MB
VG UUID               GNHWKf-HQ65-DJzn-cU0S-2B8a-F0jm-oQOr9g

--- Volume group ---
VG Name               Grupo01
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               3.99 GB
PE Size               4.00 MB
Total PE              1022
Alloc PE / Size       0 / 0
Free  PE / Size       1022 / 3.99 GB
VG UUID               XK7VwK-uxVI-XSF0-vNak-S4le-jU2K-sgXXNn

Veja que acima, podemos ver que os dois grupos foram criados exatamente da forma que a gente queria: O Grupo 01 tem um tamanho de 4GB (ou 1022 Physical Extends), ou seja, os dois HDs de 2GB juntos. O Grupo 02 tem um tamanho de 784MB (ou 196 Physical Extends), o que corresponde ao terceiro HD.

Mas antes de prosseguir, que tal se perguntar o que é esse tal de Physical Extend (PE)? Pense no PE como um tijolo da construção de uma casa. Este tijolo tem um tamanho fixo (que no nosso caso é 4MB) e para construir toda a casa, são necessários uma quantidade de tijolos que iguale o tamanho total da casa, que é 4GB. Para chegar nesse espaço, precisa-se de 1022 tijolos, pois 1022 x 4MB = ~2GB. Em um grupo de volume, o tamanho do PE é sempre igual para todos os PEs dentro do grupo, então seu tamanho precisa ser um múltiplo desse tamanho.

Um PE é uma parte do HD que quando alocado em um grupo de volume, fica disponível para mapear em um volume lógico. Desta forma, um volume lógico pode conter vários PEs de diversos dispositivos físicos diferentes alocados em LEs (Logical Extends) de um único volume lógico. Essa distribuição é que dá flexibilidade ao LVM e permite ele fazer as técnicas de RAID. Isso poderá ficar mais claro quando começarmos a criar os volumes lógicos.

No comando vgdisplay mostrado acima, você pode observar três linhas que contém definições do Physical Extend (PE): Total PE,Alloc PE / Size e Free PE / Size. O Total PE diz quantos PEs foram alocados no total para o grupo de volume: este é o total que poderá ser utilizados nos volumes lógicos que você irá criar. O Alloc PE / Size é a quantidade (e tamanho) de PEs que já estão alocados em volumes lógicos: como não criamos nenhum ainda, nenhum está alocado no exemplo acima. Já o FreePE / Size contém a quantidade (e tamanho) de PEs livres para criar volumes lógicos: como não criamos nenhum ainda, todos os PEs estão livres no exemplo acima.

Uma última nota sobre os PEs: o tamanho padrão de um PE ao criar um grupo de volume é de 4MB. Este número, caso você queira, pode ser alterado em uma faixa que vai de 8K a 16GB. Na hora de criar um Grupo de Volume, utilize o parâmetro -s para especificar o tamanho do PE. Por exemplo: vgcreate -s 64M Grupo03 /dev/sde1 – Isso irá criar o Group03 com o tamanho dos PEs sendo 64MB. Quanto maior o tamanho, melhor o desempenho e pior a flexibilidade do LVM (pois os tamanhos dos volumes lógicos têm de ser todos múltiplos do tamanho do PE e isso pode acarretar em desperdício de espaço). Neste exemplo continuaremos utilizando o tamanho de 4MB.

Volumes Lógicos

Preparados os Grupos de Volume, vamos agora criar os famosos volumes lógicos de que falamos tanto. Para ficar mais fácil o entendimento, considere o volume lógico como o equivalente a uma partição comum, pois é assim que o sistema irá ver este volume lógico: você poderá montar, desmontar, formatar, entre outros.

Como expliquei anteriormente, criar um volume lógico significa mapear os Physical Extends em Logical Extends, distribuindo assim o acesso entre os HDs do Grupo de Volume e criando um volume lógico “virtual”. Neste exemplo iremos criar 3 volumes lógicos em 2 grupos de volume. No Grupo01 iremos criar um volume chamado Grupo01-raiz, ao qual montaremos na raiz, e outro volume chamado Grupo01-home, ao qual montaremos no diretório /home. No Grupo02 iremos criar apenas um volume, chamado Grupo02-log, que montará em /var/log.

Para criar os volumes lógicos, o comando lvcreate é utilizado (já reparou como os nomes dos comandos são intuitivos? :). Os seguintes parâmetros podem (e devem ser usados) na hora de criar um volume lógico simples:

  • -l : Especifica a quantidade de PEs que serão mapeados como LEs, formando assim o tamanho do volume lógico.
  • -L : Alternativa ao parâmetro -l. Ao invés de você especificar a quantidade de PEs (e por consequencia ter que calcular o tamanho certo do volume), você pode especificar aqui apenas o tamanho da partição e ele já fará a conta para você.
  • -n : O nome do volume lógico, que estará sempre listado no LVM. Opcional, mas para efeito de organização tente sempre colocar um nome intuitivo. Se você não colocar esta opção o LVM vai utilizar um nome aleatório para você.

Há outras opções úteis como a -i (striping) e -m (mirroring), mas por enquanto não falaremos sobre isso se não as coisas complicam mais.

Chega de conversa! Vamos criar os volumes lógicos agora mesmo:

lvm> lvcreate -L 1G -n Grupo01-raiz Grupo01
Logical volume "Grupo01-raiz" created
lvm> lvcreate -L 3G -n Grupo01-home Grupo01
Insufficient free extents (766) in volume group Grupo01: 768 required
lvm> lvcreate -l 766 -n Grupo01-home Grupo01
Logical volume "Grupo01-home" created
lvm> lvcreate -l 196 -n Grupo02-log Grupo02
Logical volume "Grupo02-log" created

Vejamos o que eu fiz:

  1. Criei um volume lógico chamado (-n) Grupo01-raiz, dentro do Grupo01 (obviamente), com o tamanho (-L) de 1GB;
  2. Eu tentei criei um volume lógico chamado (-n) Grupo01-home com o tamanho (-L) de 3GB. O LVM converteu esses 3GB para a quantidade de PEs e não deu muito certo: a conversão resultou em 768 PEs e só tinha 766 livres, 8MB de diferença. Esta é a desvantagem de utilizar o -L ao invés do -l: você pode não encontrar muita exatidão;
  3. Corrigi o segundo substituindo o tamanho pela quantidade (-l) de 766 PEs. Dessa vez criou com sucesso;
  4. Por último criei um volume lógico chamado (-n) Grupo02-log com o tamanho de 196 PEs (o total que o comando gdisplay havia me informado anteriormente, ou seja, 784MB).

Agora vamos usar o comando lvdisplay para obter detalhes de nossos recém-criados volumes lógicos:

lvm> lvdisplay
--- Logical volume ---
LV Name                /dev/Grupo02/Grupo02-log
VG Name                Grupo02
LV UUID                epfsvr-h75Q-7I3L-zl6H-5GLO-2YpH-eH2rVN
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                784.00 MB
Current LE             196
Segments               1
Allocation             inherit
Read ahead sectors     0
Block device           253:4

--- Logical volume ---
LV Name                /dev/Grupo01/Grupo01-raiz
VG Name                Grupo01
LV UUID                2wh0eH-im2b-7lZY-UjoL-yQG1-Pz5A-I16erM
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                1.00 GB
Current LE             256
Segments               1
Allocation             inherit
Read ahead sectors     0
Block device           253:2

--- Logical volume ---
LV Name                /dev/Grupo01/Grupo01-home
VG Name                Grupo01
LV UUID                d1f9vO-4pkY-T29d-c0T1-M2Bd-x3BR-2ZOvOg
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                2.99 GB
Current LE             766
Segments               2
Allocation             inherit
Read ahead sectors     0
Block device           253:3

Prontinho, analizando a saída acima, dá pra ver que criamos com sucesso nossos 3 volumes lógicos e agora eles estão prontos para serem usados transparentemente pelo sistema. A única coisa que você precisa saber agora é que, no sistema, ao invés de você utilizar os dispositivos físicos (/dev/sdb1, /dev/sdc1, etc) você utilizará o que está escrito no campo LV Name, ou seja, /dev/Grupo01/Grupo01-raiz, /dev/Grupo01/Grupo01-home e /dev/Grupo02/Grupo02-log. Que tal uns exemplos?

Utilizando os volumes lógicos no sistema

Ok, acabei de criar os volumes lógicos, o que eu posso fazer com eles agora?

Vamos pegar como exemplo o volume lógico /dev/Grupo02/Grupo02-log. Antes de montá-lo no lugar correto, você precisa formatar esta “partição”. Faça isso com o comando mkfs.ext3 (caso o sistema de arquivos que você queira seja o ext3 claro):

# mkfs.ext3 /dev/Grupo02/Grupo02-log

Aguarde um pouco e pronto! Agora monte o volume no diretório correto:

# mount /dev/Grupo02/Grupo02-log /var/log

Se quiser também pode até adicionar uma linha no /etc/fstab para montar automaticamente na inicialização!

/dev/Grupo02/Grupo02-log        /var/log               ext3    defaults        1 1

E sim, você pode fazer estes e quaisquer outros comandos que aceitem dispositivos de bloco (p.ex.: partições). Para você isso é transparente, o LVM cuida de todo o resto.

Outras operações possíveis e úteis do LVM

Além de simplesmente criar os volumes lógicos com o LVM, você também pode fazer inúmeras outras operações que são bastante úteis (e essenciais). Uma delas já falamos aqui: redimensionar os volumes lógicos; outras incluem mover volumes, criar snapshots, adicionar novos dispositivos, entre outros. Que tal falarmos um pouco de cada?

Redimensionando volumes lógicos

Suponha que realmente o meu espaço do /home encheu de filmes pirateados. Eu, com preguiça de ficar gravando CDs e DVDs, resolvi comprar um novo HD e queria adicionar esse espaço novo no /home sem ter que refazer todo o particionamento. Se o meu /home estiver em um esquema LVM como o criado através deste documento, eu posso fazer isso sem muita dor de cabeça!

Instalei o novo HD e sei que ele é atualmente o /dev/sde. Agora começo do começo: crio uma nova partição dentro deste HD com o fdisk, coloco esta partição como tipo 8e (Linux LVM), salvo. Depois executo o LVM, adiciono o /dev/sde1 ao LVM com o comando pvcreate e depois utilizo o comando vgextend para adicionar esta nova partição ao meu grupo de volume. Como quero aumentar o /home, os seguintes passos do LVM fazem o que queremos:

lvm> pvcreate /dev/sde1
Physical volume "/dev/sde1" successfully created
lvm> vgextend Grupo01 /dev/sde1
Volume group "Grupo01" successfully extended

lvm> vgdisplay Grupo01
--- Volume group ---
VG Name               Grupo01
System ID
[...]
VG Size               4.47 GB
PE Size               4.00 MB
Total PE              1144
Alloc PE / Size       1022 / 3.99 GB
Free  PE / Size       122 / 488.00 MB
[...]

Quando eu extendi o grupo de volume Grupo01, eu adicionei o espaço que tinha no /dev/sde1 e o LVM tornou disponível os PEs para serem utilizados. Neste exemplo, o /dev/sde1 tem 488MB, então como você pode ver depois no comando vgdisplay Grupo01, o grupo foi modificado, agora há 122 novos PEs, o que corresponde a 488MB. Agora você pode utilizar esses PEs como quiser nos volumes lógicos.

Como queremos aumentar o /home, utilizamos o comando lvresize para redimensionar o volume lógico. Vamos lá:

lvm> lvresize -l +122 /dev/Grupo01/Grupo01-home
Extending logical volume Grupo01-home to 3.47 GB
Logical volume Grupo01-home successfully resized

Simples não? No lvresize, podemos utilizar tanto o -L (por tamanho) quanto o -l (por PE). O sinal de + (ou -) antes do número indica se você quer aumentar ou diminuir a quantidade de PE (ou tamanho). Vamos ver como ficou o nosso volume lógico com o lvdisplay:

--- Logical volume ---
LV Name                /dev/Grupo01/Grupo01-home
VG Name                Grupo01
LV UUID                d1f9vO-4pkY-T29d-c0T1-M2Bd-x3BR-2ZOvOg
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                3.47 GB
Current LE             888
Segments               3
Allocation             inherit
Read ahead sectors     0
Block device           253:3

Sim… Agora ele ao invés de ter 3GB, tem 3.47GB e está utilizando um outro HD 🙂

ATENÇÃO: O processo não acabou por aí. Lembre-se que todo este processo feito no LVM é físico. Dentro deste dispositivo fixo há um sistema de arquivos que também tem que ser tratado. Neste exemplo acima, você terá que fazer o comando “ext2online /dev/Grupo01/grupo01-home” antes de poder utilizar este sistema de arquivos. Lembre-se também que este procedimento deve ser feito enquanto o sistema de arquivos estiver desmontado. Evite corromper seu sistema de arquivos e perder todos os seus dados! Lembrando também que o comando do sistema de arquivos varia, no nosso caso estamos sempre utilizando o ext3.

Para ajudar, lembre-se sempre destes dois passo-a-passos:

Aumentando o tamanho de uma partição LVM:

  1. Desmonte o sistema de arquivos;
  2. Ajuste a partição no LVM, aumentando o seu tamanho com o lvresize ou lvextend para o desejado;
  3. Saia do LVM e redimensione o sistema de arquivos com o comando ext2online ou resize2fs;
  4. Remonte o sistema de arquivos

Diminuindo o tamanho de uma partição LVM:

  1. Desmonte o sistema de arquivos;
  2. Primeiro diminua o tamanho do sistema de arquivos com o comando resize2fs para o desejado;
  3. Entre no LVM e ajuste o tamanho do volume para o configurado no passo anterior;
  4. Remonte o sistema de arquivos

Lembre-se sempre de alterar a ordem! Já vi muita gente corrompendo sistemas de arquivos ao diminuir os seus tamanhos de forma errada.

Migrando dispositivos fixos

Se por acaso se você acha que um de seus HDs está falhando, você pode mover os PEs de um dispositivo fixo para outro através do comando pvmove. Você pode utilizar essa “movimentação” para criar novos grupos de volume caso você não tenha PEs livres ou nenhum HD novo. Seu funcionamento é bem simples:

lvm> pvmove -v

No nosso exemplo, vamos supor que o HD /dev/sdc esteja falhando e precisamos trocá-lo. Podemos colocar um novo HD (/dev/sdf), adicioná-lo ao LVM com o pvcreate, adicioná-lo a grupo do /dev/sdc (Grupo01) e migrar todos os PEs com o comando:

lvm> pvmove -v /dev/sdc1 /dev/sdf1

Depois basta apenas remover o /dev/sdc1 do Volume e LVM. Outra maneira de fazer isso é não espeficicando o destino:

lvm> pvmove -v /dev/sdc1

Neste caso o LVM vai mover todos os PEs que estavam no /dev/sdc1 para qualquer PE livre dentro do volume Grupo01 (lembre-se de que os PEs tem de estar livres). Depois é só remover o /dev/hdc1 do LVM, substituir por um HD novo e integrá-lo ao Grupo novamente.

Exportando e importando volumes entre sistemas

Caso alguma vez você precise mover todo um grupo de volume LVM para outra máquina (por exemplo, se você quer trocar o home de uma máquina para outra), você pode utilizar os comandos vgexport e vgimport para exportar e importar esses grupos de volumes. Vamos, neste exemplo, mover o Grupo02 de uma máquina para outra.

Primeiro tenha certeza de que o sistema não esteja utilizando os volumes. Você pode fazer isso desmontando os diretórios que pertencem ao volume. No nosso caso, o diretório /var/log é utilizado pelo Grupo02, então faço:

# umount /var/log

(Ou umount em todos os dispositivos do grupo – /dev/Grupo02/Grupo02-log)

Agora que o disco não está sendo mais usado pelo sistema, basta entrar no LVM, marcar o volume como inativo e exportá-lo:

lvm> vgchange -a n Grupo02
Volume group "Grupo02" successfully deactivated
lvm> vgexport Grupo02
Volume group "Grupo02" successfully exported

Em seguinda você pode desligar a máquina, tirar o HD e colocar na sua outra máquina.

Agora na outra máquina, com o HD já colocado e logo depois da inicialização do sistema, basta entrar no LVM, pedir para fazer um “scan” nos dispositivos LVM, importar e ativar:

lvm> pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV "/dev/sdb1"  is in EXPORTED VG "Grupo02" [784 MB / 784 MB free]
pvscan -- total: 1 [784 MB] / in use: 1 [784 MB] / in no VG: 0 [0]

lvm> vgimport Grupo02
Volume group "Grupo02" successfully imported

lvm> vgchange -a y Grupo02
Volume group "Grupo02" successfully activated

Depois basta apenas montar e/ou configurar no /etc/fstab para utilizar este novo volume no sistema.

LVM Snapshots – Uma solução de backup

Criar snapshots é uma funcionalidade bastante útil e utilizada do LVM. Um “snapshot” é uma imagem do volume lógico, virtual, onde o LVM pára o tempo do volume, deixando-o intacto para trabalhar enquanto o volume lógico “real” continua trabalhando e sendo modificado. Em outras palavras, quando se faz um LVM Snapshot, o LVM duplica o volume lógico e “congela” a duplicata.

Isto é útil para vários motivos:

  • Você pode efetuar backup em um exato instante sem se preocupar com os dados estarem mudando a cada segundo: ótimo para servidores de bancos de dados que tem seus dados sendo mudados constantemente;
  • Fazer experimentos no conteúdo do volume sem precisar se preocupar em destruir algum dado;
  • Verificar algum acontecimento no sistema de arquivos em alguma hora exata: como por exemplo como estava seus arquivos quando alguém entrou no servidor, ou quando falhou algum serviço;
  • Entre outros, usando a criatividade.

Neste documento vou ilustrar os snapshots com o seu uso mais comum: backups. Aqui irei criar um snapshot da partição dos logs (Grupo02), que são atualizados constantemente, para então fazer um backup em fita, em outro HD, ou em CD/DVD.

Antes de começar, vamos entender como um snapshot funciona. Quando você pede para o LVM criar um snapshot, você vai especificar um certo tamanho para este snapshot e neste caso, você precisa se certificar de que existam PEs livres para este tamanho. Então supondo que criamos um snapshot de 24MB do volume lógico Grupo02-log, o que significa? O LVM irá criar uma duplicata do Grupo02-log, com o conteúdo exato do Grupo02-log na hora da criação e sem mudanças posteriores. O espaço de 24MB necessários para o snapshot será utilizado para as posteriores gravações. Então enquanto você analiza e faz backup da duplicata, o LVM vai continuando a escrever as mudanças dos arquivos neste espaço de 24MB, que serve como um buffer. Se as mudanças acumularem e se tornarem maiores que 24MB, o snapshot se torna inválido.

Sabendo disso, antes de você planejar uma estratégia de backup com LVM Snapshots, você precisa estudar a quantidade de dados e mudanças de dados que a sua máquina tem. Se você acha que em um banco de dados, o processo de backup demora menos que o tempo das mudanças encherem, vamos dizer, 500MB, então reserve 500MB de PEs livres no Grupo de Volume para criar os snapshots. Caso ache que o backup demora mais que isso, aumente o tamanho do snapshot.

Então com isso já sabemos que no nosso cenário atual de exemplos, é impossível criar LVM snapshots. Por que? Se você der uma olhada em nossos exemplos, verá que nenhum Grupo de Volume terá PEs livres, pois utilizamos todas as PEs em todos os grupos. Pare remediar isso, eu redimensionei (ah, como eu gosto do LVM) o volume lógico Grupo02-log para 684MB ao invés de 784MB, deixando assim 100MB livres para criar um snapshot. O resultado ficará assim:

lvm> lvdisplay /dev/Grupo02/Grupo02-log
--- Logical volume ---
LV Name                /dev/Grupo02/Grupo02-log
VG Name                Grupo02
LV UUID                epfsvr-h75Q-7I3L-zl6H-5GLO-2YpH-eH2rVN
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                684.00 MB
Current LE             171
Segments               1
Allocation             inherit
Read ahead sectors     0
Block device           253:4

lvm> vgdisplay Grupo02
--- Volume group ---
VG Name               Grupo02
System ID
[...]
VG Size               784.00 MB
PE Size               4.00 MB
Total PE              196
Alloc PE / Size       171 / 684.00 MB
Free  PE / Size       25 / 100.00 MB
[...]

Como deu parar reparar, agora o Grupo02 tem 25 PEs livres, ou seja, 100MB. Utilizando agora esta situação, vamos criar um snapshot do Grupo02-log utilizando estes PEs livres. O próprio comando lvcreate faz isso, mas agora com a opção -s:

lvm> lvcreate -s -L 100M -n Grupo02-log-backup /dev/Grupo02/Grupo02-log
Logical volume "Grupo02-log-backup" created

lvm> lvdisplay /dev/Grupo02/Grupo02-log-backup
--- Logical volume ---
LV Name                /dev/Grupo02/Grupo02-log-backup
VG Name                Grupo02
LV UUID                VvU1ok-1tE0-33kQ-by7i-E6bj-NzuI-sAqkGw
LV Write Access        read/write
LV snapshot status     active destination for /dev/Grupo02/Grupo02-log
LV Status              available
# open                 0
LV Size                684.00 MB
Current LE             171
COW-table size         100.00 MB
COW-table LE           25
Allocated to snapshot  0.02%
Snapshot chunk size    8.00 KB
Segments               1
Allocation             inherit
Read ahead sectors     0
Block device           253:5

Pronto, um snapshot foi criado, agora basta apenas montá-lo como qualquer outro volume e utilizar a sua rotina de backup:

# mkdir /mnt/Grupo02-log-backup
# mount /dev/Grupo02/Grupo02-log-backup /mnt/Grupo02-log-backup
# cd /mnt/Grupo02-log-backup
[...] rotina de backup [...]

Depois de feito a rotina de backup com o conteúdo do /mnt/Grupo02-log-backup, desmonte o volume:

# cd
# umount /mnt/Grupo02-log-backup

E logo em seguida entre no LVM e remove o snapshot:

lvm> lvremove /dev/Grupo02/Grupo02-log-backup
Do you really want to remove active logical volume "Grupo02-log-backup"? [y/n]: y
Logical volume "Grupo02-log-backup" successfully removed

Pronto, backup concluído! O snapshot foi removido e os 100MB de PEs livres estão disponíveis novamente.

Conclusões

Apesar do LVM não ser reconhecido por 100% das ferramentas em todos os sistemas operacionais, se você utiliza apenas o Linux na máquina, é extremamente recomendável utilizar o LVM por ser tão útil e flexível. Uma grande gama de instaladores das distribuições atuais já vem com ferramentas que preparam o sistema já com o LVM, o que é bastante útil e salva um bom tempo para nós administradores: mas nunca é ruim saber mais detalhes sobre os assuntos né?

Rolar para cima