Table of Contents

Expansão de Volumes Lógicos

Cenário

Este tutorial descreve como aumentar um volume lógico (LV) em uma VM no ambiente KVM, usando `Terraform` para criar e configurar recursos. O processo envolve configurar e redimensionar discos, volumes físicos (PVs), grupos de volumes (VGs), e volumes lógicos (LVs), com explicações detalhadas em cada etapa.

Ambiente KVM

Este bloco apresenta o ambiente configurado com Terraform para provisionar a VM no KVM. Os principais componentes e arquivos de configuração, como `main.tf` e `cloud_init.yml`, são listados abaixo.

main.tf

O código do Terraform define o provider `libvirt`, o volume da VM, o disco de inicialização com `cloud-init` e outros parâmetros de configuração da VM, como CPU, memória e rede.

terraform {
  required_providers {
    libvirt = {
      source = "dmacvicar/libvirt"
    }
  }
}
 
provider "libvirt" {
  uri = "qemu:///system"
}
 
resource "libvirt_volume" "os_image" {
  name   = "file-server.qcow2"
  pool   = "default"
  source = "/home/gean/kvm/templates/ol8-amd64.qcow2"
  format = "qcow2"
}
 
data "template_file" "user_data" {
  template = file("${path.module}/cloud_init.yml")
}
 
resource "libvirt_cloudinit_disk" "cloudinit_resized" {
  name      = "cloudinit_resized.iso"
  user_data = data.template_file.user_data.rendered
  pool      = "default"
}
 
resource "libvirt_domain" "file-server" {
  name   = "file-server"
  memory = "2048"
  vcpu   = 2
 
  cpu {
    mode = "host-passthrough"
  }
 
  cloudinit = libvirt_cloudinit_disk.cloudinit_resized.id
 
  network_interface {
    network_name   = "default"
    wait_for_lease = true
  }
 
  console {
    type        = "pty"
    target_port = "0"
    target_type = "serial"
  }
 
  disk {
    volume_id = libvirt_volume.os_image.id
  }
 
  graphics {
    type        = "spice"
    listen_type = "none"
  }
}
 
output "ip" {
  value = libvirt_domain.file-server.network_interface[0].addresses[0]
}

cloud_init.yml

Este arquivo `cloud-config` realiza as seguintes tarefas: - Define o usuário `gean` com permissões `sudo` e chave SSH autorizada para login. - Configura o hostname da máquina virtual.

#cloud-config
 
users:
  - name: gean
    gecos: "Gean Martins"
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    shell: /bin/bash
    lock_passwd: false  
    ssh-authorized-keys:
      - ${file("~/.ssh/tfvms.pub")} 
 
ssh_pwauth: true  
 
chpasswd:
  list: |
     gean: $6$kp7ay8JwVMNBTlL1$xf/nfw3WWePI3PhzccOTaaNXiDVrhIBck6i4pKJ89897u3/xNbDXc5zf0LInnCN0HkP4A/jVbQVk3qTMt4hq/1 
  expire: false
 
 
runcmd:
  - hostnamectl set-hostname file-server

Criando a VM

Os comandos abaixo são executados para inicializar e aplicar a configuração do Terraform. Isso provisiona a VM com base nas configurações dos arquivos acima.

terraform init
terraform fmt
terraform validate
terraform plan
terraform apply

Exemplo de Saída: A saída mostra o IP alocado para a VM e confirma a criação com sucesso dos recursos definidos.

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
 
Outputs:
 
ip = "192.168.122.236"
virsh list
 Id   Name          State
-----------------------------
 2    file-server   running
virsh domblklist file-server
 Target   Source
-------------------------------------------------------
 vda      file-server.qcow2
 hdd      /home/gean/kvm/images/cloudinit_resized.iso

Adicionando um novo disco

Nesta seção, um novo disco é adicionado à VM usando o `virsh`. Este disco será usado para expandir o armazenamento disponível.

1. Criação do volume com `virsh vol-create-as`. 2. Anexação do disco com `virsh attach-disk`, especificando o caminho do novo volume criado.

Após essas operações, o comando `virsh domblklist` mostra os discos conectados à VM.

