Logical Volume Manager

O LVM permite que exista uma abstração entre a parte física de armazenamento e os sistemas de arquivos apresentados ao sistema operacional.

Então uma das principais utilidades do LVM é concatenar discos, permitindo a criação de filesystem maiores que o limite físico do hardware. Entretanto, pode-se também utilizar o LVM, para aumentar a granularidade na alocação de espaços de filesystems e também para permitir modificações nos tamanhos das “partições” depois de tudo instalado.

Criando o LVM através da linha de comando

Preparação Inicial

Para usar o LVM temos que preparar os discos, ou seja, você precisa de pelo menos uma partição com o tipo “Linux LVM”, para que o dispositivo seja reconhecido como parte do LVM.

Primeira providência então é criarmos a partição LVM. Execute o comando como root:

# fdisk -l

Uma vez identificado qual(is) dispositivo(s) serão usados, executar a seqüência abaixo (vamos usar o sdb como exemplo):

Execute o fdisk, como root, apontando para o dispositivo exemplo: fdisk /dev/sdb
Crie a partição (opção n);
Altere o tipo da partição para 8e (opção t);
Saia do fdisk escrevendo a configuração no dispositivo (opção w). 

Agora pode verificar as partições criadas com o comando fdisk -l /dev/sdb. Se não ocorreu nenhum erro, será possível ver que a nova partição estará com o tipo “Linux LVM”. Neste ponto já é possível começar a configurar o LVM.

Criando o PV, VG, o LV e o filesystem

Nas próximas etapas, passaremos pelos comandos para criação dos PV, VG, LV e filesystems de maneira simplificada. Vamos imaginar que temos duas partições, /dev/sdb1 e /dev/sdc1.

Criação dos PV (Physical Volumes), com o comando
# pvscan
# pvcreate /dev/sdb1 /dev/sdc1
Criação o VG (Volume Group)
# vgcreate nome_do_vg /dev/sdb1 /dev/sdc1
Ativação do VG criado
# vgchange -an
# vgchange -a y nome_do_vg
Criação do LV (Logical Volume)
# lvcreate -L tamanho(M/G/T) nome_do_vg -n nome_do_lv

O parâmetro -L é para informar o tamanho do Logical Volume, deve ser informado acompanhado da ordem de grandeza em bytes, ex.: 100M, 10G, 1T.

Criação do filesystem
# mkfs.xfs -L nome_do_fs /dev/nome_do_vg/nome_do_lv
Montagem do filesystem

Após tudo executado, teremos um filesystem pronto para ser montado dentro do sistema operacional, e assim basta executar o comando a seguir para termos finalizarmos o processo.

# mount /dev/nome_do_vg/nome_do_lv /mount_point 

Se por ventura for necessário colocar o comando de montagem dentro do fstab, para que o sistema de arquivos seja montado automaticamente no momento do boot, faça-o usando o UUID. Para saber o UUID que foi criado use o seguinte comando:

# xfs_admin -u /dev/nome_do_vg/nome_do_lv

Usando cache no LVM

Como fazer para termos um HDD e um SSD trabalhando juntos para termos o melhor dos dois mundos, a capacidade de armazenamento de um HDD e a velocidade de acesso de um SSD.

Farei um exemplo aqui usando o ubuntu 16.04, por que os anteriores não tem o suporte do lvmcache, mas pode ser adaptado para outras distribuições.

Preparação Inicial

O exemplo a seguir será feito a partir de uma instalação já funcional feita usando o LVM no disco de root. Antes de começar é necessário que se tenha instalado os seguintes pacotes nesta instalação, para que na finalização da configuração com cache, o sistema volte após o reboot. Todos os comandos devem ser executados com a conta administrativa (root).

apt install dmraid
apt install thin-provisioning-tools

Depois disso temos que fazer algumas customizações na criação do initrd. Para isso é necessário executar dois passos:

Primeira modificação é acrescentar no arquivo modules, que está em /etc/initramfs-tools os seguintes parâmetros:

echo "dm_cache" >> /etc/initramfs-tools/modules
echo "dm_cache_mq" >> /etc/initramfs-tools/modules
echo "dm_cache_smq" >> /etc/initramfs-tools/modules
echo "dm_persistent_data" >> /etc/initramfs-tools/modules
echo "dm_bufio" >> /etc/initramfs-tools/modules

Segunda modificação a ser realizada é acrescentar o seguinte script dentro do diretório /etc/initramfs-tools/hooks com o nome lvmcache. O conteúdo do referido script deve ser o seguinte:

#!/bin/sh
 
PREREQ="lvm2"
 
prereqs()
{
    echo "$PREREQ"
}
 
case $1 in
prereqs)
    prereqs
    exit 0
    ;;
esac
 
if [ ! -x /sbin/lvm ]; then
    exit 0
fi
 
. /usr/share/initramfs-tools/hook-functions
 
copy_exec /usr/sbin/cache_check
copy_exec /usr/sbin/cache_dump
copy_exec /usr/sbin/cache_metadata_size
copy_exec /usr/sbin/cache_repair
copy_exec /usr/sbin/cache_restore
 
for x in dm_cache_cleaner dm_cache_smq dm_cache dm_persistent_data dm_bio_prison dm_cache_mq dm_bufio
do
    manual_add_modules ${x}
done

Depois disso devemos executar dois comandos para gerar a nova imagem do initrd:

chmod +x /etc/initramfs-tools/hooks/lvmcache
update-initramfs -u

Criando o disco de cache

Acrescentar o disco SSD que será usado como cache, como o sistema já estava instalado e funcionando, neste exemplo assumirei que o SSD entrou no sistema como o /dev/sdb.

Vamos prepará-lo para ser usado como lvm, através do seguinte comando:

pvcreate /dev/sdb

Depois que o disco foi preparado para fazer parte do lvm, temos que anexá-lo ao vg no qual se usará o disco como cache, isto deve ser feito usando o comando a seguir:

vgextend <nome_do_vg> /dev/sdb

A partir daí já se pode criar o logical volume que será usado como cache e anexá-lo ao logical volume que queiras que tenha o cache. Isto pode ser feito em apenas um passo, usando o seguinte comando, onde estarei anexando o cache ao disco de root:

lvcreate --type cache -L 10000M --cachemode writeback -nCacheLV ubuntu-vg/root /dev/sdb

Se não quiseres que cache atue no momento da escrita, deve-se usar o outro modo de cache, neste caso o comando seria:

lvcreate --type cache -L 10000M --cachemode writethrough -nCacheLV ubuntu-vg/root /dev/sdb

Pronto !!! O seu disco agora tem a capacidade de um HDD, com a velocidade de um SSD.

Monitorando o uso do disco de cache

Se quiseres observar como o disco de cache esta se comportando no sistema, basta executar o comando abaixo:

lvs -o cache_read_hits,cache_read_misses,cache_write_hits,cache_write_misses ubuntu-vg/root
Exceto onde for informado ao contrário, o conteúdo neste wiki está sob a seguinte licença: Public Domain