LVM (Português)
De Wikipédia: Gerenciador de Volume Lógico (Linux):
- O Gerenciador de Volume Lógico (LVM) é um mapeador de dispositivos que fornece gerenciamento de volume lógico para o kernel Linux.
Conceitos básicos
Blocos de construção do LVM
O gerenciador de volumes lógicos (LVM) utiliza um recurso do kernel chamado de mapeador de dispositivo (do inglês device mapper) para fornecer um sistema de partições independente do layout subjacente do disco. Com o LVM você abstrai seu dispositivo de armazenamento e passa a ter "partições virtuais", tornando a tarefa de estender/diminuir volumes mais fácil (embora isto esteja sujeito a potenciais limitações do sistema de arquivos).
Partições virtuais permitem adição e remoção sem a preocupação de haver ou não espaço contíguo suficiente em um disco em particular. Evita aquelas situações de tentar manipular partições pelo fdisk com um disco em uso (e ficar com apreensão imaginando se o kernel está usando a tabela de partições nova ou velha), ou ainda, precisar mover outras partições para outras regiões ao longo do disco.
Construção básica dos blocos pelo LVM:
- Volume físico (PV, do inglês Phisical Volume)
- Um node de dispositivo em bloco Unix, usável para armazenamento pelo LVM. Exemplos: um disco rígido, uma partição MBR ou GPT, um arquivo de loopback, um mapeador de dispositivo (por exemplo, dm-crypt). É responsável por hospedar um cabeçalho do LVM.
- Grupo de volume (VG, do inglês Volume Group)
- Grupo de PVs que servem como contêineres para LVs (volumes lógicos, de Logical Volumes). PEs (Phisical Extents, ou extensões físicas são alocadas de um VG para um LV).
- Volume lógico ou Logical Volume (LV)
- Uma partição virtual/lógica que reside em um VG e é composta de PEs. LVs são dispositivos de bloco Unix análogos a partições físicas, ou seja, podem ser diretamente formatadas com um sistema de arquivos.
- Extensão física ou Physical Extent (PE)
- A menor extensão física contígua (4 MiB, por padrão) em um PV que pode ser atribuída para um LV. Pense em PEs como sendo partes de PVs que podem ser alocadas para qualquer LV.
Exemplo:
Discos físicos Disco1 (/dev/sda): ┌──────────────────────────────────────┬─────────────────────────────────────┐ │ Partição1 50 GiB (Volume físico) │ Partição2 80 GiB (Volume físico) │ │ /dev/sda1 │ /dev/sda2 │ └──────────────────────────────────────┴─────────────────────────────────────┘ Disco2 (/dev/sdb): ┌──────────────────────────────────────┐ │ Partição1 120 GiB (Volume físico) │ │ /dev/sdb1 │ └──────────────────────────────────────┘
Volumes lógicos do LVM Grupo de volume1 (/dev/MeuGrupoVol/ = /dev/sda1 + /dev/sda2 + /dev/sdb1): ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐ │ Volume lógico1 15 GiB │ Volume lógico2 35 GiB │ Volume lógico3 200 GiB │ │ /dev/MeuGrupoVol/rootvol│ /dev/MeuGrupoVol/homevol│ /dev/MeuGrupoVol/mediavol│ └─────────────────────────┴─────────────────────────┴──────────────────────────┘
/dev/NomeGrupoVolume/NomeVolumeLogico
quanto pelo formato /dev/mapper/NomeGrupoVolume-NomeVolumeLogico
. Porém lvm(8) § VALID NAMES recomenda o primeiro formato para "softwares e scripts" (por exemplo fstab), pois o segundo é destinado ao "uso interno" e está sujeito a possivelmente "mudar entre lançamentos e distribuições".Vantagens
O LVM proporciona mais flexibilidade do que usar partições normais no disco rígido, pois permite:
- Usar qualquer quantidade de discos como se fosse um único grande disco;
- Ter volumes lógicos estendidos sobre vários discos (Como em RAID, que os volumes podem espelhar ou distribuir dados entre os discos. Tais opções podem oferecer vantagens como resiliência adicional e desempenho [1]);
- Criar pequenos volumes lógicos e estendê-los "dinamicamente" à medida em que eles forem ficando cheios;
- Redimensionar volumes lógicos independentemente da ordem que estão dispostos fisicamente no disco. Isto não depende da posição do LV dentro do VG, não havendo nem mesmo necessidade de liberar espaço disponível ao redor destes;
- Redimensionar/criar/excluir volumes lógicos e físicos online. Os sistemas de arquivos neles ainda precisam ser redimensionados, mas alguns (como Ext4 e Btrfs) suportam redimensionamento online;
- Migração de um LV (ou segmentos) em uso online/em tempo real por serviços para diferentes discos sem necessidade de reinicializar os serviços;
- Criação de snapshots que permitem o backup de uma cópia congelada de um sistema de arquivos, ao mesmo tempo que minimiza o tempo de indisponibilidade dos serviços e o snapshot pode ser facilmente mesclado/fundido ao volume original mais tarde;
- Suporte ao desbloqueio de volumes criptografados separados, sem necessidade de informar uma chave múltiplas vezes durante o boot ao criar um LVM dentro do LUKS.
- Suporte integrado de criação de cache dos dados usados frequentemente (lvmcache(7)).
Desvantagens
- Etapas adicionais em configurar o sistema (provavelmente requerendo ajustes na configuração de mkinitcpio) tornam o processo mais complicado. Precisa executar constantemente (múltiplos) daemons.
- Em dual boot, note que o Windows não suporta LVM; é impossibilitado o acesso de quaisquer partições LVM à partir do Windows. Softwares de terceiros talvez permitam a montagem de certos tipos de sistemas configurados com LVM. [2]
- Se seus volumes físicos não estão em uma RAID-1, RAID-5 ou RAID-6 um dos discos pode perder um ou mais volumes lógicos se você espalhar (ou expandir) seus volumes lógicos entre múltiplos discos não redundantes.
- Não é sempre fácil encolher o espaço usado pelo gerenciador de volumes lógicos, no caso os volumes físicos usados para os volumes lógicos. Se as extensões físicas são dispersas pelo volume físico até o final, você pode precisar inspecionar os segmentos e movê-los (potencialmente para outro dispositivo físico), ou mover o mesmo dispositivo com a alocação personalizada (por exemplo,
--alloc anywhere
). Se você quiser configurar dual boot com outros sistemas operacionais (em exemplo o Microsoft Windows), o único espaço restante no dispositivo com Microsoft Windows será o espaço não usado pelo LVM, ou o que não foi usado como um volume físico.
- Potencial piora de desempenho em comparação às partições simples. [3]
- Pode não funcionar bem com todos os sistema de arquivos, especialmente aqueles projetados para gestão de vários dispositivos. Por exemplo, Btrfs oferece algumas das mesmas funcionalidades (suporte a múltiplos dispositivos , (sub)volumes, snapshots e RAID), e com isso pode existir conflito (leia com mais profundidade sobre os problemas com snapshots em LVM com Btrfs).
Instalação
Certifique-se que o pacote lvm2 está instalado.
Se você tem volumes LVM não ativados via initramfs, ative o lvm2-monitor.service
, do qual é fornecido pelo pacote lvm2.
Operações com volumes
Volumes físicos
Criação
Ao criar o PV em /dev/sda1
, execute:
# pvcreate /dev/sda1
Você pode verificar se o PV foi criado ao usar o seguinte comando:
# pvs
Expansão
Ao estender, ou antes de reduzir, o tamanho de um dispositivo que possui um volume físico sobre ele, você precisará expandir ou encolher o PV usando pvresize(8).
Para expandir o PV em /dev/sda1
, logo após de aumentar a partição, execute:
# pvresize /dev/sda1
Com isso será automaticamente detectado o novo tamanho do dispositivo, e por fim o PV irá estender ao seu máximo.
Encolhimento
Para encolher um volume físico antes de reduzir seu dispositivo subjacente, adicione os parâmetros --setphysicalvolumesize tamanho_aqui
no comando. Em exemplo:
# pvresize --setphysicalvolumesize 40G /dev/sda1
O comando acima talvez mostre-lhe o seguinte erro:
/dev/sda1: cannot resize to 25599 extents as later ones are allocated. 0 physical volume(s) resized / 1 physical volume(s) not resized
Ou de forma traduzida:
/dev/sda1: não foi possível redimensionar para 25599 extensões, pois há extensões posteriormente já alocadas. 0 volume(s) físico(s) redimensionados / 1 volume(s) físico(s) não redimensionado(s).
Realmente, pvresize se negará a encolher um PV se o mesmo estiver com as extensões alocadas após o local que as novas últimas alocações do volume deveriam estar. É necessário executar pvmove de antemão para realocá-las em outro lugar no grupo de volume, e para tal deve haver espaço livre disponível.
Movendo extensões físicas
Antes de liberar as extensões físicas que estão no final do volume, deve-se executar pvdisplay -v -m
para vê-las. Uma alternativa seria ver os segmentos de forma tabular com pvs --segments -v
.
No exemplo abaixo, há um volume físico em /dev/sdd1
, um grupo de volume como vg1
e um volume lógico chamado backup
.
# pvdisplay -v -m
Finding all volume groups. Using physical volume(s) on command line. --- Physical volume --- PV Name /dev/sdd1 VG Name vg1 PV Size 1.52 TiB / not usable 1.97 MiB Allocatable yes PE Size 4.00 MiB Total PE 399669 Free PE 153600 Allocated PE 246069 PV UUID MR9J0X-zQB4-wi3k-EnaV-5ksf-hN1P-Jkm5mW --- Physical Segments --- Physical extent 0 to 153600: FREE Physical extent 153601 to 307199: Logical volume /dev/vg1/backup Logical extents 1 to 153599 Physical extent 307200 to 307200: FREE Physical extent 307201 to 399668: Logical volume /dev/vg1/backup Logical extents 153601 to 246068
Observe que o espaço sinalizado como FREE
foi distribuído para outro local ao longo do volume. Nós devemos primeiramente mover todos os segmentos usados para o começo do volume.
Aqui o primeiro segmento livre é de 0 a 153600, desta forma são 153601 extensões livres. Nós agora podemos mover esse número de segmentos da última extensão física para a primeira extensão. O comando portanto será:
# pvmove --alloc anywhere /dev/sdd1:307201-399668 /dev/sdd1:0-92467
/dev/sdd1: Moved: 0.1 % /dev/sdd1: Moved: 0.2 % ... /dev/sdd1: Moved: 99.9 % /dev/sdd1: Moved: 100.0 %
- Este comando move 399668 - 307201 + 1 = 92468 PEs do último segmento até o primeiro segmento. Isto é possível porque o primeiro segmento contém 153600 PEs livres, do qual pode alocar os PEs movidos, ou seja, 92467 - 0 + 1 = 92468.
- A opção
--alloc anywhere
é usada enquanto movemos os PEs para dentro da mesma partição. Em caso de diferentes partições, o comando pode parecer-se com:# pvmove /dev/sdb1:1000-1999 /dev/sdc1:0-999
- A execução deste comando pode demorar (entre uma a duas horas) em caso de volumes extensos. É provável que seja uma boa ideia executar o comando em um tmux ou em uma sessão de GNU Screen. Qualquer parada indesejada do processo é capaz de ser fatal.
- Quando a operação for concluída, execute fsck para averiguar se o seu sistema de arquivos é válido.
Redimensionando um volume físico
Uma vez que todos os segmentos físicos livres estejam nas últimas extensões físicas, execute vgdisplay
com privilégios de root e veja sua PE livre.
Você pode agora executar novamente o comando:
# pvresize --setphysicalvolumesize tamanho VolumeFísico
Veja o resultado:
# pvs
PV VG Fmt Attr PSize PFree /dev/sdd1 vg1 lvm2 a-- 1t 500g
Redimensionando a partição
Por fim, você deve diminuir a partição com sua ferramenta de particionamento favorita.
Grupos de volume
Criando um grupo de volume
Para criar uma VG MeuGrupoVol
com um PV associado ao /dev/sdb1
, execute:
# vgcreate MeuGrupoVol /dev/sdb1
Você pode verificar se foi criado o VG MeuGrupoVol
usando o seguinte comando:
# vgs
Você pode vincular múltiplos PVs ao criar um VG como este:
# vgcreate MeuGrupoVol /dev/sdb1 /dev/sdb2
Ativando um grupo de volume
auto_activation_volume_list
em /etc/lvm/lvm.conf
. Em caso de dúvida, mantenha esta opção comentada.# vgchange -a y MeuGrupoVol
Por padrão, quando aplicável, isto vai reativar o grupo de volume. Por exemplo, quando houve uma falha de um drive espelho e você fez a substituição da unidade e executou os passos: (1) pvcreate
, (2) vgextend
e (3) vgreduce --removemissing --force
.
Reparando um grupo de volume
Para começar o processo de reconstrução do arranjo (array) deteriorado de um espelhamento neste exemplo, você deve executar:
# lvconvert --repair /dev/MeuGrupoVol/mirror
Você pode monitorar o processo de reconstrução (Cpy%Sync Column output) com:
# lvs -a -o +devices
Desativando um grupo de volume
Apenas invoque:
# vgchange -a n MeuGrupoVol
Isto irá desativar o grupo de volume e permitir-lhe a desmontagem do contêiner que está armazenando-o.
Renomeando um grupo de volume
Use o comando vgrename(8) para renomear um grupo de volume existente.
Ambos os comandos a seguir renomeiam o grupo de volume existente de MeuGrupoVol
para meu_grupo_volume
:
# vgrename /dev/MeuGrupoVol /dev/meu_grupo_volume
# vgrename MeuGrupoVol meu_grupo_volume
Garanta a atualização de todos os arquivos de configuração (por exemplo /etc/fstab
ou /etc/crypttab
) que referenciam o grupo de volume renomeado.
Adicionando um volume físico em um grupo de volume
Primeiro, crie um novo volume físico no bloco do dispositivo que você deseja usar, então estenda o grupo de volume do mesmo:
# pvcreate /dev/sdb1 # vgextend MeuGrupoVol /dev/sdb1
Isto, é claro, irá aumentar o número total de extensões físicas no seu grupo de volume, e que podem ser alocadas por volumes lógicos da forma que você achar melhor.
8e
para MBR, e E6D6D379-F507-44C2-A23C-238F2A3DF928
para partições GPT.Removendo uma partição de um grupo de volume
Se você criou um volume lógico na partição, antes de tudo a remova
Todos os dados daquela partição precisam ser movidos para outra partição. Felizmente, LVM torna isto fácil:
# pvmove /dev/sdb1
Se você quiser mover os dados para um volume físico em específico, determine o armazenamento de destino como o segundo argumento em pvmove
:
# pvmove /dev/sdb1 /dev/sdf1
E então o volume físico precisa ser removido do grupo de volume:
# vgreduce MeuGrupoVol /dev/sdb1
Ou remova todos os volumes físicos vazios:
# vgreduce --all MeuGrupoVol
Por exemplo: Se você tiver um disco ruim em um grupo que não pode ser encontrado porque ele foi removido ou apresenta falha:
# vgreduce --removemissing --force MeuGrupoVol
E finalmente, se você quiser usar a partição para outra coisa, e quer evitar que o LVM pense que a partição é um volume físico:
# pvremove /dev/sdb1
Volumes lógicos
-r
/--resizefs
que permite redimensionar o sistema de arquivos em conjunto do LV ao usar fsadm(8) (com suporte a ext2, ext3, ext4, ReiserFs e XFS). Portanto, pode ser mais fácil e simples usar lvresize
para ambas as operações e usar --resizefs
para simplificar um pouco as coisas. A não ser que você tenha necessidades específicas ou queira total controle sobre o processo.-l 100%FREE
, isto pode ser alcançado ao reduzir o tamanho com lvreduce -L -256M grupo_volume/volume_logico
.Criando um volume lógico
Para criar um LV homevol
em um VG MeuGrupoVol
com 300 GiB de capacidade, execute:
# lvcreate -L 300G MeuGrupoVol -n homevol
Ou para criar um LV homevol
em um VG MeuGrupoVol
com o restante da capacidade, execute:
# lvcreate -l 100%FREE MeuGrupoVol -n homevol
Para criar o LV enquanto o restringe para PVs específicos em um determinado VG, acrescente os volumes físicos ao comando:
# lvcreate -L 300G MeuGrupoVol -n homevol /dev/sda1
O novo LV irá aparecer como /dev/MeuGrupoVol/homevol
. Agora você pode formatar o LV com um sistema de arquivos apropriado.
Você pode verificar o LV criado usando o seguinte comando:
# lvs
Renomeando um volume lógico
Para renomear um volume lógico existente, use o comando lvrename(8).
Ambos os comandos a seguir renomeiam o volume lógico vol_velho
no grupo de volume MeuGrupoVol
para vol_novo
.
# lvrename /dev/MeuGrupoVol/vol_velho /dev/MeuGrupoVol/vol_novo
# lvrename MeuGrupoVol vol_velho vol_novo
Garanta a atualização de todos os arquivos de configuração (por exemplo /etc/fstab
ou /etc/crypttab
) que referenciam o volume lógico renomeado.
Redimensionando um volume lógico e um sistema de arquivos de uma só vez
Estenda o volume lógico mediavol
em MeuGrupoVol
para 10 GiB e redimensione o sistema de arquivos de uma só vez:
# lvresize -L +10G --resizefs MeuGrupoVol/mediavol
Defina o tamanho do volume lógico mediavol
em MeuGrupoVol
para 15 GiB e redimensione o sistema de arquivos de uma só vez:
# lvresize -L 15G --resizefs MeuGrupoVol/mediavol
Se você quiser encher todo o espaço livre disponível no grupo de volume, use o seguinte comando:
# lvresize -l +100%FREE --resizefs MeuGrupoVol/mediavol
Veja lvresize(8) para mais opções detalhadas.
Redimensionando o volume lógico e o sistema de arquivos separadamente
Para sistemas de arquivos não suportados por fsadm(8), será necessário usar utilitários apropriados para redimensionar o sistema de arquivos antes de encolher o volume lógico ou depois de expandi-lo.
Para estender um volume lógico mediavol
por dentro de um grupo de volume MeuGrupoVol
para 2 GiB sem encostar no sistema de arquivos:
# lvresize -L +2G MeuGrupoVol/mediavol
Agora expanda o sistema de arquivos (Ext4 neste exemplo) para o tamanho máximo do volume lógico subjacente:
# resize2fs /dev/MeuGrupoVol/mediavol
Para Btrfs, o btrfs-filesystem(8) espera o ponto de montagem ao invés do dispositivo. O equivalente seria:
# btrfs filesystem resize max /mnt/meu-ponto-de-montagem
Para reduzir o tamanho do volume lógico mediavol
em MeuGrupoVol
para 500 MiB, primeiramente calcule o tamanho resultante do sistema de arquivos, em seguida encolha o sistema de arquivos (Ext4 neste exemplo) para o novo tamanho:
# resize2fs /dev/MeuGrupoVol/mediavol NovoTamanho
Ao contrário do Ext4, Btrfs oferece suporte ao encolhimento online (novamente, o ponto de montagem deverá ser especificado). Por exemplo:
# btrfs filesystem resize -500M /mnt/meu-ponto-de-montagem
Quando o sistema de arquivos for encolhido, reduza o tamanho do volume lógico:
# lvresize -L -500M MeuGrupoVol/mediavol
Para calcular o exato tamanho do volume lógico para os sistemas de arquivos ext2, ext3, ext4, use uma formula simples:
LVM_EXTENTS = FS_BLOCKS × FS_BLOCKSIZE ÷ LVM_EXTENTSIZE
.
Ou de forma traduzida:
LVM_EXTENSÕES = SA_BLOCOS × SA_TAMANHO-DO-BLOCO ÷ LVM_TAMANHO-DA-EXTENSÃO
.
# tune2fs -l /dev/MeuGrupoVol/mediavol | grep Block
Block count: 102400000 Block size: 4096 Blocks per group: 32768
# vgdisplay MeuGrupoVol | grep "PE Size"
PE Size 4.00 MiB
102400000 blocos × 4096 bytes/blocos ÷ 4 MiB/extensões = 100000 extensões
Ao passar --resizefs
será confirmado com a correção.
# lvreduce -l 100000 --resizefs /dev/MyVolGroup/mediavol
... The filesystem is already 102400000 (4k) blocks long. Nothing to do! ... Logical volume sysvg/root successfully resized.
Ou de forma traduzida:
# lvreduce -l 100000 --resizefs /dev/MeuGrupoVol/mediavol
... O sistema de arquivos já está alongado para 102400000 (4k) blocos. Não há nada para fazer! ... Volume lógico sysvg/root foi redimensionado com sucesso.
Veja lvresize(8) para mais opções detalhadas.
Removendo um volume lógico
Primeiro, encontre o nome do volume lógico que você quer remover. Você pode pegar uma lista de todos os volumes lógicos presentes com:
# lvs
Depois, procure o ponto de montagem do volume lógico escolhido:
$ lsblk
Então, desmonte o sistema de arquivos do volume lógico:
# umount /ponto-de-montagem
Por fim, remova o volume lógico:
# lvremove grupo_volume/volume_logico
Por exemplo:
# lvremove MeuGrupoVol/homevol
Confirme a operação digitando y
.
Garanta a atualização de todos os arquivos de configuração (por exemplo /etc/fstab
ou /etc/crypttab
) que referenciam o volume lógico removido.
Você pode verificar a remoção do volume lógico ao digitar lvs
como root novamente (veja o primeiro passo desta seção).
Snapshots
LVM permite suporte aos CoW snapshots (Cópia em Gravação, do inglês Copy-on-Write). Um CoW snapshot inicialmente cria um apontamento para os dados originais; quando os blocos de dados são sobrescritos a cópia original permanece intacta, enquanto que os novos blocos são gravados em outro lugar no disco. Isto possui diversas propriedades cobiçáveis:
- Criar um snapshot é rápido, pois não há cópia de dados (apenas cria uma lista bem curta de ponteiros, dos quais apontam para outras localizações no disco).
- Snapshots requerem apenas o espaço livre suficiente para armazenar os novos blocos de dados (mais uma quantidade de armazenamento, entretanto negligenciável, para o apontamento de novos blocos). Por exemplo, para um snapshot de 35 GiB se utiliza apenas 2 GiB (incluso os dados do ponto de origem e do snapshot), portanto requer apenas 2 GiB de espaço livre.
Os snapshots do LVM estão a nível de bloco; eles criam um novo dispositivo de bloco sem aparente relação com o original, exceto ao lidar com as ferramentas do LVM, logo, ao deletar arquivos na cópia original não será liberado espaço nos snapshots. Se você precisa de snapshots a nível de sistema de arquivos, é necessário que use btrfs, ZFS ou bcachefs.
- Um CoW snapshot não é um backup porque o mesmo não faz uma segunda cópia dos dados originários. Como exemplo, um setor danificado do disco que afete os dados originais também afetará os snapshots. Com isto dito, um snapshot pode ser útil enquanto outra ferramenta gerencia um backup, como destacado logo abaixo.
- Btrfs espera que diferentes sistemas de arquivos tenham diferentes UUIDs. Se você tirar um snapshot de um volume LVM que contem um sistema de arquivos btrfs, lembre-se de alterar o UUID do sistema de arquivos original ou da cópia antes de ambos serem montados (ou faça ser visível para o kernel; em exemplo, em caso de um daemon sem relação engatilhar um escaneamento do dispositivo btrfs). Para detalhes veja sobre btrfs na wiki Gotcha's.
Configuração
É criado um snapshot de volumes lógicos da mesma forma que cria-se volumes lógicos normais.
# lvcreate --size 100M --snapshot --name snap01vol /dev/MeuGrupoVol/lvol
Com este volume você pode modificar menos que 100 MiB de dados, antes que o volume de snapshot encha por completo.
A reversão do volume lógico lvol
modificado para o estado que o snapshot snap01vol
foi criado pode ser feita com:
# lvconvert --merge /dev/MyVolGroup/snap01vol
Em caso do volume lógico original estar ativo, haverá uma mesclagem no próximo reboot (esta fusão pode ser feita a partir de um LiveCD).
Além disso, múltiplos snapshots podem ser tirados e cada um pode ser mesclado com o volume lógico original à vontade.
Backups
Um snapshot fornece uma cópia congelada de um sistema de arquivos para a criação de backups. Por exemplo, um backup que leve duas horas fornece uma maior consistência de imagem do sistema de arquivos, isto em comparação a um backup feito diretamente na partição.
O snapshot pode ser montado e feito o backup com dd ou tar. O tamanho do arquivo de backup feito pelo dd será igual ao tamanho dos arquivos que residem no volume de snapshot.
Para restauração é preciso apenas criar um snapshot, montá-lo, gravar ou extrair o backup nele, e por fim mesclar/fundir com a origem.
Veja a página em inglês sobre Criação de snapshots do sistema de arquivos root com LVM para automatizar a criação e limpeza de snapshots do root, além de criar durante o processo de inicialização do sistema os backups ou os rollbacks (reversões).
Criptografia
Veja os tópicos LVM dentro do LUKS e LUKS dentro do LVM para conhecer os possíveis esquemas ao combinar LUKS com LVM.
Cache
De lvmcache(7):
- O cache de volumes lógicos usa um LV pequeno e rápido para melhorar o desempenho de um LV grande e lento. Isto é feito armazenando os blocos usados frequentemente em um LV mais rápido. O LVM então refere-se ao LV pequeno e rápido como um LV de cache. O LV grande e lento é chamado de LV de origem. Devido às requisições do dm-cache (o driver do kernel), o LVM divide adicionalmente o LV de cache em dois dispositivos - um LV de cache de dados e um LV de cache de metadados. O LV de cache de dados é o local onde cópias dos blocos de dados são mantidos à partir do LV de origem para aumentar a velocidade. O LV de cache de metadados mantém informações que especificam onde os blocos de dados estão armazenados (por exemplo, no LV de origem ou no LV de cache de dados). Usuários devem familiarizar-se com esses LVs se desejarem criar volumes de cache melhores e mais robustos. Todos estes LVs associados devem residir no mesmo VG.
Criar cache
Converta seu disco rápido (/dev/disco-rápido
) para um PV e adicione-o ao seu VG (MeuGrupoVol
) existente:
# vgextend MeuGrupoVol /dev/disco-rápido
Crie uma área de cache com metadado automático em dev/disco-rápido
e converta o LV existente MeuGrupoVol/rootvol
para um volume de cache. Tudo isso é feito em um único passo:
# lvcreate --type cache --cachemode writethrough -l 100%FREE -n root_cachepool MeuGrupoVol/rootvol /dev/disco-rápido
-l 100%FREE
para alocar 100% do espaço disponível do PV /dev/disco-rápido
, você poderia usar -L 20G
para alocar apenas 20 GiB para a área de cache.O modo de cache (do inglês Cachemode) possui duas possibilidades de opções:
writethrough
garante que quaisquer dados escritos serão armazenados no LV de cache e no LV de origem. A perda do dispositivo associado ao LV de cache, neste caso, não significará a perda de quaisquer dados.writeback
garante melhor desempenho, ao custo de maior risco de perda de dados em caso do dispositivo usado para cache falhar.
Se não for indicado um --cachemode
específico, o sistema irá assumir a opção writethrough
por padrão.
Remover cache
Se por algum motivo você precisar desfazer a operação de criação acima:
# lvconvert --uncache MeuGrupoVol/rootvol
Isto sujeita qualquer escrita ainda pendente no cache de volta para o LV de origem, e então o deleta. Outras opções disponíveis são descritas em lvmcache(7).
RAID
LVM pode ser usado para criar um RAID em software. É uma boa escolha se o usuário não tiver RAID em hardware e já estava planejando usar LVM de qualquer forma. De lvmraid(7):
- lvm(8) RAID é uma maneira de criar um volume lógico (LV) que usa múltiplos dispositivos físicos para aumentar performance ou tolerar falhas em dispositivos. Em LVM, os dispositivos físicos são, na verdade, volumes físicos (PVs) em um único grupo de volume (VG).
LVM RAID tem suporte para RAID 0, RAID 1, RAID 4, RAID 5, RAID 6 e RAID 10. Veja em Wikipedia:Standard RAID levels para conhecer os detalhes de cada nível.
Configurando RAID
Crie os volumes físicos:
# pvcreate /dev/sda2 /dev/sdb2
Crie um grupo de volume nos volumes físicos:
# vgcreate MeuGrupoVol /dev/sda2 /dev/sdb2
Novos volumes
Crie os volumes lógicos com lvcreate --type raidnível
. Veja lvmraid(7) e lvcreate(8) para mais opções.
# lvcreate --type RaidNível [OPTIONS] -n Nome -L Tamanho VG [PVs]
RAID 0
Por exemplo:
# lvcreate -n meuraid1vol -i 2 -I 64 -L 70G GrupoVol00 /dev/nvme1n1p1 /dev/nvme0n1p1
O comando acima irá criar e separar 70 GiB (raid0) do volume lógico nomeado como "meuraid1vol" em GrupoVol00. A disjunção dos dados será distribuída entre /dev/nvme1n1p1
e /dev/nvme0n1p1
. O tamanho de cada parte dividida está definido para ser 64K.
RAID 1
Por exemplo:
# lvcreate --type raid1 --mirrors 1 -L 20G -n meuraid1vol MeuGrupoVol /dev/sda2 /dev/sdb2
O comando acima irá criar um volume lógico espelhado, nomeado como "meuraid1vol" em GrupoVol00, com 20 GiB de dados em /dev/sda2
e /dev/sdb2
.
RAID 10
Por exemplo:
# lvcreate -n meuraid1vol -L 100G --type raid10 -m 1 -i 2 MeuGrupoVol /dev/sdd1 /dev/sdc1 /dev/sdb1 /dev/sda5
O comando acima irá criar um volume lógico RAID10 de 100 GiB, nomeado como "meuraid1vol" em GrupoVol00, entre /dev/sdd1
, /dev/sdc1
, /dev/sdb1
e /dev/sda5
.
Volumes existentes
Você pode converter facilmente um volume "não RAID" (por exemplo, linear) para basicamente qualquer configuração raid, contanto que você tenha dispositivos físicos suficientes para satisfazer os critérios de criação de RAID. Alguns irão requisitar seguir passos intermediários, do qual o comando lvconvert
informará a você na linha de comando para aceitar. O raid10
abaixo pode ser substituído por raid0
, raid1
, raid5
, etc.
# lvconvert --type raid10 /dev/vg01/lv01
Para usar PVs específicos:
# lvconvert --type raid10 /dev/vg01/lv01 /dev/sda1 /dev/sdb2 /dev/nvme0n1p1 ...
Você pode rastrear o processo de conversão com:
# watch lvs -o name,vg_name,copy_percent
Provisionamento fino
discard
ou usar fstrim regularmente para permitir que o LV fino encolha a medida que arquivos forem deletados.De lvmthin(7):
- Blocos em um volume lógico (LV) padrão lvm(8) são alocados a partir do momento que o LV é criado, porém blocos em um LV de provisionamento fino são alocados a medida que há a escritura/gravação dos dados. Por conta disto, é oferecido para um LV de provisão fina um tamanho virtual, e o mesmo pode ser maior do que é fisicamente disponibilizado no armazenamento. A quantidade de armazenamento físico providenciada para LVs de provisão fina pode ao decorrer do tempo aumentar a medida que for necessário.
Exemplo: implementando servidores privados virtuais
Aqui vai um caso clássico de uso. Suponha que você queira começar seu próprio serviço de VPS, inicialmente hospedando cerca de 100 VPSes em um único computador com disco rígido de 930 GiB. Dificilmente qualquer um dos VPSes irá realmente usar todo o armazenamento que eles foram alocados, então ao invés de alocar 9 GiB para cada VPS, você poderia permitir que cada VPS tenha um tamanho máximo de 30 GiB e que usem provisionamento fino para somente alocar o espaço que cada VPS estará de fato usando no disco rígido. Presuma que o disco rígido de 930 GiB é /dev/sdb
. Esta seria a configuração:
Prepare o grupo de volume, MeuGrupoVol
.
# vgcreate MeuGrupoVol /dev/sdb
Crie a área fina (ou, do inglês pool) do LV, MeuPoolFino
. Este LV irá providenciar os blocos para armazenamento.
# lvcreate --type thin-pool -n MeuPoolFino -l 95%FREE MeuGrupoVol
A pool é composta de dois sub-volumes, o LV de dado e o LV de metadado; este comando cria ambos automaticamente, porém o espaço fino para de funcionar se ambos encherem completamente, e atualmente LVM não possui suporte para encolhimento de nenhum destes volumes. É por isso que o comando acima permite 5% de espaço extra, em caso de você precisar eventualmente expandir os sub-volumes de dado ou de metadado da área fina.
Para cada VPS, crie um LV fino. Este é o dispositivo de bloco exposto ao usuário para a partição root.
# lvcreate -n AlgunsClientesRoot -V 30G --thinpool MeuPoolFino MeuGrupoVol
O dispositivo de bloco /dev/MeuGrupoVol/AlgunsClientesRoot
pode então ser usado por uma instância de VirtualBox como partição root.
Usando snapshots finos para salvar mais espaço
Snapshots finos são muito mais poderosos do que snapshots convencionais, por conta de serem propriamente LVs finos. Veja o guia da Red Hat [4] para uma lista completa de vantagens que estes snapshots possuem.
Ao invés de instalar um Linux do zero toda vez que um VPS é criado, é mais eficiente em espaço começar com apenas um LV fino contendo uma instalação básica do Linux:
# lvcreate -n RootGenérico -V 30G --thinpool MeuPoolFino MeuGrupoVol *** instalado um Linux em /dev/MeuGrupoVol/RootGenérico ***
Então crie snapshots disso para cada VPS:
# lvcreate -s MeuGrupoVol/RootGenérico -n AlgunsClientesRoot
Desta forma, na área fina há apenas uma cópia de dado comum para todos os VPSes, pelo menos inicialmente. Como uma adição bônus, a criação de um novo VPS é instantânea.
Em razão destes snapshots serem finos, uma operação de escrita em RootGenérico
faz apenas uma operação CoW no total, em vez de uma operação CoW por snapshot. Isto permite-lhe atualizar o RootGenérico
de maneira mais eficiente do que se cada VPS fosse um snapshot regular.
Exemplo: atualização de armazenamento com zero tempo de inatividade (zero-downtime)
Existem aplicações de provisionamento fino por fora de uma hospedagem VPS, e existe um jeito de como você pode usá-las para crescer efetivamente a capacidade de um sistema de arquivos previamente montado, sem precisar desmontá-lo. Suponha, de novo, que o servidor possui somente um disco rígido de 930 GiB. A configuração é a mesma feita para a hospedagem de VPS, exceto que há somente um LV fino e o tamanho do LV é muito maior do que o tamanho da área fina.
# lvcreate -n MeuLVFino -V 16T --thinpool MeuPoolFino MeuGrupoVol
Este espaço virtual extra pode ser preenchido com um armazenamento real mais tarde, ao estender a pool fina.
Presuma agora que, depois de um certo tempo, uma atualização de armazenamento é necessária, e o novo disco rígido, /dev/sdc
, está conectado ao servidor. Para atualizar a capacidade da área fina, adicione o novo disco rígido ao VG:
# vgextend MeuGrupoVol /dev/sdc
Agora, estenda a pool fina:
# lvextend -l +95%FREE MeuGrupoVol/MeuPoolFino
Em razão do tamanho do LV fino ser de 16 TiB, você poderia adicionar outro disco rígido com espaço de 15.09 TiB antes de finalmente precisar desmontar e redimensionar o sistema de arquivos.
Customização
Algumas customizações estão disponíveis ao editar /etc/lvm/lvm.conf
. Você talvez ache útil customizar a saída de lvs
e pvs
, que por padrão não incluem a sincronização em % (vantajoso para ver o progresso de conversão entre, por exemplo, um volume linear para um tipo raid) e o tipo de volume lógico.
/etc/lvm/lvm.conf
report { lvs_cols = "lv_name,lv_attr,lv_active,vg_name,lv_size,lv_layout,lv_allocation_policy,copy_percent,chunk_size" pvs_cols = "pv_name,vg_name,pv_size,pv_free,pv_used,dev_size" }
Solução de problemas
Comandos de LVM não funcionam
- Carregue o módulo adequado:
# modprobe dm_mod
O módulo dm_mod
deveria ser automaticamente carregado. No caso de não acontecer, carregue o módulo durante o boot.
- Tente antecipar comandos com lvm desta forma:
# lvm pvdisplay
Volumes lógicos não aparecem
Se você está tentando montar volumes lógicos existentes, porém não aparecem em lvscan
, você pode usar os comandos a seguir para ativá-los:
# vgscan # aay
LVM em mídia removível
Sintomas:
# vgscan
Reading all physical volumes. This may take a while... /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836585984: Input/output error /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836643328: Input/output error /dev/backupdrive1/backup: read failed after 0 of 4096 at 0: Input/output error /dev/backupdrive1/backup: read failed after 0 of 4096 at 4096: Input/output error Found volume group "backupdrive1" using metadata type lvm2 Found volume group "networkdrive" using metadata type lvm2
Ou de forma traduzida:
# vgscan
Lendo todos os volumes físicos. Isto pode levar um tempo... /dev/backupdrive1/backup: leitura falhou logo após 0 de 4096 em 319836585984: erro de Entrada/Saída /dev/backupdrive1/backup: leitura falhou logo após 0 de 4096 em 319836643328: erro de Entrada/Saída /dev/backupdrive1/backup: leitura falhou logo após 0 de 4096 em 0: erro de Entrada/Saída /dev/backupdrive1/backup: leitura falhou logo após 0 de 4096 em 4096: erro de Entrada/Saída Encontrado grupo de volume "backupdrive1" usando metadata tipo lvm2 Encontrado grupo de volume "networkdrive" usando metadata tipo lvm2
Causa: remover um drive LVM externo sem desativar o(s) grupo(s) de volume antes. Antes de desconectar, se assegure de fazer:
# vgchange -an nome_grupo_volume
Correção: supondo que você já tentou ativar o grupo de volume com vgchange -ay vg
, e está recebendo erros de Entrada/Saída:
# vgchange -an nome_grupo_volume
Desconecte o dispositivo externo e espere alguns minutos:
# vgscan # vgchange -ay nome_grupo_volume
Suspensão/retorno com LVM e mídia removível
Para que o LVM funcione adequadamente com mídias removíveis - como em uma unidade USB externa - o grupo de volume da unidade externa precisa ser desativado antes de suspender. Se isso não for feito, você pode acabar com erros de Entrada/Saída no buffer do dispositivo mapeado (após o retorno). Por esta razão, não é recomendado misturar drives externos com internos no mesmo grupo de volume.
Para automaticamente desativar os grupos de volume com unidades USB externas, marque cada um dos grupos de volume com a tag sleep_umount
, sendo desta forma:
# vgchange --addtag sleep_umount vg_externo
Uma vez que a marcação é definida, use o seguinte arquivo unit do systemd para desativar apropriadamente os volumes antes da suspensão. Ao retornar o sistema, os drives serão automaticamente ativados pelo LVM.
/etc/systemd/system/ext_usb_vg_desativar.service
[Unit] Description=Desativar grupos de volume de USB externo ao suspender Before=sleep.target [Service] Type=oneshot ExecStart=-/etc/systemd/system/desativar_sleep_vgs.sh [Install] WantedBy=sleep.target
Este é o script:
/etc/systemd/system/deactivate_sleep_vgs.sh
#!/bin/sh TAG=@sleep_umount vgs=$(vgs --noheadings -o vg_name $TAG) echo "Desativando grupos de volume com a tag $TAG: $vgs" # Desmonte volumes lógicos que pertencem ao grupos de volumes com a tag $TAG for vg in $vgs; do for lv_dev_path in $(lvs --noheadings -o lv_path -S lv_active=active,vg_name=$vg); do echo "Desmontando volume lógico $lv_dev_path" umount $lv_dev_path done done # Desative grupos de volumes marcados com sleep_umount for vg in $vgs; do echo "Desativando grupo de volume $vg" vgchange -an $vg done
Por fim, ative a unit.
Redimensionando um volume lógico contíguo que falha
Se estiver tentando estender um volume lógico e houver erros com:
" Insufficient suitable contiguous allocatable extents for logical volume "
Ou de forma traduzida:
" Extensões alocáveis contíguas e adequadas insuficientes para o volume lógico "
A razão é que o volume lógico foi criado com uma restrição explícita (ou, do inglês policy) de alocação contígua (definido por opções como -C y
ou --alloc contiguous
), e nenhuma extensão contígua adjacente está disponível. [5]
Para corrigir, principalmente para estender o volume lógico, modifique a restrição de alocação com lvchange --alloc inherit volume_lógico
. Se você precisar manter a restrição de alocação contígua, uma alternativa seria mover o volume para uma área do disco com extensões livres suficientes. Veja [6].
Comando "grub-mkconfig" reporta erros de "unknown filesystem"
Lembre-se de remover volumes snapshot antes de gerar o grub.cfg, pois GRUB não conseguirá reconhecer estes volumes como um sistema de arquivos.
Tempo de volume root com dispositivo de provisão fina expira (time out)
Com um grande número de snapshots, thin_check
executará por um tempo longo o suficiente para que o tempo de espera pelo dispositivo root expire. Para compensar isso, adicione o parâmetro de inicialização do kernel rootdelay=60
nas configurações do seu bootloader. Ou faça com que thin_check
pule a verificação de mapeamento de blocos (veja [7]) e gere novamente o initramfs:
/etc/lvm/lvm.conf
thin_check_options = [ "-q", "--clear-needs-check-flag", "--skip-mappings" ]
Lentidão ao desligar
Se você usa RAID, snapshots ou provisionamento fino e estiver experienciando uma lentidão ao desligar, garanta que lvm2-monitor.service
esteja iniciado. Veja FS#50420.
Hibernação em um volume swap de provisionamento fino
Veja em Gestão de energia#hibernação em volume LVM de provisionamento fino.