13.9. Usando Vinum para o Sistema de Arquivos Raiz

Para uma máquina que esta espelhada por inteiro usando Vinum, é desejável espelhar também o sistema de arquivos raiz. Executar tal configuração é menos trivial do que espelhar um disco arbitrário:

Nas sessões que seguem, o termo ``root volume'' é usado para descrever o volume Vinum que contém os sistemas de arquivo raiz. É provavelmente uma boa idéia usar o nome "root" para esse volume, mas isso não é de maneira nenhuma obrigatório. Apesar de que todos os exemplos de comandos nas sessões seguintes assumem esse nome.

13.9.1. Iniciando o Vinum a Tempo Para o Sistema de Arquivos Raiz

Existem algumas medidas a se tomar para que isso aconteça:

13.9.2. Tornando um Volume Raiz Baseado em Vinum Accessível Para o Bootstrap

Visto que o atual Bootstrap do FreeBSD contém apenas 7.5 KB de código, e já tem o trabalho de ler arquivos no UFS (como /boot/loader), é completamente impossível ensiná-lo também sobre as estruturas internas do Vinum para que ele possa analizar seus dados de configuração, e descobrir sozinho os elementos de um volume de inicialização. Dessa forma, alguns truques são necessários para fornecer ao código do bootstrap a ilusão de que ele é uma partição "a" padrão que contém o arquivo de sistema raiz.

Para que isso se torne possível, os seguintes requisitos para o volume razia devem ser compridos:

Note que é desejado e possível que existam múltiplos plexes, cada um contendo uma réplica do sistema de arquivos raiz. O processo de bootstrap irá, entretanto, usar somente uma delas para achar o bootstrap e todos os arquivos, até que o próprio kernel monte os sistemas de arquivos. Cada subdisco dentro desse plex irá então precisar da sua própria partição imaginária "a", para que o dispositivo correspondente se torne bootável. Não é estritamente necessário que cada uma dessas falsas partições "a" se encontrem no mesmo ponto junto ao seu dispositivo, comparado com outros plexes do volume raiz. Entretanto, provavelmente seria uma boa idéia criar os volumes do Vinum desse jeito para que os dispositivos espelhados sejam simétricos, evitando, assim, confusão.

Para definir essas partições "a", para cada dispositivo contendo parte do volume raiz, as etapas segintes precisam ser realizadas:

  1. A localização (offset do início do dispositivo) e tamanho dos subdiscos dos dispositivos que fazem parte do volume raiz precisam ser examinados usando o comando

    vinum l -rv root

    Note que no Vinum, os offsets e tamanhos são medidos em bytes. Eles precisam ser divididos por 512 para obter o número de blocos que irão, por sua vez, ser usados no comando disklabel.

  2. Execute o comando

    disklabel -e devname

    Para cada dispositivo que participa no volume raiz. devname deve ser ou o nome do disco (exemplo da0) para discos sem tabela de partições (ex. fdisk), ou o nome da partição (exemplo ad0s1).

    Se já existir uma partição "a" no dispositivo (provavelmente, contendo um sistema de arquivos raiz pré-Vinum), essa deve ser renomeada para um nome qualquer, permanecendo acessível (por segurança), mas não será mais usado para bootstrap como padrão. Note que partições ativas (como um sistema de arquivo raiz atualmente montado) não podem ser renomeadas, então isso deve ser feito quando a máquina é inicializada através de uma mídia ``Fixit'', ou em um processo de duas etapas, onde (em uma situação de espelhamento) o disco que não foi usado no boot será manipulado primeiro.

    Então, o offset da partição Vinum nesse dispositivo (se existente) deve ser adicionado ao offset do subdisco de volume raiz respectivo desse mesmo dispositivo. O valor resultante passará a ser o valor "offset" para a nova partição "a". O valor do "size" dessa partição pode ser tirado literalmente do cálculo acima. O "fstype" deve ser 4.2BSD. Os valores de "fsize", "bsize", e "cpg" devem ser escolhidos para melhor se adaptar aos atuais do sistema, apesar de que, eles não são muito importantes dentro desse contexto.

    Dessa forma, uma nova partição "a" será formada e sobrepõe as partições Vinum nesse dipositivo. Note que o disklabel só vai permitir isso se as partições do vinum tiverem sido propriamente marcadas usando o "vinum" fstype.

  3. Isso é tudo! Uma partição falsa "a" agora existe em cada dispositivo que tenha uma réplica do volume raiz. É altamente recomendável verificar o resuldado novamente, usando um comando como

    fsck -n /dev/devnamea

