wiki:SnapshotsLVM

Snapshots LVM

Objectivo

O objectivo desta primeira fase do desenvolvimento do m2installer é o estudo de uma forma de conseguir reverter todo o sistema para um momento anterior, através da utilização da ferramenta LVM (Logical Volume Manager) e aproveitando as suas funcionalidades de criação de snapshots.

Sobre o LVM e os Snapshots

O LVM (Logical Volume Manager) é uma ferramenta de gestão de partições existentes em discos que tem como principal vantagem dar ao utilizador a possibilidade de criar partições virtuais que podem ser constituídas por varias outras partições e/ou discos físicos. Estas partições são altamente flexíveis, pois é possível a qualquer momento redimensioná-las, exportá-las, adicionar espaço proveniente de outras partições e/ou discos físicos, etc.

Os Snapshots são cópias de um dado Volume lógico (lv) num determinado momento, ou seja, um snapshot contém todos os ficheiros que o lv, a que se refere, continha no momento da sua criação, sendo por isso uma espécie de "congelamento" do lv.

Pré-Requisitos

Para que o m2installer possibilite executar as operações criação de snapshots e de reversões para snapshots criados é necessário que o directório raiz ("/") esteja dentro de um Volume lógico do LVM (lv). Assim sendo temos como pré-requisito fundamental a necessidade de o sistema suportar a utilização do lvm2 para que todo o sistema funcione normalmente.

