Capítulo 8. LVM

Índice
Apresentação
Implementação
Referências

O Gerenciador de Volumes Lógicos[1] (LVM) é um subsistema para gerenciamento ativo de armazenagem em disco que se transformou em um padrão para gerenciamento de armazenagem em sistemas UNIX.

O Gerenciador de Volumes Lógicos consiste em uma camada adicional entre os dispositivos físicos e a interface de E/S no kernel para fornecer uma visão lógica no armazenamento. Ao contrário dos esquemas de particionamento atuais onde discos são divididos em partições contínuas de tamanho fixo, o LVM permite ao usuário considerar discos, também conhecidos como Volumes Físicos[2] (PV), como um volume de armazenamento de dados, consistindo de extensões de tamanhos iguais.

Um sistema de LVM compõe-se de grupos arbitrários de volumes físicos, organizados em Grupos de Volumes[3](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).

A quantidade de espaço em disco, que é representada por um grupo de volume, pode ser alocada em partições virtuais, chamadas de Volumes Lógicos[4] (LV) de vários tamanhos. Um volume lógico pode conter um número de volumes físicos ou representar apenas uma porção de um volume físico. O tamanho de um volume lógico é determinado pelo seu número de extensões. Uma vez criados, volumes lógicos podem ser utilizados como partições de disco regulares - para criar um sistema de arquivos ou um dispositivo de troca.

Apresentação

Tradicionalmente, o tamanho de uma partição é definido na instalação do sistema. O redimensionamento de partições estáticas pode ser realizado com o aplicativo parted. Isso requer que o administrador faça um planejamento prévio da quantidade máxima de dados que a partição poderá vir a armazenar no futuro. Quando um usuário exceder o espaço de uma partição, ele terá de reparticionar (o que pode envolver uma reinstalação completa do sistema) ou se utilizar de artifícios, como as ligações simbólicas.

Por exemplo, suponha que você possui um disco de 1GB e cria-se uma partição /home utilizando 600MB. Imagine que você necessita de mais espaço e descobre que será necessário 1GB no /home. Utilizando a antiga noção de partições, é necessário ter outra unidade de pelo menos 1GB de tamanho. Então, pode-se adicionar o disco, criar o novo /home e copiar os dados existentes para ele.

Entretanto, com uma configuração LVM, é necessário apenas adicionar um disco de 400MB (ou maior) e adicionar esta unidade de armazenamento na partição /home. Outras ferramentas permitem o redimensionamento de um sistema de arquivos já existente sem a necessidade de se reformatar o mesmo.

Nota: Note que, como o LVM depende de módulos do kernel, algumas partições simplesmente não podem ser usadas com LVM. O / e o /boot são exemplos claros disso, pois os módulos do kernel necessários para a montagem de um volume virtual (além do próprio kernel) não estariam acessíveis.

Terminologia

O LVM vem com vários jargões que precisam ser entendidos para não haver problemas com os sistemas de arquivos. Nesta seção será vista 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. Pode-se transformar qualquer número consecutivo de blocos de um dispositivo de blocos em um Volume Físico.

Um PV[5] 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[6] são como blocos de um sistema de arquivos (regiões contínuas do disco) realmente grandes, muitas vezes com um tamanho na casa dos megabytes. PEs podem ser atribuídas a um Grupo de Volumes.

Um VG[7] é 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 é o resultado final de todo o trabalho, e é aqui que as informações são armazenadas. Ele é um dispositivo de bloco funcionalmente equivalente a uma partição. É sobre o Volume Lógico que será criado um sistema de arquivos.

O 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.

Seguem alguns diagramas que ajudarão a visualizar estes conceitos.

Figura 8-1. Volume Físico com Extensões Físicas



Figura 8-2. Grupo de Volumes com Dois PVs e Seis Extensões Físicas



Figura 8-3. Grupo de Volumes expandido

A figura mostra dois sistemas de arquivos, dividindo dois discos. O sistema de arquivos /home contém quatro Extensões Físicas, o sistema de arquivos /var duas.

Implementação

Pré-requisitos

Para implementar a solução LVM não é necessário nenhum requisito adicional. Se desejar uma implementação do LVM em mais discos rígidos, basta adquirí-los.