Deve ser lembrado que todos os arquivos que contém informações de controle, precisam ser relativos ao sistema de arquivos raiz no volume Vinum onde, quando definido um novo volume raiz Vinum, não deve conincidir com o sistema raiz atualmente ativo. Então, em particular, os arquivos /etc/fstab e /boot/loader.conf precisarão ser observados.

Na próxima inicialização, o bootstrap deve descobrir a informação de controle apropriada a partir do novo sistema de arquivos raiz Vinum, e agir adequadamente. No final do processo de inicialização do kernel, depois que todos os dispositivos forem anunciados, a notícia importante que mostra o sucesso dessa configuração é uma mensagem como:

Mounting root from ufs:/dev/vinum/root


13.9.3. Exemplo Configuração Vinum Para o Sistemas de Arquivos Raiz

Após o volume raiz do Vinum ser ativado, a saída de vinum l -rv root deve parecer com:

 
...
Subdisk root.p0.s0:
        Size:        125829120 bytes (120 MB)
        State: up
        Plex root.p0 at offset 0 (0  B)
        Drive disk0 (/dev/da0h) at offset 135680 (132 kB)

Subdisk root.p1.s0:
        Size:        125829120 bytes (120 MB)
        State: up
        Plex root.p1 at offset 0 (0  B)
        Drive disk1 (/dev/da1h) at offset 135680 (132 kB)
       


Os valores a serem notados são 135680 para o offset (relativo à partição /dev/da0h). Isso quer sizer, em termos de disklabel, 265 blocos de disco com 512 bytes cada. Da mesma forma, o tamanho desse volume raiz é de 245760 blocos de 512 bytes. /dev/da1h, contendo a segunda réplica desse volume raiz, tem uma configuração simérica.

O disklabel para esses dispositivos devem se parecer com:

...
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:   245760      281    4.2BSD     2048 16384     0   # (Cyl.    0*- 15*)
  c: 71771688        0    unused        0     0         # (Cyl.    0 - 4467*)
  h: 71771672       16     vinum                        # (Cyl.    0*- 4467*)
       


Pode ser observado que o parâmetro "size" para a partição "a" falsa bate com o valor esboçado acima, enquanto o parâmetro "offset" é a soma do offset dentro da partição Vinum "h", e o offset dessa partição dentro do dispositivo (ou slice). Essa é a configuração típica necessária para evitar os problemas descritos em Seção 13.9.4.3. Pode também ser visto que toda partição "a" está completamente dentro da partição "h" contendo todos os dados do Vinum para esse dispositivo.

Note que no exemplo acima, o dispositivo inteiro está dedicado ao Vinum, e não há nenhum resto de partição raiz pré-Vinum, partindo de que esse foi um disco com configurações novas e foi dedicado exclusivamente a ser parte de uma configuração Vinum.

13.9.4. Resolução de Problemas

Caso algo saia errado, é preciso ter uma saída para recuperar a situação. A seguinte lista contém algumas armadilhas e suas soluções.

13.9.4.1. O Bootstrap do sistema entra, mas o sistena na inicializa

Caso, por alguma razão, o sistema não continue inicializando, o bootstrap pode ser interrompido pressionando-se a tecla espaço no alerta de 10 segundos. As variáveis do loader (como vinum.autostart) podem ser examindas usando o show, e manipuladas com os comandos set ou unset.

Caso o único problema seja que o módulo Vinum do kernel não esteja na lista de módulos para serem carregados automaticamente, um simples load vinum irá ajudar.

Quando pronto, o processo de boot pode ser retomado com o comando boot -as. As opções -as irão requere ao kernel que consulte qual sistema de arquivos raiz deve montar (-a), e faça o processo em modo single-user (-s), onde o sistema raiz é montado apenas para leitura. Desta forma, mesmo que apenas um plex de um volume multi-plex tenha sido montado, nenhum dado entre os plexes corre risco de inconsistência.

Quando for solicitado o sistema de arquivos raíz a ser montado, qualquer dispositivo que contenha um sistema de arquivos raíz válido pode ser informado. Caso /etc/fstab tenha sido definido corretamente, o esperado é algo como ufs:/dev/vinum/root. Uma escolha alternativa típica pode ser algo como ufs:da0d que pode ser uma hipotética partição contendo o sistema de arquivos pré-Vinum. Deve-se tomar cuidado caso uma das partições apelido "a" forem informadas onde há na verdade uma referência aos subdiscos Vinum para o sistema de arquivos raíz, porque em uma configuração de espelhamento, deve-se apenas montar uma peça de um dispositivo raíz. Caso o sistema de arquivos for montado para leitura e escrita posteriormente, será necessário remover o(s) outro(s) plex(es) do volume Vinum raíz, uma vez que estes plexes provavelmente trarão dados inconsistentes.

13.9.4.2. Apenas o Bootstrap Primário Inicia