virsh vol-create-as --pool default --name file-server-vdb.img --capacity 4G --format raw
virsh attach-disk file-server /home/gean/kvm/images/file-server-vdb.img vdb --targetbus virtio --persistent
virsh domblklist file-server
 Target   Source
-------------------------------------------------------
 vda      file-server.qcow2
 vdb      /home/gean/kvm/images/file-server-vdb.img
 hdd      /home/gean/kvm/images/cloudinit_resized.iso

Configuração do Volume Físico (PV), Grupo de Volume (VG) e Volume Lógico (LV)

Agora, acessamos a VM para configurar o novo disco como um PV e adicioná-lo a um VG. Depois, criamos dois volumes lógicos para armazenar dados de diferentes categorias.

- Comandos `pvcreate` e `vgcreate` são usados para configurar e organizar os volumes. - Exemplo de Saída: Saídas dos comandos `pvs`, `vgdisplay` e `lvscan` confirmam a criação e status dos volumes.

ssh 192.168.122.236
lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1  364K  0 rom  
vda         252:0    0   16G  0 disk 
├─vda1      252:1    0    1G  0 part /boot
└─vda2      252:2    0   15G  0 part 
  ├─ol-root 253:0    0 13,4G  0 lvm  /
  └─ol-swap 253:1    0  1,6G  0 lvm  [SWAP]
vdb         252:16   0    4G  0 disk

PV

sudo pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.
sudo pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/vda2  ol lvm2 a--  <15,00g    0 
  /dev/vdb      lvm2 ---    4,00g 4,00g
sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               ol
  PV Size               <15,00 GiB / not usable 3,00 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              3839
  Free PE               0
  Allocated PE          3839
  PV UUID               9WR60T-6MiC-cHbu-yg18-I1rF-HweP-lua8SQ
 
  "/dev/vdb" is a new physical volume of "4,00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb
  VG Name               
  PV Size               4,00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               9Bi1OE-2gcz-TxdL-GOSe-t3K5-1T6F-HwGcDl
sudo pvscan
  PV /dev/vda2   VG ol              lvm2 [<15,00 GiB / 0    free]
  PV /dev/vdb                       lvm2 [4,00 GiB]
  Total: 2 [<19,00 GiB] / in use: 1 [<15,00 GiB] / in no VG: 1 [4,00 GiB]

VG

sudo vgcreate vg_data /dev/vdb 
  Volume group "vg_data" successfully created
sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree 
  ol        1   2   0 wz--n- <15,00g     0 
  vg_data   1   0   0 wz--n-  <4,00g <4,00g
sudo vgdisplay
  --- Volume group ---
  VG Name               vg_data
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <4,00 GiB
  PE Size               4,00 MiB
  Total PE              1023
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1023 / <4,00 GiB
  VG UUID               KBUt8C-fKSC-ZDon-nqeN-WiV8-iRmj-Ok077v
 
  --- Volume group ---
  VG Name               ol
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <15,00 GiB
  PE Size               4,00 MiB
  Total PE              3839
  Alloc PE / Size       3839 / <15,00 GiB
  Free  PE / Size       0 / 0   
  VG UUID               nzN2Od-uev2-w1WA-Vs8l-I1NT-AfXb-G4U414
sudo vgscan
  Found volume group "vg_data" using metadata type lvm2
  Found volume group "ol" using metadata type lvm2
sudo vgscan
  Found volume group "vg_data" using metadata type lvm2
  Found volume group "ol" using metadata type lvm2

LV

sudo lvcreate -L 2G -n alunos vg_data
  Logical volume "alunos" created.
sudo lvcreate -l 50%FREE -n professor vg_data
  Logical volume "professor" created.
sudo lvscan
  ACTIVE            '/dev/vg_data/alunos' [2,00 GiB] inherit
  ACTIVE            '/dev/vg_data/professor' [1020,00 MiB] inherit
  ACTIVE            '/dev/ol/swap' [1,60 GiB] inherit
  ACTIVE            '/dev/ol/root' [13,39 GiB] inherit
sudo lvs
  LV        VG      Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root      ol      -wi-ao----   13,39g                                                    
  swap      ol      -wi-ao----    1,60g                                                    
  alunos    vg_data -wi-a-----    2,00g                                                    
  professor vg_data -wi-a----- 1020,00m                                                    
sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg_data/alunos
  LV Name                alunos
  VG Name                vg_data
  LV UUID                ywjO8h-M1z9-Eu0T-oaNK-4SbB-mFVr-5sDxaB
  LV Write Access        read/write
  LV Creation host, time file-server, 2024-10-28 10:08:48 -0300
  LV Status              available
  # open                 0
  LV Size                2,00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
 
  --- Logical volume ---
  LV Path                /dev/vg_data/professor
  LV Name                professor
  VG Name                vg_data
  LV UUID                uODjZ2-32f8-pdRr-C79T-Yt2K-vHpr-nWDAzY
  LV Write Access        read/write
  LV Creation host, time file-server, 2024-10-28 10:09:45 -0300
  LV Status              available
  # open                 0
  LV Size                1020,00 MiB
  Current LE             255
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
 
  --- Logical volume ---
  LV Path                /dev/ol/swap
  LV Name                swap
  VG Name                ol
  LV UUID                inia4n-d9Cm-06Rv-IR9a-XYJN-eGRH-oRBvem
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2024-10-26 17:24:31 -0300
  LV Status              available
  # open                 2
  LV Size                1,60 GiB
  Current LE             410
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
 
  --- Logical volume ---
  LV Path                /dev/ol/root
  LV Name                root
  VG Name                ol
  LV UUID                amdq2F-cyMu-BBdS-PUWP-SA0Y-krRj-IXHF7Y
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2024-10-26 17:24:31 -0300
  LV Status              available
  # open                 1
  LV Size                13,39 GiB
  Current LE             3429
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

Montando os volumes

Os volumes são formatados com o sistema de arquivos XFS e montados em diretórios específicos.

sudo mkfs.xfs /dev/vg_data/alunos 
meta-data=/dev/vg_data/alunos    isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
sudo mkfs.xfs /dev/vg_data/professor 
meta-data=/dev/vg_data/professor isize=512    agcount=4, agsize=65280 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=261120, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1566, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
sudo mkdir /mnt/alunos
sudo mkdir /mnt/professor
sudo mount /dev/vg_data/alunos /mnt/alunos/
sudo mount /dev/vg_data/professor /mnt/professor/
df -h
Filesystem                     Size  Used Avail Use% Mounted on
devtmpfs                       870M     0  870M   0% /dev
tmpfs                          890M     0  890M   0% /dev/shm
tmpfs                          890M  8,5M  881M   1% /run
tmpfs                          890M     0  890M   0% /sys/fs/cgroup
/dev/mapper/ol-root             14G  2,9G   11G  22% /
/dev/vda1                     1014M  201M  814M  20% /boot
tmpfs                          178M     0  178M   0% /run/user/1001
/dev/mapper/vg_data-alunos     2,0G   47M  2,0G   3% /mnt/alunos
/dev/mapper/vg_data-professor 1014M   40M  975M   4% /mnt/professor

Expandindo um LV

Nesta etapa, o volume lógico do professor é expandido e o sistema de arquivos é redimensionado usando `xfs_growfs`.

Simulação de Dados no LV

Para demonstrar o redimensionamento, o comando `dd` é utilizado para preencher o volume com dados simulados.

sudo dd if=/dev/urandom of=/mnt/professor/file-01.txt bs=1M count=900
900+0 records in
900+0 records out
943718400 bytes (944 MB, 900 MiB) copied, 10,0879 s, 93,5 MB/s
sudo df -h | grep professor
/dev/mapper/vg_data-professor 1014M  940M   75M  93% /mnt/professor

Expandindo o LV

1. Expansão do LV: o comando `lvextend` aumenta o LV do professor. 2. Redimensionamento do Sistema de Arquivos: `xfs_growfs` ajusta o sistema de arquivos para aproveitar o novo tamanho do LV.

sudo vgs | grep vg_data
  vg_data   1   2   0 wz--n-  <4,00g 1,00g
sudo lvextend -L +512M /dev/vg_data/professor 
  Size of logical volume vg_data/professor changed from 1020,00 MiB (255 extents) to <1,50 GiB (383 extents).
  Logical volume vg_data/professor successfully resized.