A explicação do modo como se deve proceder à instalação do sistema dentro de um lv, ficando este a funcionar normalmente encontra-se na página sobre a instalação e configuração do m2installer (esta página pode ser acedida aqui: http://contribsoft.caixamagica.pt/trac/wiki/Configurator).

Descrição geral do modo de funcionamento do LVM e dos Snapshots

Vamos começar pela explicação da forma mais simples de criar um lv e um snapshot. Para isso o processo está, resumidamente, explicado nos seguintes passos:

  • escolher os dispositivos físicos (exemplo: discos rígidos) em que queremos ter partições do tipode fichieros LVM ou até, consoante o que o utilizador prefira, também podemos escolher ter discos todos do tipo de ficheiros LVM
  • formatar os discos e/ou partições, em que queremos utilizar o LVM, com o tipode fihcheiros LVM (Logiacal Volume Manager)
  • adicionar os discos e/ou partições formatados com o tipo de ficheiros LVM ao próprio gestor LVM, para isso utilizamos o comando pvcreate (abreviatura para Physical Volume Create), exemplo:
pvcreate /dev/hda3 /dev/hdb /dev/hdc1

Podemos ver informações detalhadas acerca do pv executando o comando pvdisplay.

  • agora que já adicionamos os discos e/ou partições, estes ficam disponíveis para alocarmos no LVM. Assim, o próximo passo será agrupar estes discos e/ou partições, criando grupos (vg's - Volume Grupups). Para o fazer utilizamos o comando vgcreate (abreviatura para Volume Group Create), exemplo:
vgcreate gupo1 /dev/hda3 /dev/hdb

Podemos também ver mais informações acerca dos vg existentes com o comando pvdisplay. Executando este comando podemos verificar que os vg's criados têm um numero total de PE's (Physical Extend) e estes são (por agora) iguais ao número de "Free PE". Estes PE's são unidades de medida do LVM e podemos dizer, por isso, que os vg's são compostos por "blocos" (PE's), sendo que estes estão agora todos disponíveis para serem alocados.

  • o próximo passo será a criação de Volumes logicos (lv's - Logic Volumes). Estes são, no fundo, as partições que são criadas pelo LVM e que são depois interpretadas pelo sistema como discos normais. Daí que os lv's têm de ser formatados, tal como os discos ou partições, com um tipo de ficheiros. Os lv's só podem ser criados dentro de vg's e por isso o seu tamanho não pode ser superior ao do vg a que pertence. Para a criação dos lv's utilizamos o comando lvcreate (abreviatura para Logical Volume Create), exemplo:
lvcreate -L 1G -n lv1 grupo1

Neste comando temos de indicar o tamanho que pretendemos, isso é feito pelo argumento -L que pode ser seguido de uma quantidade em Megabytes (utilizando o "M", exmplo 500M) ou em Gigabytes (utilizando o "G", exmplo 1G). Note-se que também é possível indicar o tamanho em PE's, sendo que para isso utiliza-se o argumento "-l" em vez do "-L". Temos também de indicar o nome que pretendemos para o nosso lv, para isso colocamos o nome a seguir ao argumento -n. Por fim, ainda no comando, indicamos o nome do vg onde queremos criar o lv.

  • posteriormente se quisermos criar um snapshot de um lv existente utilizamos para isso o seguinte comando:
lvcreate -s -L 300M -n grupo1 /dev/grupo1/lv1

Este comando é semelhante ao da criação do lv, mas com a diferença que tem se ser indicado o argumento "-s" (snapshot) e que em vez de indicarmos o nome do vg, indicamos o caminho (path) para o lv a partir do qual queremos criar o snapshot.

É importante referir que os snapshots serão criados no mesmo vg onde está o lv a que se referem, por isso é necessário ter PE's livres nesse vg. Também é de realçar o facto de que quando um snapshot excede o seu tamanho torna-se inválido.

Em relação ao tamanho dos snapshots, e de acordo com a documentação existente, podemos dizer que os snapshots têm como tamanho real, um tamanho que é, no fundo, igual às diferenças para com o lv original, ou seja, tem o espaço ocupado pelos ficheiros que o LVM precisa de saber que diferem do original, para que este snapshot, virtualmente, se mantenha sempre imutável. Pode encontrar mais informação acerca dos snapshots neste link: http://tldp.org/HOWTO/LVM-HOWTO/snapshotintro.html

Falta ainda acrescentar que, por defeito, o caminho para um lv é /dev/nome_do_vg/nome_do_lv ou /dev/mapper/nome_do_vg-nome_do_lv. Assim teriamos para o exemplo anterior:

/dev/grupo1/lv1

ou

/dev/mapper/grupo1-lv1

Note-se que os comandos acima indicados apenas exemplificam os passos necessários para a criação de um lv e de um snapshot, mas o LVM fornece também muitas outras operações, tais como: adicionar um pv a um vg, redimensionar vg's e lv's, remover pv's, vg's e lv's, etc. Para mais informações acerca do funcionamento do LVM sugere-se a consulta do seguinte link: http://www.tldp.org/HOWTO/LVM-HOWTO.

Utilização do m2installer (funcionalidades relacionadas com os snaphots em LVM)

A versão actual do m2installer encontra-se neste link: m2installer

Relembra-se, que o m2installer é o script principal de todo o projecto, pois é ele que deverá ser executado para realizar todas as operações e funcionalidades estão descritas na página principal do projecto m2installer ( http://contribsoft.caixamagica.pt/trac/wiki/mmInstaller ). Deste modo, o script configurator.sh apenas é utilizado como forma de instalar as configurações principais do m2installer e para que seja possível, como já foi explicado, ter o directório raiz ("/") num lv.

Por outro lado, é importante referir que este projecto é fundamentalmente um "proof-of-concept". Por esse motivo o controlo de excepções referentes à introdução de dados pelo utilizador é bastante simples. E além disso este script também não se preocupa com questões exteriores às suas funcionalidades, como por exemplo a tentativa de criar um snapshot num vg em que o lv está a utilizar todos os PE's desse vg.

A seguir serão descritas apenas algumas das funcionalidades do m2installer no que se refere aos snaphots em LVM. Isto porque apesar de estarem descritas as principais funcionalidades que tinham sido mencionadas na pagina principal do projecto, o m2installer tem mais algumas opções que servem como complemento a operações envolvendo o LVM e os snapshots. De qualquer das formas, o m2installer já se encontra bastante documentado para que seja fácil a interpretação do código deste script.

Exemplo de um ficheiro de configuração: m2installer.conf.example

Criar snapshots (argumento --createss / opção "Create system snapshot" no menu)

Esta opção permite criar um snapshot do sistema de forma a que seja possível, posteriormente, voltar ao estado do sistema no momento em que foi criado o snapshot. No fundo o que acontece é que como todo o sistema já se encontra dentro de um lv, será apenas criado um snapshot desse lv. Deste modo, temos as limitações do espaço do vg a que o lv pertence, pois o snapshot irá ser alocado com nos PE's livres que existirem no vg.

Temos também como limitação o facto de ser necessário escolher um tamanho para o snapshot a criar e por isso se forem feitas muitas modificações no sistema, poderá não ser possível reverter o sistema para esse snapshot, pois este pode já estar inválido.

Para além destas limitações é importante referir que poderá ser viável ao utilizador, ter o directório "/home" à parte do restante sistema (isto é, numa partição ou vg diferente) de modo a que os snapshots não se tornem inválidos muito rapidamente e não pondo em causa a perca de ficheiros importantes para utilizador.

Video exemplificativo: http://www.vimeo.com/2020176

Remover snapshot (argumento --removess / opção "Remove system snapshot" no menu)'

O que será efectuado nesta opção é a remoção de um snapshot indicado pelo utilizador. Esta remoção é feita através do comando para remover lv do LVM.

Video exemplificativo: http://www.vimeo.com/2020290

Mostrar snapshots existentes (argumento --showss)

No caso de ser dado como argumento o "--showss", será mostrado so utilizador os snapshots activos e/ou inactivos existentes.

Video exemplificativo: http://www.vimeo.com/2020368

Montar snapshot no directório de montagens predefinida (argumento ----mountss / opção "Mount system snapshot into default mount directory" no menu)

Esta opção permite ao utilizador montar um snapshot no directório de montagens (por defeito é "/mnt") de forma a que seja possível ao utilizador visualizar como se encontravam todos os ficheiros, no sistema, no momento em que foi criado o snapshot.

Video exemplificativo: http://www.vimeo.com/2020272

Desmontar snapshot da pasta de montagens predefinida (argumento --umountss / opção "Unmount system snapshot from default mount directory" no menu)

O que esta opção faz é desmontar um snapshot que foi montado com a opção analisada anteriormente.

Video exemplificativo: http://www.vimeo.com/2020385

Reverter(rollback) para um Snapshot anterior (argumento --rollbackss / opção "Rollback system to a previous system snapshot" no menu)

Quando pretendemos reverter para um snapshot criado anteriormente, o que irá ser feito no fundo é uma sincronização entre a o directório raíz ("/") e o directório do snapshot. Desta forma apenas serão modificados, apagados, e criados os ficheiros e pastas que diferirem do snapshot. Para além disso, o rsync é utilizado em modo arquivo, através da indicação do argumento "-a", o que faz com que este comando preserve os "symbolic links", dispositivos, atributos, permissões, etc.. Assim, no final, o directório raíz torna-se uma cópia exacta do snapshot e teremos então a reversão total do sistema efectuada.

Para a correcta utilização do rsync é necessário indicar os directório que este não deve processar e no nosso caso é necessário excluir os directórios que não correspondem a ficheiros "reais" do sistema, como o "/proc" e o "/sys". Também foi necessário excluir os directórios que foram criados apenas para montar o snapshot e o respectivo lv do sistema, durante o processo de reversão.

Note-se que para que este processo seja efectuado com sucesso, convém que o sistema esteja a utilizar o mínimo de recursos e de processos possível, de maneira a que estes não bloqueiem a tentativa de modificação de ficheiros quando a sincronização está em curso. Para isso o método utilizado consiste em efectuar o processo de reversão(ou rollback em inglês), que neste caso é o mesmo que dizer sincronização, depois da maior parte dos processos do sistema terem sido terminados.

Para que tal aconteça, a reversão é efectuada durante o processo de desligar do sistema, um pouco do sistema se desligar por completo. Daí que no processo de instalação, ao correr o script configurator.sh, foi pedido ao utilizador para modificar o ficheiro halt localizado no directório "/etc/rc.d/init.d/". Isto porque o halt é o ficheiro que efectua as operações necessária para desligar, como por exemplo, os "umount's" das unidades montadas e os "kill's" aos processos.

Nessa modificação o que foi feito foi fazer com que a dada altura da execução do halt este verifica se existe na pasta de configuração do m2installer (por defeito localizada em "/etc/m2installer/") se existe um ficheiro que irá executar o processo de reverão. Se este ficheiro existir então será executado e o processo de reversão será por isso efectuado.

Resta dizer que este ficheiro é criado pelo m2installer quando o utilizador escolhe a opção de reverter para um sanpshot anterior. Daí que quando o utilizador escolhe essa opção está apenas a agendar uma reversão, pois esta só será efectuada quando o sistema estiver a desligar-se.

Nota_1: Durante o processo de reversão o próprio ficheiro que está a agendar a reversão actual será apagado pois não existe no snapshot e assim o sistema não irá continuar a efectuar a reversão sempre que o sistema for desligado.

Nota_2: Se existir uma reversão agendada não será possivel criar um snapshot. Isto impossibilita que o ficheiro de reversões, que será executado para efectuar uma reversão do sistema, nunca seja colocado num snapshot. Evita-se assim que após se efectuar uma reversão seja efectuada uma outra sem a ordem, do utilizador, para tal.

Exemplo de um ficheiro que irá executar uma reversão: scheduled-rollback-file.example

Video exemplificativo: http://www.vimeo.com/2020353

Remover reversão(rollback) agendada (argumento --rmrollback / opção "Remove scheduled rollback" no menu)

Remove o ficheiro que será executado pelo halt quando o sistema estiver a desligar, ou seja, remove uma reversão agendada. Isto, como é evidente, apenas acontece se existir uma reversão agendada.

Video exemplificativo: http://www.vimeo.com/2020318

Termos utilizados:

LE - Logical Extend

lv - logic volume

LVM - Logical Volume Manager

PE - Physical Extend

pv - physical volume

vg - volume group

Last modified 11 years ago Last modified on Oct 20, 2008, 10:21:31 PM