====== 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.