É bom lembrar também que a implementação do LVM pode ser feita durante a instalação, pois o instalador possui a opção para a criação de volumes lógicos para as partições selecionadas.

Instalação

Para esta solução, você precisa executar o Synaptic e selecionar os seguintes pacotes:

  • lvm-base

  • lvm-iop10

  • lvm-iop6

  • util-linux

ou utilize o apt para a instalação:

apt-get install lvm-.* util-linux

Configuração

Será apresentado aqui um exemplo comentado mostrando o processo para a criação de um Volume Lógico. Serão utilizadas duas partições em um mesmo disco para este exemplo, /dev/hda5 e /dev/hda6 com 2GB e 1GB respectivamente. O uso de LVM faz mais sentido com partições em discos diferentes, porém aqui, somente para fins didáticos, será usado um mesmo disco, sendo estas mesmas regras aplicáveis a vários discos. Os dados destas partições serão perdidos.

Observe as figuras mostradas anteriormente em caso de dúvida. Primeiramente, serão modificados os tipos das partições /dev/hda5 e /dev/hda6 para 0x8e.

# fdisk /dev/hda

Comando (m para ajuda): p

Disco /dev/hda: 255 cabeças, 63 setores, 784 cilindros
Unidades = cilindros de 16065 * 512 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 1 17 136521 82 Linux swap
/dev/hda2 * 18 272 2048287+ 83 Linux
/dev/hda3 273 400 1028160 83 Linux
/dev/hda4 401 784 3084480 5 Estendida
/dev/hda5 401 655 2048256 83 Linux
/dev/hda6 656 783 1028128+ 83 Linux
/dev/hda7 784 784 8001 82 Linux swap

Comando (m para ajuda): t
Número da partição (1-7): 5
Código hexadecimal (digite L para listar os códigos): 8e
O tipo da partição 5 foi alterado para 8e (Linux LVM)

Comando (m para ajuda): p

Disco /dev/hda: 255 cabeças, 63 setores, 784 cilindros
Unidades = cilindros de 16065 * 512 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 1 17 136521 82 Linux swap
/dev/hda2 * 18 272 2048287+ 83 Linux
/dev/hda3 273 400 1028160 83 Linux
/dev/hda4 401 784 3084480 5 Estendida
/dev/hda5 401 655 2048256 8e Linux LVM
/dev/hda6 656 783 1028128+ 83 Linux
/dev/hda7 784 784 8001 82 Linux swap

Comando (m para ajuda): t
Número da partição (1-7): 6
Código hexadecimal (digite L para listar os códigos): 8e
O tipo da partição 6 foi alterado para 8e (Linux LVM)

Comando (m para ajuda): p

Disco /dev/hda: 255 cabeças, 63 setores, 784 cilindros
Unidades = cilindros de 16065 * 512 bytes

Dispositivo Boot Início Fim Blocos Id Sistema
/dev/hda1 1 17 136521 82 Linux swap
/dev/hda2 * 18 272 2048287+ 83 Linux
/dev/hda3 273 400 1028160 83 Linux
/dev/hda4 401 784 3084480 5 Estendida
/dev/hda5 401 655 2048256 8e Linux LVM
/dev/hda6 656 783 1028128+ 8e Linux LVM
/dev/hda7 784 784 8001 82 Linux swap

Comando (m para ajuda): w
A tabela de partições foi alterada!

Chamando ioctl() para reler tabela de partições.

Sincronizando discos.

ou

WARNING: Re-reading the partition table failed with error 16:
Dispositivo ou recurso está ocupado
The kernel still uses the old table
The new table will be used at the next reboot

Carregue o módulo do LVM:

# insmod lvm-mod
Using /lib/modules/2.4.20-2cl/kernel/drivers/md/lvm-mod.o

Para criar o arquivo /etc/lvmtab vazio, execute o comando:

# vgscan
vgscan -- reading all physical volumes (this may take a while...)
vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully created

Agora pode-se criar os Volumes Físicos utilizando o comando a seguir:

# pvcreate /dev/hda5
pvcreate -- physical volume "/dev/hda5" successfully created

# pvcreate /dev/hda6
pvcreate -- physical volume "/dev/hda6" successfully created

Adicione este dois PVs a um Grupo de Volumes chamado test com o comando vgcreate:

