quarta-feira, abril 09, 2008

LVM - Gerenciamento de Volumes Lógicos


1. Introdução

A. O que é LVM

LVM - é o acrônimo para Gerenciador de Volumes Logicos (Logical Volume Manager) e foi desenvolvido por Heinz Mauelshagen para o GNU/Linux, suportado pelo kernel a partir da série 2.4.

Com o LVM podemos:

  • controlar tamanhos de partição: é possível redimensionar o tamanho de partições facilmente, simplesmente diminuindo ou aumentando o tamanho de uma partição.
  • adicionar discos à uma partição: por exemplo, suponha que uma partição /home se tornou insuficiente para comportar os dados dos usuários de sua empresa. Com LVM você poderia "adicionar" mais espaço à partição, simplesmente fornecendo mais espaço físico através de um novo disco rígido ou outra nova partição.
  • realizar backups completos (snapshots): um recurso também bastante interessante é realizar o backup completo de uma partição inteira em um arquivo.

Nota: O LVM permite flexibilidade de gerenciamento do espaço do seu sistema, porém não fornece nenhum tipo de redundância - no sentido de aumentar a disponibilidade de seu sistema. Iremos abordar este assunto mais adiante, através de outra tecnologia, denominada RAID.

B. O que é Gerenciador de Volumes Logicos (LVM)?

O LVM adiciona um sistema de discos e partições virtuais ao GNU/Linux para dar ao administrator maior flexibilidade no gerenciamento de espaço de partições, através de: redimensionamento de partições, inclusão exclusão de discos inteiros ou partições físicas, etc...

C. Como funciona?

Por ser um módulo do kernel, o LVM adiciona uma camada adicional entre os periféricos físicos e a sua interface de E/S. Ao contrário dos esquemas de particionamento convencionais, onde discos são divididos em partições de tamanho fixo, o LVM permite ao usuário considerar discos, também conhecidos como Volumes Físicos (PV, Phisical Volume), como um volume de armazenamento de dados, consistindo de extensões de tamanhos iguais.

Isto nos permite concatenar partições ou discos completos ou mesmo múltiplos dispositivos para formar um sistema de armazenamento também conhecido como VG (Volume Group), com sua unidades de alocação também chamadas de Physical Extents (PE).

Um sistema de LVM compõe-se de grupos de volumes físicos, organizados em Grupos de Volumes(VG). Um grupo de volume pode consistir de um ou mais volumes físicos. Pode haver mais de um grupo de volume no sistema. Uma vez criado, o grupo de volume, e não o disco, é a unidade básica de armazenamento de dados (um disco virtual compondo-se de um ou mais discos físicos).

O espaço em disco disponivel é representado por um Grupo de Volume, podendo ser alocado em partições virtuais chamados Volumes Lógicos (LV) de qualquer tamanho, podendo ser utilizado para armazenar arquivos ou mesmo para um dispositivo de troca (swap).

D. Terminologia:

O LVM vem com vários termos que precisam ser entendidos para não haver problemas com os sistemas de arquivos. Veremos agora esta terminologia utilizada pelo LVM. Você deve usar a palavra física com um pouco de cuidado; de qualquer forma, inicialmente ela será vista como sendo um simples disco rígido, ou uma partição. Por exemplo, /dev/hda, /dev/hda2, /dev/sda.

Um PV não é nada mais que um meio físico com alguns dados administrativos adicionados a ele - uma vez que adicione-se estes dados, o LVM irá reconhecê-los como proprietários das Extensões Físicas.

Extensões Físicas são como blocos de um sistema de arquivos realmente grandes, muitas vezes com um tamanho na casa dos megabytes. PEs podem ser atribuídas a um Grupo de Volumes.

Um VG é composto por um determinado número de Extensões Físicas. Deste Grupo de volumes, PEs podem ser atribuídas a um Volume Lógico.

Um Volume Lógico (LV) é o resultado final de todo o trabalho, e é aqui que as informações são armazenadas. Ele é um dispositivo de bloco funcional equivalente a uma partição. É sobre o Volume Lógico que serão criados os sistemas de arquivos.

O formato do sistema de arquivos pode ser de vários tipos: o ext2 padrão, o ext3, ReiserFS, etc. Para o usuário, não há diferença entre uma partição regular e um Volume Lógico.

E. Diagrama de um sistema LVM:

esquemalvm.gif

No caso do nosso esquema acima, temos:

PV1 é uma partição de 500MB PV2 é uma partição de 500MB VG é o grupo de nome VG00 LV1 é uma partição virtual. VGDA é o arquivo responsavel por guardar os metadados.

