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.