# vgcreate test /dev/hda5 /dev/hda6
vgcreate -- INFO: using default physical extent size 4 MB
vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate -- doing automatic backup of volume group "test"
vgcreate -- volume group "test" successfully created and activated

Para criar o arquivo /etc/lvmtab, execute o comando:

# vgscan
vgscan -- reading all physical volumes (this may take a while...)
vgscan -- found active volume group "test"
vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully created
vgscan -- WARNING: you may not have an actual VGDA backup of your volume group

Caso os Grupos de Volumes estejam inativos, utilize o comando vgchange com o parâmetro -ay para ativar todos os VGs disponíveis:

# vgchange -ay
vgchange -- volume group "test" successfully activated

Existe um Grupo de Volumes vazio; visualize-o vgdisplay com o parâmetro - -verbose ou -v:

# vgdisplay -v test
--- Volume group ---
VG Name test
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 2
Act PV 2
VG Size 2.93 GB
PE Size 4 MB
Total PE 750
Alloc PE / Size 0 / 0
Free PE / Size 750 / 2.93 GB

--- No logical volumes defined in test ---


--- Physical volumes ---
PV Name (#) /dev/hda5 (1)
PV Status available / allocatable
Total PE / Free PE 500 / 500

PV Name (#) /dev/hda6 (2)
PV Status available / allocatable
Total PE / Free PE 250 / 250

Pode-se observar que não há Volumes Lógicos definidos; deve-se, portanto, criar um para poder utilizá-lo. Também é possível ver com este comando o estado dos PVs, seus nomes e o número total de blocos alocados e disponíveis. Gere um volume de 500MB chamado lv01 no Grupo de Volumes test:

# lvcreate -L 500M -n lv01 test
lvcreate -- doing automatic backup of "test"
lvcreate -- logical volume "/dev/teste/lv01" successfully created

Crie um sistema de arquivos:

# mke2fs /dev/test/lv01 
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
128016 inodes, 512000 blocks
25600 blocks (5.00%) reserved for the super user
First data block=1
63 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts
or 180 days, whichever comes first. Use tune2fs -c or -i to
override.

Crie um diretório para montar este sistema de arquivos e observe o seu tamanho:

# mkdir /mnt/lvm
# mount /dev/test/lv01 /mnt/lvm
# df -h /dev/test/lv01
Filesystem Size Used Avail Use% Mounted on
/dev/test/lv01 484M 13k 459M 1% /mnt/lvm

Veja novamente o Grupo de Volumes e observe as mudanças:

# vgdisplay -v test
--- Volume group ---
VG Name teste
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 1
Open LV 1
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 2.93 GB
PE Size 4 MB
Total PE 750
Alloc PE / Size 125 / 500 MB
Free PE / Size 625 / 2.44 GB

--- Logical volume ---
LV Name /dev/test/lv01
VG Name teste
LV Write Access read/write
LV Status available
LV # 1
# open 1
LV Size 500 MB
Current LE 125
Allocated LE 125
Allocation next free
Read ahead sectors 120
Block device 58:0


--- Physical volumes ---
PV Name (#) /dev/hda5 (1)
PV Status available / allocatable
Total PE / Free PE 500 / 375

PV Name (#) /dev/hda6 (2)
PV Status available / allocatable
Total PE / Free PE 250 / 250

Todas as informações do VG estão disponíveis na saída deste comando, como seu nome, tipo de acesso, estado atual, parâmetros do LV e PV e tamanhos totais e alocados do PE. O /dev/hda6 está totalmente livre, enquanto que o /dev/hda5 está com 125 Extensões Físicas em uso.

É possível também fazer redimensionamentos do volume lógico. O primeiro que será coberto por esta configuração é o aumento de um volume lógico.

O pré-requisito para esta operação é ter espaço livre no Grupo de Volumes, caso contrário deve-se adicionar mais PVs. A seguinte linha de comando faz esta operação:

# lvextend -L+2000M /dev/test/lv01 
lvextend -- extending logical volume "/dev/test/lv01" to 2.44 GB
lvextend -- doing automatic backup of volume group "test"
lvextend -- logical volume "/dev/test/lv01" successfully extended

Aumenta-se, com esta operação, o Volume Lógico /dev/test/lv01 em 2000MB. Note que o sistema de arquivos ainda não foi redimensionado, e portanto:

# df -h /dev/test/lv01 
Filesystem Size Used Avail Use% Mounted on
/dev/test/lv01 484M 13k 459M 1% /mnt/lvm

A partição ainda apresenta o seu tamanho original.

Uma segunda operação que pode ser feita é aumentar o sistema de arquivos. Primeiramente vamos desmontar o nosso sistema de arquivos:

# umount /mnt/lvm

Antes de redimensioná-lo force a verificação do sistema de arquivos com o e2fsck:

# e2fsck -f /dev/test/lv01 
e2fsck 1.32 (09-Nov-2002)
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
/dev/test/lv01: 11/128016 files (0.0% non-contiguous),16169/512000 \
blocks

Basta redimensionar o sistema de arquivos com a ferramenta resize2fs:

# resize2fs /dev/test/lv01 
resize2fs 1.32 (09-Nov-2002)
The filesystem on /dev/test/lv01 is now 2560000 blocks long.

Você também poderá utilizar o comando resize_reiserfs para redimensionar sistemas de arquivos ReiserFS.

Já é possível montar novamente o sistema de arquivos e verificar seu novo tamanho:

# mount /dev/test/lv01 /mnt/lvm/
# df -h /dev/test/lv01
Filesystem Size Used Avail Use% Mounted on
/dev/test/lv01 2.4G 13k 2.2G 1% /mnt/lvm

Diminua o sistema de arquivos para depois diminuir também o Volume Lógico. Primeiramente desmonte o sistema de arquivos:

# umount /mnt/lvm/

Force a verificação do sistema de arquivos com o comando:

# e2fsck -f /dev/test/lv01
e2fsck 1.32 (09-Nov-2002)
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
/dev/test/lv01: 11/636016 files(9.1% non-contiguous),80274/2560000 \
blocks

Redimensione o sistema de arquivos para 500 mil blocos (500MB aproximadamente); por exemplo:

# resize2fs /dev/test/lv01 500000
resize2fs 1.32 (09-Nov-2002)
The filesystem on /dev/test/lv01 is now 500000 blocks long.

De uma forma similar ao comando que foi usado para aumentar o Volume Lógico, agora porém com um valor negativo, pode-se diminuir o Volume Lógico:

# lvreduce -L-2000M /dev/test/lv01
lvreduce -- WARNING: reducing active logical volume to 500 MB
lvreduce -- THIS MAY DESTROY YOUR DATA (filesystem etc.)
lvreduce -- do you really want to reduce "/dev/test/lv01"? [y/n]: y
lvreduce -- doing automatic backup of volume group "test"
lvreduce -- logical volume "/dev/test/lv01" successfully reduced

Também é possível especificar um valor absoluto em blocos, como -L50 por exemplo. Force a verificação do sistema de arquivos novamente:

# e2fsck -f /dev/test/lv01
e2fsck 1.32 (09-Nov-2002)
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
/dev/test/lv01: 11/123952 files (9.1% non-contiguous), 15657/499713
blocks

-->Redimensione novamente o sistema de arquivos para aproveitar ao máximo o tamanho do Volume Lógico:

# resize2fs /dev/test/lv01
resize2fs 1.32 (09-Nov-2002)
The filesystem on /dev/test/lv01 is now 512000 blocks long.

Monte novamente o sistema de arquivos e observe seu tamanho reduzido:

# mount /dev/test/lv01 /mnt/lvm/
# df -h /dev/test/lv01
Filesystem Size Used Avail Use% Mounted on
/dev/test/lv01 484M 13k 469M 1% /mnt/lvm

O valor é um pouco diferente dos 500MB originais, pelo fato de que 500 mil blocos não correspondem exatamente a 500MB. Se fosse preciso ter um valor exato, deve-se fazer o cálculo com mais precisão e especificar os valores precisos em número de blocos.

Redundância e Performance

Por questões de performance, é possível distribuir dados em múltiplos discos. Isto significa que o bloco 1 está no Volume Físico A, e o bloco 2 está no PV B, enquanto que o bloco 3 pode estar no PV A novamente. Também é possível fazer stripes com mais de dois discos.

Esse arranjo disponibiliza uma maior largura de banda, em razão do paralelismo no acesso aos dados.

A performance de disco é influenciada pelo menos por três fatores. O mais óbvio é a velocidade em que cada dado no disco pode ser lido ou escrito seqüencialmente. Este é o fator limitante quando se está lendo ou gravando um arquivo grande em um barramento SCSI/IDE com apenas um disco.

Há a largura de banda disponível para o disco. Se existem sete discos em uma interface SCSI, a limitação de banda pode causar um impacto maior que a velocidade de escrita para o próprio disco. Com um orçamento suficiente, pode-se prevenir e evitar que este gargalo se torne um problema.

A latência é sempre um problema e para minimizá-la não pode-se simplesmente aumentar os custos para termos uma latência menor. A maioria dos discos aparentemente tem um latência de algo em torno de sete milissegundos. Existe a latência de SCSI, que tende a ser algo em torno de 25 milissegundos.

A latência combinada em um caso típico será em torno de 30 milissegundos. É possível, portanto, efetuar aproximadamente, apenas 33 operações em disco por segundo. Se deseja-se uma capacidade para fazer várias centenas de requisições por segundo, e o cache não é muito grande, não é possível realizar esta tarefa.

Se múltiplos discos trabalham em paralelo, múltiplos comandos podem ser executados simultaneamente, que facilmente irão resolver o problema da latência. Algumas aplicações, como um servidor de notícias muito grande, não irão funcionar sem striping ou outras técnicas ágeis de E/S[8].

Isto é o que o striping pode fazer. Se o barramento tem este suporte, cada leitura e cada escrita seqüencial poderão ser mais rápida.

O striping sem medidas adicionais aumenta as chances de falhas, em uma visão de bits. Se alguma coisa nos discos falhar, todo o Volume Lógico irá falhar junto. Se os dados forem concatenados, apenas uma parte do sistema de arquivos será perdida. Em último caso, pode-se utilizar espelhamento em stripes.

A configuração que especifica as stripes é feita quando cria-se o Volume Lógico com o comando lvcreate. Há dois parâmetros relevantes. Com o -i indica-se para o LVM quantos Volumes Físicos serão usados. O striping na realidade não é feito em uma base bit-por-bit, mas em blocos. Com o -I especifica-se a granulação em kilobytes. Note que este valor deve ser uma potência de 2, e que a granulação grosseira é de 128KB. Por exemplo:

# lvcreate -n slv01 -i 2 -I 64 test -L 200M
lvcreate -- doing automatic backup of "test"
lvcreate -- logical volume "/dev/test/slv01" successfully created

Criando o sistema de arquivos:

# mke2fs /dev/test/slv01
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
51200 inodes, 204800 blocks
10240 blocks (5.00%) reserved for the super user
First data block=1
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts
or 180 days, whichever comes first. Use tune2fs -c or -i to
override.

Efetue a montagem do dispositivo e verifique seu tamanho:

# mount /dev/test/slv01 /mnt/lvm/
# df -h /dev/test/slv01
Filesystem Size Used Avail Use% Mounted on
/dev/test/slv01 194M 13k 184M 1% /mnt/lvm

Notícias de Desempenho: O ganho de desempenho poderá ser muito negativo se for colocada mais que uma partição do mesmo disco em uma stripe - isto deve ser evitado. O striping com dois discos em uma única interface IDE também se torna inviável - isto dependerá da tecnologia IDE para resolver este problema.

Placas mãe antigas podem ter duas interfaces IDE, porém o uso da segunda pode ser catastrófico, se for dedicada a servir uma unidade de CD-ROM lenta. Benchmarks podem ser efetuados com várias ferramentas; a mais notória se chama Bonnie++, e pode ser encontrada em , podendo ser usada para medir o desempenho dos dados.

Testando a Configuração

O teste principal consiste em acessar as partições que foram configuradas e, como foi mostrado na seção Configuração, redimensioná-las para o tamanho que se deseja.

Experimente também colocar outros discos; o procedimento é similar ao descrito neste capítulo. Teste os volumes acessando as partições.

Referências

Notas

[1]

Logical Volume Manager.

[2]

Physical Volumes.

[3]

Volume Groups.

[4]

Logical Volumes.

[5]

Physical Volume.

[6]

Physical Extents.

[7]

Volume Group.

[8]

Entrada/Saída