Caso o /boot/loader não seja carregado, mas o bootstrap primário continue carregando (viivel por uma barra a esquerda da tela imediatamente após o processo de boot iniciar), uma tentativa de interromper o bootstrap primário é possível, usando a tecla espaço. Isto vai o bootstrap parar no estágio dois, ver Seção 7.3.2. Neste momento é possível realizar o boot de uma partição alternativa, como a partição contendo o sistema de arquivos raíz antigo que foi removido de "a" acima.

13.9.4.3. Nada incializa, o Bootstrap Trava

Esta situação vai ocorrer quando o bootstrap foi destruído pela instalação do Vinum. Infelizmente, atualmente o Vinum deixa livres apenas 4 KB no início de sua partição antes de iniciar a escrita do seu cabeçalho de informações. Contudo, os estágios um e dois do bootstrap mais o disklabel incorporado entre eles atualmente requerem 8 KB. Assim, se a partição Vinum for iniciada no offset 0 em um slice ou disco que pretende ser alvo de boot, a configuração do Vinum vai corromper o bootstrap.

Similarmente, caso a situação acima tenha sido sanada, por exemplo, reiniciando a partir de uma mídia ``Fixit'', e o bootstrap tenha sido reinstalado usando o comando disklabel -B como descrito em Seção 7.3.2, o bootstrap irá corromper o cabeçalho Vinum, e assim, não encontrará mais seu(s) disco(s). Contudo nenhuma informação de configuração ou dados reais nos volumes Vinum serão perdidos, e é possível recuperar todos os dados informando-se axatamente a mesma configuração novamente, a situação é complexa mesmo. Pode ser necessário afastar toda a partição Vinum pelo menos 4 KB, de forma a ter o cabeçalho Vinum e o bootstrap do sistema sem colisões.

13.9.5. Diferenças para o FreeBSD 4.x

Com o FreeBSD 4.x, algumas funções internas são obrigatórias para fazer com que o Vinum procure por todos os discos, e o código que descobre o identificador interno do dispositivo raiz não é inteligente o suficiente para tratar algo como /dev/vinum/root automaticamente. Então, as coisas são um pouco diferentes aqui.

Vinum precisa ser explicitamente informado dos discos que ele tem que procurar, use uma linha parecida com a seguinte em /boot/loader.conf:

vinum.drives="/dev/da0 /dev/da1"

É importante que todos os discos que contém dados do Vinum sejam mencionados. Não será prejudicial se discos a mais forem listados, e nem é necessário adicionar cada slice ou cada partição explicitamente, porque o Vinum irá procurar por cabeçalhos válidos em todas as partições dos discos citados.

A partir do momento em que as rotinas usadas para passar o nome do sistema de arquivos raíz e derivar o ID do dispositivo (número maior/menor) estão preparadas apenas para suportar nomes de dispositivos ``clássicos'' como /dev/ad0s1a, eles não tem a menor idéia do que fazer com um nome de volume raiz do tipo /dev/vinum/root. Por esta razão, o próprio Vinum precisa definir antecipadamente o parâmero interno de kernel que armazena o número de identidade do dispositivo raiz durante a sua inicialização. Isso é feito definindo a variável vinum.root com o valor do nome do volume raiz. A entrada em /boot/loader.conf para efetuar essa tarefa se parece com:

vinum.root="root"

Agora, quando a inicialização do kernel tenta encontrar o dispositivo raíz a ser montado, vê se algum módulo do kernel já pré-iniciou o parâmetro para isso. Caso seja esta a situação, e o dispositivo requisitando o sistema raíz coincida com o número maior do driver, como indicado pelo nome do dispositivo raíz sendo passado (isto é, "vinum" no nosso caso), ela vai usar o ID do dispositivo pré-alocado, ao contrário de tentar eleger um por si mesma. Desta maneira, no decorrer da inicialização automática, pode continuar a montar o volume Vinum raíz como sistema de arquivos raíz.

Contudo, quando boot -a requisitar a entrada do nome do dispositivo raíz manualmente, deve-se considerar que esta rotina permanece não tratando o valor informado caso refira-se a um volume Vinum. Caso algum nome de dispositivo não referente aos dispositivos Vinum seja informado, a distinção entre os números maiores do parâmetro raíz pré-alocado e o driver como descrito no nome informado vai fazer esta rotina entrar em seu interpretador normal, assim entrando uma seqüência como: ufs:da0d irá funcionar como o esperado. Observe que se isto falhar, não será mais possível informar um novo valor como ufs:vinum/root, e iniciar novamente, uma vez que não pode mais ser tratado pela rotina. Ao informar dados no ``askroot'', o /dev/ inicial sempre poderá ser omitido.)

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.