Version 4 (modified by helio4987, 5 years ago)

--

Snapshots LVM

Objectivo

O objectivo desta primeira fase do 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.

Nota: Estas foram umas breves descrições sobre o LVM e os snapshots mas mais à frente, neste mesmo documento, encontra-se uma descrição sobre o modo como o LVM e os Snapshots funciona e sobre o modo como podem ser utilizados.

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.

Mais à frente neste documento encontra-se a informação acerca de quais os módulos/pacotes que são essenciais para o funcionamento do LVM da forma como se pretende mostrar neste documento.

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

Instalação de um sistema sobre uma partição LVM (ou seja, instalação dentro de um lv)

Antes de começar com a exemplificação do processo de instalação convém referir que foi utilizado o Linux Caixa Mágica e certos aspectos podem, por isso, variar de sistema para sistema e assim é necessário fazer-se a respectiva adaptação à distribuição seja utilizada para executar este processo.

O que pretendemos é que seja possível ter um sistema instalado num lv que por sua vez está dentro de um vg que é composto por outras partições e/ou discos físicos.

Temos, logo à partida, um problema que consiste no facto de apenas ser possível utilizar o LVM depois de efectuado o processo de boot do sistema, pois é aí que serão carregados os módulos que permitem a sua utilização. Assim o que se faz é ter a directoria "/boot" numa partição exclusiva com o tipo de ficheiros ext3, porque desse modo já é possível iniciar um sistema que se encontre dentro de um lv de uma partição do tipo LVM porque como o "/boot" pode ser lido, dado que está em ext3, este dará suporte à leitura do sistema que está em LVM. Esta partição não precisará de ser maior do que 100 Mb.

É de realçar o facto de que ao colocar o "/boot" numa partição exclusiva em ext3 não estamos de modo algum a ir contra o principal objectivo da utilização do LVM, pois dado que queremos utilizar o LVM para restaurar o sistema para um ponto anterior, apenas queremos reverter o que foi modificado a partir do snapshot e, como os ficheiros existentes no "/boot" não é modificado aquando da instalação de programas, etc., não há necessidade de este ser revertido para um momento anterior.

Posteriormente, existe uma outra restrição aquando da instalação do nosso sistema, que é o facto de termos a necessidade de alterar o initrd (localizado em /boot/initrd) para que este carregue os módulos necessários à utilização do LVM, mas não podemos iniciar o sistema para depois executar os comandos necessários para alterar este. Assim, uma solução possível é utilizar um Live CD e executar neste os comandos necessário para reconstruir o initrd.

Nota: Este tipo de problema depende se a distribuição a ser instalada permite, na sua instalação normal, colocar o "/" numa partição LVM. Por isso pode não ser necessário a utilização do Live CD, mas para a instalação do Caixa Mágica é necessário este processo, logo vamos instalar com base no Live CD.

De seguida o que vamos fazer é "transferir" o nosso sistema para o sistema destino que foi instalado, de modo a podermos reconstruir o initrd como nos convém. Para isso montamos o sistema (o "/" que está no lv e o "/boot") em pastas à nossa escolha, para termos acesso ao mesmo, depois podemos reconstruir o initrd através do comando "chroot", mas temos de ter atenção que para que o sistema esteja "transferido" devemos montar com a opção "binds" de pastas especificas do sistema, como é o caso do "/proc", do "sys" e do "/dev", pois só assim estas estão realmente acessíveis do ponto de vista do sistema de destino.

No que diz respeito à instalação do LVM para que este fique a funcionar correctamente, em principio não será necessário instala-lo pois as versões mais recentes dos kernel's já têm todas o LVM e o device-mapper. O device-mapper é uma framework que serve de suporte a vários softwares de gestão de discos e é necessaŕio para que o LVM funcione correctamente. Poderá ser necessário activar alguns módulos do kernel caso os snapshots não funcionem ou caso o device-mapper não esteja activo. Estes módulos podem ser carregado através dos comandos:

modprobe dm-snapshot

e

modprobe dm-mod

Nota: Para mais informações consulte os seguinte links:  http://tldp.org/HOWTO/LVM-HOWTO/ e  http://sources.redhat.com/dm/

Depois desta "breve" explicação vamos então ver como instalar o sistema dentro de um lv, para o caso da distribuição Linux Caixa Mágica.

Processo de Instalação:

- Inserir o Caixa Mágica Live CD e arrancar a partir do CD

- Escolher a opção "Instalar no Disco" que se encontra no ambiente de trabalho, fazer seguinte e escolher o "particionamento personalizado do disco"

- Utilizar este gestor para criar neste disco as partições de SWAP e e uma partição com cerca de 100Mb do tipo ext3 e montar o "/boot"

- Alterar para o modo perito e criar uma partição do tipo "Logical Volume Manager", depois criar um vg (para isso clicar em adicionar a LVM) e por fim mudar para o separador que surgiu com o nome dado ao grupo e criar um lv do tipo ext3 com o ponto de montagem "/" (escolher um tamanho inferior ao dado ao vg para que exista espaço para os snapshots)

- Esperar que o sistema instale e depois acabar com o processo de instalação normalmente

- Executar o script abaixo para configurar o m2installer no sistema e para modificar o initrd:

-> script que utiliza os comandos necessários para que o m2installer fique com algumas das configurações necessárias à utilização da funcionalidade de reversão total do sistema, através de snapshots. Inclui opção para modificar o initrd (necessário para que funcione em certas distribuições, como é o caso do Caixa Mágica 12 -> utilizando o Live CD): configurator.sh

Nota: Este script para além de modificar o initrd irá criar uma pasta no sistema de destino que vai ter ficheiros e configurações relativos ao m2installer. Esta pasta encontra-se, por defeito em "/etc/m2installer/" e o script vai de seguida criar um ficheiro de configuração dentro desta pasta. Para além disso, durante o processo de instalação vai pedir ao utilizador para modificar o ficheiro "/etc/rc.d/init.d/halt", fazendo com que este script execute um ficheiro se ele existir. A necessidade de modificar o ficheiro halt será explicada mais à frente neste documento.

Video exemplificativo do processo de instalação:

[VIDEO EXEMPLIFICATIVO BREVEMENTE]

Utilização do m2installer (criar Snapshots e reverter para um Snapshot anterior)

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://softwarelivre.sapo.pt/minstaller/wiki ). 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 ao 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

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.

Reverter para um Snapshot anterior

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, 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_reversion.example

Video exemplificativo do processo de criação de um snapshot e do processo de reversão:

[VIDEO EXEMPLIFICATIVO BREVEMENTE]

Termos utilizados:

LE - Logical Extend

lv - logic volume

LVM - Logical Volume Manager

PE - Physical Extend

pv - physical volume

vg - volume group