sudo lvdisplay vg_data/professor
  --- Logical volume ---
  LV Path                /dev/vg_data/professor
  LV Name                professor
  VG Name                vg_data
  LV UUID                uODjZ2-32f8-pdRr-C79T-Yt2K-vHpr-nWDAzY
  LV Write Access        read/write
  LV Creation host, time file-server, 2024-10-28 10:09:45 -0300
  LV Status              available
  # open                 1
  LV Size                <1,50 GiB
  Current LE             383
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
sudo df -h | grep professor
/dev/mapper/vg_data-professor 1014M  940M   75M  93% /mnt/professor

Redimensione o sistema de arquivos XFS com `xfs_growfs`:

sudo xfs_growfs /mnt/professor
meta-data=/dev/mapper/vg_data-professor isize=512    agcount=4, agsize=65280 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=261120, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1566, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 261120 to 392192
sudo df -h | grep professor
/dev/mapper/vg_data-professor  1,5G  944M  583M  62% /mnt/professor

Expansão do Armazenamento

Para aumentar o armazenamento ainda mais, um novo disco é adicionado e configurado como PV e, em seguida, incluído ao VG existente.

1. Criação e Anexação do Novo Disco: Adiciona-se um novo volume com `virsh vol-create-as` e o anexa à VM. 2. Expansão do VG e LV: O `vgextend` é usado para expandir o VG com o novo PV, e o `lvextend` amplia o LV `professor`.

O sistema de arquivos é redimensionado com `xfs_growfs` para aproveitar o novo espaço.

Adicionar um Novo Disco ao Sistema

exit
logout
Connection to 192.168.122.236 closed.
virsh vol-create-as --pool default --name file-server-vdc.img --capacity 4G --format raw
Vol file-server-vdc.img created
$ virsh attach-disk file-server /home/gean/kvm/images/file-server-vdc.img vdc --targetbus virtio --persistent
Disk attached successfully
virsh domblklist file-server
 Target   Source
-------------------------------------------------------
 vda      file-server.qcow2
 vdb      /home/gean/kvm/images/file-server-vdb.img
 vdc      /home/gean/kvm/images/file-server-vdc.img
 hdd      /home/gean/kvm/images/cloudinit_resized.iso
ssh 192.168.122.236
lsblk
NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                  11:0    1  364K  0 rom  
vda                 252:0    0   16G  0 disk 
├─vda1              252:1    0    1G  0 part /boot
└─vda2              252:2    0   15G  0 part 
  ├─ol-root         253:0    0 13,4G  0 lvm  /
  └─ol-swap         253:1    0  1,6G  0 lvm  [SWAP]
vdb                 252:16   0    4G  0 disk 
├─vg_data-alunos    253:2    0    2G  0 lvm  /mnt/alunos
└─vg_data-professor 253:3    0  1,5G  0 lvm  /mnt/professor
vdc                 252:32   0    4G  0 disk

Criando um Novo Physical Volume (PV)

sudo pvcreate /dev/vdc
  Physical volume "/dev/vdc" successfully created.

Expandindo o Volume Group (VG)

sudo vgextend vg_data /dev/vdc
  Volume group "vg_data" successfully extended
sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree 
  ol        1   2   0 wz--n- <15,00g     0 
  vg_data   2   2   0 wz--n-   7,99g <4,50g

Aumentando o Logical Volume (LV)

sudo lvextend -L +2G vg_data/professor
  Size of logical volume vg_data/professor changed from <1,50 GiB (383 extents) to <3,50 GiB (895 extents).
  Logical volume vg_data/professor successfully resized.
sudo xfs_growfs /mnt/professor
meta-data=/dev/mapper/vg_data-professor isize=512    agcount=7, agsize=65280 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=392192, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1566, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 392192 to 916480
df -h | grep professor
/dev/mapper/vg_data-professor  3,5G  958M  2,6G  27% /mnt/professor

Resumo

Este tutorial demonstra como provisionar uma VM no KVM, adicionar discos, configurar volumes físicos, expandir grupos e volumes lógicos, e redimensionar sistemas de arquivos XFS.