2. Preparando o sistema para uso do LVM:

Atualmente as distribuições menos populares como Debian e Slackware não possuem em sua instalação suporte a LVM, ou seja, para a grande maioria das distribuições o LVM é aplicavel no ato da instalação do Sistema Operacional utilizando ferramentas de instalação como o Anaconda.

Resumidamente, a implantação do LVM em um sistemas ja instalado, consiste nos seguintes passos:

  1. Preparação do disco-rigido;
  2. Atualização do arquivo /etc/modules.conf
  3. Criação da imagem initrd.

nota: A Distribuição Conectiva a partir da versão 8.0 já disponibilizou a opção de instalação sobre partições LVM, outras distribuições, como por exemplo, Mandrake 8 e Slackware 9.1, ainda não haviam disponibilizado tal opção, as distribuições Red Hat 9, Fedora Core 1 e RedHat Enterprise 3.0 possuem suporte a LVM no ato da instalação.

A. Preparando o disco:

Com o LVM, podemos utilizar parcial ou totalmente um disco rígido. Utilizando sua ferramenta de particionamento preferida (fdisk, cfdisk, parted etc...) crie as partições que serão utilizadas para o LVM, informando o tipo 8e – Correspondente ao código padrão para o Linux LVM.

Como exemplo crie as seguintes partições:

/dev/hda5 – 256MB
/dev/hda6 – 256MB

Não reinicie o sistema ainda.

Nota: Nas distros atuais como Fedora Core 1, RedHat 9, RedHat Enterprise 3.0 AS, não é necessário reiniciar o computador, pois o sistemas de arquivos que iremos trabalhar não necessita que o mesmo seja reiniciar para fixar as alterações, como é o caso de partições tipo NTFS e VFAT.

B. Atualizando o modules.conf:

Em seguida devemos atualizar o arquivo /etc/modules.conf, insira as seguintes linhas em seu modules.conf:

alias block-major-58 lvm-mod alias char-major-109 lvm-mod

Nota: O porquê desta configuração é pouco documentada, informações não-oficiais obtidas em listas de discussão sugerem que este alias é necessário para as ferramentas LVM encontrem o código "major" de dispositivos de bloco LVM - valor 58, conforme o nome block-major-58 - e de dispositivos de caractere LVM - valor 109, conforme o nome char-major-109. Comprove estes números, executando o comando 'ls -l /dev/lvm' quando o LVM estiver em funcionamento.

Nota 2: Nas distribuições, Fedora core 1, RedHat 9, e o Enterprise 3.0 AS, não necessitam dessa configuração.

C. Atualizando seu initrd:

Essa parte é necessária para que o kernel carregue os módulos LVM antes de acessar os dispositivos LVM. Para se criar este arquivo temos duas formas, a mais fácil, que nem sempre funciona em sistemas baseados em Red Hat, é executando o comando:

# lvmcreate_initrd

Com este comando ele automaticamente irá criar e sobrescrever o initrd que esta dentro do diretorio /boot.

A segunda forma é recomendado em sistemas baseados em Red Hat:

# mkinitrd -f -v /boot/initrd-$(uname -r).img $(uname -r)

Este comando irá sobrescrever seu initrd original por um novo contendo os módulos responsáveis por inicializar o LVM.

Nota: Nas distribuições Fedora core 1, RedHat 9, e o Enterprise 3.0 AS, não mais necessita que seja criado um initrd atualizado.

Atualizando o LILO

Se você é usuário de alguma distribuição baseada em Red Hat, verifique se há algo semelhante a esta opção em seu lilo.conf, necessária para a correta inicialização de seu sistema:

prompt
timeout=50
default=linux
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
lba32

image=/boot/vmlinuz-2.4.20-8
label=linux
initrd=/boot/initrd-2.4.20-8.img
root=/dev/hda2 # é necessário que esta linha exista em seu lilo.conf
read-only

Feitas as devidas alterações execute o comando lilo para fixar as alterações.

Atualizando o GRUB

Caso utilize o GRUB verifique se o caminho para o initrd esta correto e se seu nome esta correto como no exemplo abaixo:

boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ --useLilo
initrd /initrd-2.4.20-8.img

Feitas as devidas alterações execute o seguinte comando para que os dados seja corretamente gravador: grub-install /dev/hda

Nota: Nas distribuições Fedora core 1, RedHat 9, e o Enterprise 3.0 AS, não mais necessita que seja configurado o arquivos de boot.

D. Conhecendo as ferramentas:

O LVM já é um sistema bem maduro, não temos de nos preocupar com falhas vindas dele, temos apenas de ficar de olhos nas novas versões do seu conjunto de utilitários, agora na versão 1.0.8.

