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.

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
  • Primeiro vamos desativar todos os VGs que estiverem montados
  # vgchange -an
 
  • Depois ativamos somente o que achamos necessário
  # 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

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.

Atualização para o ubuntu 18.04.

No caso dos ubuntu's mais novos os comandos tem uma outra seqüência. Vou descrevê-las abaixo:

  1. Criar a área de cache de dados
lvcreate -n DCache -L 10000M ubuntu-vg /dev/sdb
  1. Criar a área de cache de metadados
lvcreate -n MCache -L 10M ubuntu-vg /dev/sdb
  1. Criar o pool que combina as duas áreas
lvconvert --type cache-pool --poolmetadata ubuntu-vg/MCache ubuntu-vg/DCache
  1. Associar este pool criado ao disco que se pretende cachear
lvconvert --type cache --cachepool ubuntu-vg/DCache --cachemode writeback ubuntu-vg/ubuntu-lv

Para remover o cache associado ao pool

Aqui temos alguns passos a fazer, mas mesmo assim é uma operação simples. Entretanto demanda um tempo razoável. Bom, vamos lá.

  1. Comando para remover o volume lógico do cache
lvremove ubuntu-vg/DCache
  1. Executar o comando pvdisplay e vgdisplay para identificar qual dispositivo físico deve ser retirado
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <31.00 GiB / not usable 1.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7935
  Free PE               0
  Allocated PE          7935
  PV UUID               Sd7F59-8xtc-Ccou-TFOV-GpVo-tQQZ-5FuExu
 
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               ubuntu-vg
  PV Size               8.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              2047
  Free PE               2047
  Allocated PE          0
  PV UUID               0pvYxd-4pTf-HzGh-X1cX-lVH1-of1Q-gX0vOI
 
# vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  15
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               38.99 GiB
  PE Size               4.00 MiB
  Total PE              9982
  Alloc PE / Size       7935 / <31.00 GiB
  Free  PE / Size       2047 / <8.00 GiB
  VG UUID               9JlN4z-HffT-g4k0-xFuZ-gGyN-xv0y-B14hIG
 

Então para o nosso caso atual,vimos que temos 8G de espaço livre no VG através do comando vgdisplay e aí podemos remover o dispositivo /dev/sdc como mostra o pvdisplay.

  1. Executando a diminuição do grupo de volume
vgreduce ubuntu-vg /dev/sdc
  1. Removendo o dispositivo físico do grupo de volume
pvremove /dev/sdc

Para verificar que tudo foi apagado, podemos executar os comandos pvdisplay e vgdisplay novamente.

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <31.00 GiB / not usable 1.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7935
  Free PE               0
  Allocated PE          7935
  PV UUID               Sd7F59-8xtc-Ccou-TFOV-GpVo-tQQZ-5FuExu
 
# vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  16
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <31.00 GiB
  PE Size               4.00 MiB
  Total PE              7935
  Alloc PE / Size       7935 / <31.00 GiB
  Free  PE / Size       0 / 0   
  VG UUID               9JlN4z-HffT-g4k0-xFuZ-gGyN-xv0y-B14hIG

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