Fala Jovens, Rafael aqui! Continuando nossa série rumo a alto disponibilidade de dois hosts Proxmox. Hoje iremos tratar sobre um assunto muito interessante o famoso LVM sobre discos.
CONSIDERAÇÕES
Estou levando em consideração que já possua familiaridade com o tema abordado e que se o seu objetivo for criar uma alto disponibilidade com o proxmox, tenha visto o artigo anterior, para não pegar o bonde andando. 😉
REFRESCANDO A MEMÓRIA: O QUE É LVM?
“LVM” (Logical Volume Manager – Gerenciador de Volume Lógico) é um método de alocar espaço do disco rígido em volumes lógicos que podem ser facilmente redimensionados, ao contrário das partições. Com o LVM, o disco rígido ou conjunto de discos rígidos são alocados em um ou mais volumes físicos. Podemos analisar melhor o funcionamento do LVM através da ilustração abaixo.
Analisando a imagem acima é possível observar que existe uma regra a seguir para trabalharmos de forma correta com LVM, sendo a seguinte ordem:
a) Disco físico.
b) Criação de partições. (Uma para cada disco físico).
c) Criação de “Phisical Volumes” (Uma para cada partição criada).
d) Criação de um ou mais “Volume Groups” com base nos PV criados.
e) Criação de “Logical Volume” baseado nos VGs.
f) Formatação e criação de sistema de arquivos.
1) CRIANDO PARTIÇÕES
Agora que estamos por dentro do LVM, vamos criar nossa primeira partição. Irei tratar aqui o procedimento somente no pve1 para não ficar repetitivo, mas todos os procedimentos aqui abordados devem ser executados igualmente nos outros nós do Cluster, no nosso exemplo, no pve2.
Acesse o Shell do pve1 e execute o comando “fdisk -l”, repare que será listado todos os discos locais disponíveis neste host como demostrado abaixo:
root@pve1:~# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D413CF4E-C49C-4999-8CD0-A6AC93952E16
Device Start End Sectors Size Type
/dev/sda1 34 2047 2014 1007K BIOS boot
/dev/sda2 2048 1050623 1048576 512M EFI System
/dev/sda3 1050624 41943006 40892383 19.5G Linux LVM
Disk /dev/sdb: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/pve-swap: 2.4 GiB, 2550136832 bytes, 4980736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/pve-root: 4.8 GiB, 5100273664 bytes, 9961472 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Iremos utilizar somente o disco /dev/sdb de 40GB, o único disco disponível. Vamos então criar uma partição única do tipo GPT com o mesmo tamanho do disco utilizando a ferramenta cfdisk.
cfdisk /dev/sdb
Ao acessar o “cfdisk /dev/sdb” escolha a opção “gpt”.
┌ Select label type ───┐
│ gpt*** │
│ dos │
│ sgi │
│ sun │
└──────────────────────┘
Agora escolha a opção “New”, e crie uma nova partição do tamanho total de 40GB. Também escolha o tipo da partição como “Linux LVM”.
│ Linux home │
│ Linux RAID │
│ Linux extended boot │
│ Linux LVM**** │
│ FreeBSD data │
│ FreeBSD boot │
│ FreeBSD swap │
└────────────────────────────↓─┘
Com o tipo escolhido, vá até a opção “Write” e ao ser perguntado se deseja gravar, responda “yes”.
Are you sure you want to write the partition table to disk? yes
Type "yes" or "no", or press ESC to leave this dialog.
Pronto, ao sair do cfdisk, nossa partição estará criada. Caso deseje visualizar a partição para ter certeza que foi criada corretamente, podemos utilizar o comando “fdisk -l /dev/sdb”, como demonstrado abaixo:
root@pve1:~# fdisk -l /dev/sdb
Disk /dev/sdb: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F8B5474E-E30F-5341-AA47-659BC00E7A74
Device Start End Sectors Size Type
/dev/sdb1 2048 83886046 83883999 40G Linux LVM
2) CRIANDO PHISICAL VOLUME.
Com nossa partição física criada, vamos criar nosso Phisical Volume no LVM. Para isso, iremos utilizar o comando pvcreate passando o caminho da partição como ilustrado abaixo:
root@pve1:~# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
Para listar nosso PV criado, utilize o comando “pvs” como ilustrado abaixo:
root@pve1:~# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 pve lvm2 a-- <19.50g <2.38g
/dev/sdb1 lvm2 --- <40.00g <40.00g
3) CRIANDO VOLUME GROUP.
Com nosso PV criado, vamos agora criar o Volume Group. Para cria-lo precisamos ter em mente que dependemos de um ou alguns PVs (Phisical Volumes). No nosso exemplo, irei utilizar somente um PV, o que criamos anteriormente. Porém, é importante ressaltar que a ideia por trás do VG e justamente concatenar vários discos ou partições em um único volume, disponibilizando assim um espaço agrupado de vários discos como se fosse um só.
Vamos criar um VG chamado vg_glusterfs com o comando vgcreate utilizando a partição /dev/sdb1 como ilustrado abaixo:
root@pve1:~# vgcreate vg_glusterfs /dev/sdb1
Volume group "vg_glusterfs" successfully created
Para listar nosso VG criado, utilize o comando “vgs” como ilustrado abaixo:
root@pve1:~# vgs
VG #PV #LV #SN Attr VSize VFree
pve 1 3 0 wz--n- <19.50g <2.38g
vg_glusterfs 1 0 0 wz--n- <40.00g <40.00g
4) CRIANDO LOGICAL VOLUME
Com nossos PV e VG criados agora precisamos criar nosso “Logical Volume”. Em nosso exemplo iremos criar um LV de 1Mb, isso porque o utilizaremos como LVM-Thin no Proxmox.
Vamos então criar um LV chamado lv_vms com o comando lvcreate no VG criado anteriormente chamado vg_glusterfs, como ilustrado abaixo:
root@pve1:~# lvcreate -L 1MB -n lv_vms vg_glusterfs
Rounding up size to full physical extent 4.00 MiB
Logical volume "lv_vms" created.
Para listar nosso LV criado, utilize o comando “lvs” como ilustrado abaixo:
root@pve1:~# lvs
LV VG Attr LSize
data pve twi-a-tz-- <8.00g
root pve -wi-ao---- 4.75g
swap pve -wi-ao---- <2.38g
lv_vms vg_glusterfs -wi-a----- 4.00m
5) CONFIGURANDO LVM-Thin
Agora já podemos transformar nosso LV chamado “lv_vms” em um armazenamento LVM-Thin. A ideia deste armazenamento e manter um espaço disponível dinamicamente alocado. Para isso vamos utilizar o comando lvconvert como ilustrado abaixo:
root@pve1:~# lvconvert --type thin-pool vg_glusterfs/lv_vms
Thin pool volume with chunk size 64.00 KiB can address at most 15.81 TiB of data.
WARNING: Converting vg_glusterfs/lv_vms to thin pool's data volume with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert vg_glusterfs/lv_vms? [y/n]: y
Converted vg_glusterfs/lv_vms to thin pool.
Repare que existe uma pergunta, logo após a execução do comando solicitando confirmação para conversão do Logical Volume. digite “y”. Pronto, já temos nosso LVM-thin criado.
6) ESTENTENDO LOGICAL VOLUME.
Agora que criamos nosso LVM-thin, vamos estender todo o volume lógico de forma a ocupar todo os espaço disponível no Volume Group. Para isso, iremos utilizar o comando lvextend e passar como parâmetros a informação 100%FREE, para que ele entenda que desejamos utilizar todo o espaço vazio disponível, e os nomes do VG e LV como ilustrado abaixo:
root@pve1:~# lvextend -l 100%FREE vg_glusterfs/lv_vms
Size of logical volume vg_glusterfs/lv_vms_tdata changed from 4.00 MiB (1 extents) to 39.98 GiB (10236 extents).
Logical volume vg_glusterfs/lv_vms_tdata successfully resized.
7) FORMANTANDO PARTIÇÃO LVM-Thin.
Precisamos finalmente formatar nossa partição LVM-Thin com um sistema de arquivos para que possamos utiliza-la. Para isso, iremos utilizar o sistema de arquivos XFS.
root@pve1:~# ls /dev/mapper/vg*
/dev/mapper/vg_glusterfs-lv_vms /dev/mapper/vg_glusterfs-lv_vms_tmeta
/dev/mapper/vg_glusterfs-lv_vms_tdata
Repare que dentro de nosso /dev/mapper/ é possível localizar nossa partição LVM-Thin criada: “/dev/mapper/vg_glusterfs-lv_vms“. Vamos então realizar a formatação de nossa partição com o comando mkfs.xfs passando o caminho de nosso LVM-Thin, como ilustrado abaixo:
root@pve1:~# mkfs.xfs /dev/mapper/vg_glusterfs-lv_vms
meta-data=/dev/mapper/vg_glusterfs-lv_vms isize=512 agcount=16, agsize=655104 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=0
data = bsize=4096 blocks=10481664, imaxpct=25
= sunit=16 swidth=16 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=5120, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root@pve1:~#
Após formatado, precisamos montar nossa partição. Para isso, iremos criar um ponto de montagem no diretório raiz chamado xfsdata. Este ponto de montagem será responsável por montar nossa nova partição LVM-thin, como ilustrado abaixo:
root@pve1:/mnt# mkdir /data
root@pve1:/mnt# mount -t xfs /dev/mapper/vg_glusterfs-lv_vms /data/
Repare que nossa partição esta montada e acessível, como ilustrado abaixo:
root@pve1:/mnt# df -hlT | grep xfs
/dev/mapper/vg_glusterfs-lv_vms xfs 40G 74M 40G 1% /data
root@pve1:/mnt# cd /data/
root@pve1:/xfsdata#
8) MONTANDO PARTIÇÃO NA INICIALIZAÇÃO DO SISTEMA.
Precisamos também realizar a configuração de montagem automática de nossa partição. Isso se faz necessário porque se caso o servidor reiniciar, nossa partição será montada automaticamente na inicialização. Para isso, vamos fazer um pouco diferente.
Como minha mãe falou que eu não sou todo mundo, uma alternativa que inclusive acho mais viável do que alterar o fstab, é utilizar o SystemD. Para isso, precisamos criar dois scripts, uma target para o SystemD e um script propriamente dito para realizar a montagem da partição.
Vamos criar um script target.service em /etc/systemd/system/ chamado data.service, esta target irá executar na inicialização do sistema chamando nosso script de montagem de partição.
root@pve1:/# vim /etc/systemd/system/data.service
[Unit]
Description=Script de montagem da partição /data
[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/etc/init.d/mount-data.sh start
ExecStop=/etc/init.d/mount-data.sh stop
ExecReload=/etc/init.d/mount-data.sh restart
[Install]
WantedBy=multi-user.target
Após criar nossa target e importante atualizar as deamons para que o SystemD enxergue nossa nova target criada.
root@pve1:/# systemctl daemon-reload
Repare que no script acima, estamos apontando nosso ExecStart para o script de montagem que criaremos dentro de /etc/init.d/ chamado mount-data.sh, como ilustrado abaixo:
root@pve1:/# vim /etc/init.d/mount-data.sh
#!/bin/bash
case "$1" in
start)
mount -t xfs /dev/mapper/vg_glusterfs-lv_vms /data
;;
stop)
umount /data
;;
restart)
$0 stop
$0 start
;;
status)
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
De permissão de execução ao arquivo mount-data.sh através do comando chmod +x /etc/init.d/mount-data.sh
Agora precisamos adicionar nossa target para inicializar junto com o sistema. Para isso, vamos adicioná-la a inicialização com o comando systemctl enable, como ilustrado abaixo:
root@pve1:/# systemctl enable data.service
Created symlink /etc/systemd/system/multi-user.target.wants/mount-data.service → /etc/systemd/system/mount-data.service.
Pronto, realize o procedimentos em todos os nós do cluster e reinicie, repare que ao voltar, os pontos estarão montados e funcionando.
CONCLUSÃO
Neste artigo vimos como criar de maneira simples, um LVM-Thin baseando-se em uma partição física de um disco local utilizando LVM e XFS. No próximo artigo iremos falar sobre Glusterfs.
Se você gostou deste post e através dele pude lhe ajudar, o que acha de aproximarmos nosso contato? Siga meu blog, twitter, youtube, instagram e me adicione no Linkedin, aproveite para classificar algumas das minhas competências/recomendações, este simples gesto faz toda a diferença.
Att,
Rafael Oliveira
SysAdmin