Vamos conhecer alguns dos utilitários que acompanham esta sistema.

pvcreate – Utilizado para inicializar as partições informando ao sistema que a partição esta pronta para ser utilizada em um VG

vgscan – Usado para atualizar o arquivo de metadados.

vgcreate – Utilizado para criar um novo VG usando as partições inicializadas pelo comando pvcreate.

lvcreate – Comando usado para criar partições virtuais conhecidas tambem como LV.

pvmove - Usado para mover dados entre discos ou partições.

lvextend - Utilizado para adicionar mais espaço a um LV.

lvreduce - Usando para reduzir o espaço de uma LV.

vgreduce - Usado para remover uma partição ou disco de um VG existente.

vgextend - Usado para adicionar um disco ou partição em um VG existente.

Estes são os utilitários básicos para a criação de um sistemas LVM funcional, mais à frente vocês irão conhecer outras ferramentas para manutenção de um sistemas de arquivos LVM.

1 - Outras ferramentas

Outras ferramentas que serão de alguma forma relacionadas a criação e manutenção e testes de nosso sistema de arquivos:

fdisk - Usado para particionar o disco e/ou trocar os id's da partição.

cfdisk - Mesma função do fdisk, mas usa uma interface console para auxiliar na criação e manutenção das partições de forma facilitada.

mkfs - Usado para formatar uma partição.

dd - É um verdadeiro canivete suiço, com ele podemos fazer imagem de discos, copiar (rawrite), fazer converção de tabelas etc...

3. Criando os volumes logicos:

A criação é algo bem simples de ser feito desde que todas as recomendações tenham sido seguidas:

A. Inicializando os discos:

Vamos inicializar algumas partições /dev/hda5 e /dev/hda6 que foram criadas anteriormente:

# pvcreate /dev/hda5 /dev/hda6 

Para se verificar se foram inicializados corretamente execute o comando pvdisplay para as duas partições físicas:

# pvdisplay /dev/hda5
pvdisplay -- "/dev/hda5" is a new physical volume of 4.67 GB

B. Criando o Volume Group (VG):

A criação do VG é o mesmo que a criação do disco virtual, onde iremos adicionar os PVs que inicializamos no processo anterior:

# vgcreate vg00 /dev/hda5 /dev/hda6 

Para se verificar se foi criado corretamente utilize vgdisplay:

# vgdisplay       #Uma tela semelhante a esta deve aparecer:

--- Volume group ---
VG Name vg00
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 0
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 1
Act PV 1
VG Size 4.66 GB
PE Size 4 MB
Total PE 1193
Alloc PE / Size 0 / 0
Free PE / Size 1193 / 4.66 GB
VG UUID A0rW6L-iJAS-AI1q-oPGy-WQx1-fZ6w-jFoGKK

C. Criando as LVs ou partições virtuais:

A partir de agora você irá criar uma partição virtual que poderá ser formatada e utilizada, também podendo ser redimensionada para mais ou menos:

Vamos inicialmente criar uma pequena partição virtual:

# lvcreate -L 512M -n teste_1 vg00

Vejamos suas opções:

-L Espaço que seá alocado para a partição virtual -n Nome que sera dado a particão virtual vg00 É o nome que foi dado para o nosso disco virtual, podendo ser outro.

Agora vamos formatar nossa partição virtual com suporte a Journal para obtermos uma maior confiabilidade:

# mke2fs -j /dev/vg00/teste_1

Agora vamos testar nossa partição:

Crie um diretorio lvm dentro de /mnt e monte sua partição:

# mkdir /mnt/lvm
# mount /dev/vg00/teste_1 /mnt/lvm

Agora vamos criar um arquivo dentro do diretorio lvm:

# dd if=/dev/zero of=/mnt/lvm/arquivo bs=1k count=4096

Execute um df -h e veja que a partição esta montada e quanto de espaço livre temos na mesma.

D. Redimensionando as partições:

Para redimensionar-mos nossa partição virtual temos que primeiro desmonta-lá, assim evitando danos a nossa partição, para proceder podemos utilizar o utilitário e2fsadm ou utilizar os que vem junto com o pacote de utilitarios do LVM, o lvredure e lvextend.

Os exemplos serão dados com ambos os comandos:

# umount /dev/vg00/teste_1

Agora vamos adicionar mais 500MB a nossa partição:

# e2fsadm -L+500M /dev/vg00/teste_1

ou

# lvextend -L+500 /dev/vg00/teste_1

Agora vamos reduzir nossa partição virtual em 200M, para fazermos isso iremos utilizar os mesmos comandos acima, somente trocando o sinal e o valor:

