Olá pessoal,
Ha algum tempo atrás (ha um ano talvez) venho utilizando LVM2 para quase tudo. Este “cara” é simplesmente fantástico. Mas para muitos pode ficar algumas perguntas (que eu me fiz umas 400 vezes) …
Como funciona a utilização do espaço reservado para um SNAPSHOT de unidades LVM? Porque temos que informar um tamanho para esta “foto”? Em fim…
O tamanho que informamos no comando de criação de um SNAPSHOT (lvcreate -LXX{M,G,T…} -s /dev/VGNAME/LVNAME) é a quantidade de physical extents (PE, ou tamanho em Mb, Gb, etc) que reservamos no VG da unidade LVM para que seja armazenado os metadados das alterações que são sofridas na unidade LVM após a criação do SNAP.
Exemplo:Se temos uma LV de 1024MBytes e criamos um SNAPSHOT de 300MBytes, e esta unidade de 1024MBytes sofrer alteração total de 300MBytes nosso SNAP aparecerá com 100% de uso. A partir deste momento já não se garante mais a integridade dos dados fotografados, pois o SNAPSHOT não possui mais recursos para armazenar os metadados.
Um teste mais interessante:
De uma LV de 50Gb, cria-se um SNAP de 500Mb:
[root@vostrolab2 ~]# lvcreate -L500M -s /dev/vg01/home -n home-SNAP
Logical volume “home-SNAP” created
Resultado:
[root@vostrolab2 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Converthome vg01 owi-ao 50.00G
home-SNAP vg01 swi-a- 500.00M home 00.04
Vamos criar uma alteração na LV e observar o comportamento do SNAP:
[root@vostrolab2 ~]# dd if=/dev/urandom of=/home/arquivinho-teste.dd bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 31.5512 s, 6.6 MB/s
Depois de 5 segundos podemos observar que o SNAP terá sua porcentagem de uso alterada:
[root@vostrolab2 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Converthome vg01 owi-ao 50.00G
home-SNAP vg01 swi-a- 500.00M home 40.45
Então:
Regrinha de 3 pra entender os 40,45% de uso do SNAP:
500M ——- 100%
216M ——- X
216 * 100 / 500 = ~42% =D
E se o SNAP atingir o seu limite de uso…?
Ai meu amigo, reza… vamos ao lab2:
Crio a LV com 500M, crio o filesystem ext3 e monto em /cialinux:
[root@vostrolab2 /]# lvcreate -L500M vg01 -n cialinux
Logical volume “cialinux” created
[root@vostrolab2 /]# mkfs.ext3 /dev/vg01/cialinux
[root@vostrolab2 /]# mount /dev/vg01/cialinux /cialinux
Resultado:
[root@vostrolab2 /]# df -h /cialinux
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg01-cialinux
485M 11M 449M 3% /cialinux
Vamos usar 40Mb dela:
[root@vostrolab2 /]# dd if=/dev/urandom of=/cialinux/file1.dd bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 6.73183 s, 6.2 MB/s
[root@vostrolab2 /]#
[root@vostrolab2 /]# df -h /cialinux
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg01-cialinux
485M 51M 409M 11% /cialinux
Criamos um SNAP e montamos ele para comprovar que está integro e acessível:
[root@vostrolab2 /]# lvcreate -L40M -s /dev/vg01/cialinux -n cialinux-snap
Logical volume “cialinux-snap” created
[root@vostrolab2 /]#
[root@vostrolab2 /]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
cialinux vg01 owi-ao 500.00M
cialinux-snap vg01 swi-a- 40.00M cialinux 0.03
[root@vostrolab2 /]# mount /dev/vg01/cialinux-snap /cialinux-snap/
[root@vostrolab2 /]#
[root@vostrolab2 /]# df -h /cialinux*
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg01-cialinux
485M 51M 409M 11% /cialinux
/dev/mapper/vg01-cialinux–snap
485M 51M 409M 11% /cialinux-snap
Agora, ao exceder o tamanho de alocação do SNAP (40Mb) com um arquivo de 50Mb, podemos observar a utilização de 100% do espaço reservado ao SNAP no VG01, e como consequência a perda da integridade do SNAP:
[root@vostrolab2 /]# umount /cialinux-snap/
[root@vostrolab2 /]#
[root@vostrolab2 /]# dd if=/dev/urandom of=/cialinux/arquivo-teste2.dd bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 8.27271 s, 6.3 MB/s
[root@vostrolab2 /]#
[root@vostrolab2 /]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
cialinux vg01 owi-ao 500.00M
cialinux-snap vg01 Swi-I- 40.00M cialinux 100.00
home vg01 -wi-ao 50.00G
[root@vostrolab2 /]#
[root@vostrolab2 /]#
[root@vostrolab2 /]# mount /dev/vg01/cialinux-snap /cialinux-snap/
mount: you must specify the filesystem type
[root@vostrolab2 /]#
Com estes testes concluímos que toda e qualquer alteração de bits na unidade LVM é automaticamente adicionada ao espaço reservado para o SNAPSHOT. Com base nisso, temos sempre que saber a frequência com que a unidade LVM sofre alterações, caso tenhamos como intenção manter o SNAP por muito tempo.
Assim sendo, podemos realizar um lvresize na unidade reservada ao SNAP, para aumentar em +${x}Mb a sua área de alocação, e salvar algumas peles se necesário… =) Vamos ao lab3:
[root@vostrolab2 ~]# rm -rf /cialinux/*
[root@vostrolab2 ~]# lvremove -f /dev/vg01/cialinux-snap
[root@vostrolab2 ~]# dd if=/dev/urandom of=/cialinux/arquivo.file bs=1M count=200
[root@vostrolab2 ~]# lvcreate -L40M -s /dev/vg01/cialinux -n cialinux-snap
Logical volume “cialinux-snap” created[root@vostrolab2 ~]# dd if=/dev/urandom of=/cialinux/arquivo.file bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 3.64283 seconds, 5.8 MB/s[root@vostrolab2 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
cialinux vg01 owi-ao 500.00M
cialinux-snap vg01 swi-a- 40.00M cialinux 50.69
Chegamos a 50% de uso do SNAP. Para não chegar aos 100%, vamos aumentar a área de alocação do SNAP em +200M:
[root@vostrolab2 ~]# lvresize -L +200M /dev/vg01/cialinux-snap
Extending logical volume cialinux-snap to 240.00 MB
Logical volume cialinux-snap successfully resized[root@vostrolab2 ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
cialinux vg01 owi-ao 500.00M
cialinux-snap vg01 swi-a- 240.00M cialinux 8.46
É isso, um post um pouco cansativo, porém pode esclarecer inúmeras dúvidas… Toda e qualquer sugestão/correção será muito bem vinda…
Por: Franklin Moretti
Referências:
testes
man lvcreate
man dd
man lvremove
man lvresize
Alguns termos usados
LV = Logical Volume
LVM = Logical Volume Manager
VG = Volume Group
Acho que vou começãr a utilizar PrintScreen dos terminais Linux. Este tema que usamos no Blog acaba com o post… =(
Obrigado, realmente muito esclarecedor.
Parabéns.
Muito bom cara. Ajuda bastante a comunidade open source .
Boa tarde,
Fiquei com algumas dúvidas.
1º – Vamos supor que possua um LVMRAIZ para a partição /. Então crio um LVMRAIZ-SNAP. Depois faço um upgrade do SO, mas alguns pacotes estão com problema, se eu remover o LVMRAIZ-SNAP, meu SO volta para a versão anterior?
# lvcreate -L10G vg01 -n LVMRAIZ
# lvcreate -L40M -s /dev/vg01/LVMRAIZ -n LVMRAIZ-SNAP
# yum -y upgrade
# lvremove /dev/vg01/LVMRAIZ-SNAP
2º Imagine o mesmo cenário acima, mas não ocorreu nenhum problema na atualização do SO. Neste caso eu gostaria de consolidar os dados gravados LVMRAIZ-SNAP para LVMRAIZ e então remover o LVMRAIZ-SNAP.
Qual seria o comando?
Oi Alan, obrigado pela leitura.
Entendi suas dúvidas. São dois pontos bem práticos.
Essas duas perguntas da pra responder com uma simulação pequena, como fiz no POST.
Como faz anos que não mecho com LVM, estou até sem VG criado aqui. Então vou criar aqui e logo posto aqui pra vc o resultado.
Att,
Em suma:
1º Para voltar atrás, supondo que deu tudo errado na atualização: umount /dev/vg01/LVMRAIZ && lvconvert --merge /dev/vg01/LVMRAIZ-SNAP
2º Qual seria o comando? R: lvremove /dev/vg01/LVMRAIZ-SNAP para descartar o snapshot, tudo correu bem, e seguir adiante.
Se quiser mais detalhes, veja nesse POST: blog.smallbee.com.br/como-fazer-commit-e-rollback-de-snapshot-de-lvm/
Muito obrigado Hudson, vou fazer um LAB aqui.