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
- 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
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.
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:
- Criar a área de cache de dados
lvcreate -n DCache -L 10000M ubuntu-vg /dev/sdb
- Criar a área de cache de metadados
lvcreate -n MCache -L 10M ubuntu-vg /dev/sdb
- Criar o pool que combina as duas áreas
lvconvert --type cache-pool --poolmetadata ubuntu-vg/MCache ubuntu-vg/DCache
- 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á.
- Comando para remover o volume lógico do cache
lvremove ubuntu-vg/DCache
- 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.
- Executando a diminuição do grupo de volume
vgreduce ubuntu-vg /dev/sdc
- 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
Re-habilitando o acesso RW
Caso aconteça algum problema o o lvm fique em estado read-only, uma das maneiras de recuperar é através desta opção?
No shell de recuperação, verificar o seguinte arquivo?
# grep locking_type /etc/lvm/lvm.conf locking_type = 4
Se estiver assim, pode-se alterar o conteúdo para locking_type=1 e em seguida:
lvm vgchange -an lvm vgchange -ay
ou usar através da linha de comando diretamente:
lvm vgchange -ay --config ' global {locking_type=1} '