# e2fsadm -L-200M /dev/vg00/teste_1

ou

# lvreduce -L-200M /dev/vg00/teste_1

Vejamos suas opções:

-L Usado para informar o tamanho: +500 indica adição -500 indica redução do volume, válido para ambos os comandos.

/dev/vg00/teste_1 Partição virtual que irá ter espaço aumentado ou reduzido.

E. Adicionando novos discos a um VG:

O LVM não esta limitado ao disco que foi instalado inicialmente no seu sistema, podemos adicionar novos discos ou partições ao VG:

Para adicionar um novo disco ou parte dele execute:

# vgextend vg00  /dev/hda6

Com este comando iremos adicionar uma nova partição (hda6) ao nosso VG de nome vg00.

F. Removendo um partição ou disco do VG:

O processo de remoção de um disco ou partição é bem simples, normalmente é feito quando necessitamos trocar um dos discos do VG por outros de maior tamanho. Como o LVM trabalha distribuindo os dados dentro do VG, ao retirar uma partição ou disco automaticamente ele irá redistribuir os dados nos discos ou partições ainda disponiveis no VG. Para tanto é necessário que o sistema ainda possua espaço, vamos a um exemplo:

Nosso VG é composto por duas partições /dev/hda5 /dev/hda6, o tamanho de nosso VG é de aproximadamente 512MB ambos os PVs de nosso VG possuem 256 MB, queremos remover o PV /dev/hda5 do nosso grupo para fazer isso temos de desmontar o sistema de arquivos e executar o seguinte comando:

# vgreduce vg00 /dev/hda5
vgreduce -- ERROR: can't reduce volume group "vg00" by used physical volume "/dev/hda5"

Caso tenhamos recebido este erro, devemos primeiro desocupar nosso disco ou partição para que o mesmo seja removido, para tal, utilizaremos o comando pvmove /dev/hda5, os dados entao serao movidos para areas livres nos outros discos.

# vgreduce vg00 /dev/hda5
vgreduce -- doing automatic backup of volume group "vg00"
vgreduce -- volume group "vg00" successfully reduced by physical volume:
vgreduce -- /dev/hda5

Mas se sua saida foi a do exemplo acima é que correu tudo bem, e a partição foi removida com sucesso do vg00.

nota: vgremove é utilizado para remover um VG, portanto não confunda.

G. Removendo um Volume Lógico:

Podemos tambem remover a qualquer hora uma partição virtual para tanto execute o seguinte comando, mas tenha certeza do que está fazendo, pois este processo não permite recuperação de seus dados uma vez realizado:

# lvremove /dev/vg00/teste_1

nota: somente será possível remover um volume lógico, se o mesmo estiver desmontado!

1 Comments:

Blogger Unknown said...

Ivandro Conradi, parabens pelo seu excelente tutorial.

Aproveitava para pedir ajuda para para o seguinte problema:
Tenho um disco que possui duas partições em LVM e tentei adiona-lo sem sucesso ao CentOS da seguinte forma:

1º)

[root@servidor-2 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdc1 VolGroup01 lvm2 a- 15,72G 32,00M

2º)

[root@servidor-2 ~]# lvdisplay VolGroup01
--- Logical volume ---
LV Name /dev/VolGroup01/LogVol01
VG Name VolGroup01
LV UUID YCvkVF-chBe-AjgJ-XgRI-L5pX-6uEy-TFgqSe
LV Write Access read/write
LV Status NOT available
LV Size 5,94 GB
Current LE 190
Segments 1
Allocation inherit
Read ahead sectors auto

--- Logical volume ---
LV Name /dev/VolGroup01/LogVol00
VG Name VolGroup01
LV UUID nNrPSF-5C5h-7zlq-IX87-7cEL-825C-V8aSVM
LV Write Access read/write
LV Status NOT available
LV Size 9,75 GB
Current LE 312
Segments 1
Allocation inherit
Read ahead sectors auto


3º)

[root@servidor-2 ~]# mkdir /mnt/sdc1
[root@servidor-2 ~]# mkdir /mnt/sdc2


4º)

[root@servidor-2 ~]# mount /dev/VolGroup01/LogVol00 /mnt/sdc1
mount: special device /dev/VolGroup01/LogVol00 does not exist

[root@servidor-2 ~]# mount /dev/VolGroup01/LogVol01 /mnt/sdc2
mount: special device /dev/VolGroup01/LogVol01 does not exist

Podia-me explicar o porquê desta mensagem de erro no final?

Obrigado

11:53 AM  

Postar um comentário

<< Home