                Implementando o UFS Journaling em um Desktop PC

  Manolis Kiagias

   <manolis@FreeBSD.org>

   Revisao: fcacc3500b

   Copyright (c) 2008 Manolis Kiagias

   FreeBSD is a registered trademark of the FreeBSD Foundation.

   Many of the designations used by manufacturers and sellers to distinguish
   their products are claimed as trademarks. Where those designations appear
   in this document, and the FreeBSD Project was aware of the trademark
   claim, the designations have been followed by the "(TM)" or the "(R)"
   symbol.

   2018-09-16 13:16:18 +0000 por Edson Brandi.
   Resumo

   Um sistema de arquivos com journaling usa um log para registrar todas as
   transac,oes que ocorrem no sistema de arquivos e preserva sua integridade
   em caso de falha do sistema ou falta de energia. Embora ainda seja
   possivel perder as alterac,oes nao salvas nos arquivos, o journaling
   elimina quase completamente a possibilidade de corrupc,ao do sistema de
   arquivos causada por um desligamento abrupto. Ele tambem reduz ao minimo o
   tempo necessario para a verificac,ao do sistema de arquivos apos a falha.
   Embora o sistema de arquivos UFS empregado pelo FreeBSD nao implemente o
   journaling em si, a nova classe de journal do framework GEOM no FreeBSD
   7.X pode ser usada para fornecer journaling independente do sistema de
   arquivos. Este artigo explica como implementar o UFS journaling em um
   cenario tipico de PC de mesa.

   [ Documento HTML em partes / Documento HTML completo ]

     ----------------------------------------------------------------------

   Indice

   1. Introduc,ao

   2. Compreendendo o journaling no FreeBSD

   3. Etapas durante a instalac,ao do FreeBSD

   4. Configurando o journaling

   5. Soluc,ao de problemas com journaling

   6. Leitura Adicional

1. Introduc,ao

   Embora os servidores profissionais estejam geralmente bem protegidos
   contra desligamentos imprevistos, um desktop tipico fica `a merce de
   falhas de energia, reinicializac,oes acidentais e outros incidentes
   relacionados ao usuario que podem levar a paradas abruptas. Os soft
   updates costumam proteger o sistema de arquivos de maneira eficiente
   nestes casos, embora na maioria das vezes seja necessaria uma longa
   verificac,ao em background. Em raras ocasioes, a corrupc,ao do sistema de
   arquivos atinge um ponto em que a intervenc,ao do usuario e necessaria e
   os dados podem ser perdidos.

   O novo recurso de journaling fornecido pela GEOM pode ajudar bastante
   nesses cenarios, praticamente eliminando o tempo necessario para a
   verificac,ao do sistema de arquivos e garantindo que o sistema de arquivos
   seja rapidamente restaurado para um estado consistente.

   Este artigo descreve um procedimento para implementar o journaling do UFS
   em um cenario tipico de PC de mesa (um unico disco rigido usado para o
   sistema operacional e para os dados). Deve ser seguido durante uma nova
   instalac,ao do FreeBSD. As etapas sao simples o suficiente e nao requerem
   interac,ao excessivamente complexa com a linha de comando.

   Depois de ler este artigo, voce sabera:

     * Como reservar espac,o para o journaling durante uma nova instalac,ao
       do FreeBSD.

     * Como carregar e ativar o modulo geom_journal (ou como compilar o
       suporte para ele em seu kernel customizado).

     * Como converter seus sistemas de arquivos existentes para utilizar o
       journaling e quais opc,oes usar em /etc/fstab para monta-los.

     * Como implementar o journaling em novas partic,oes (vazias).

     * Como solucionar problemas comuns associados ao journaling.

   Antes de ler este artigo, voce deve ser capaz de:

     * Entender os conceitos basicos do UNIX(R) e do FreeBSD.

     * Estar familiarizado com o procedimento de instalac,ao do FreeBSD e com
       o utilitario sysinstall.

  Atenc,ao:

   O procedimento descrito aqui e destinado a preparar uma nova instalac,ao
   na qual ainda nao temos nenhum dado real do usuario e armazenado no disco.
   Embora seja possivel modificar e estender este procedimento para sistemas
   ja em produc,ao, voce deve efetuar o backup de todos os dados importantes
   antes de fazer isso. Mexer com discos e partic,oes em um baixo nivel pode
   levar a erros fatais e a perda de dados.

2. Compreendendo o journaling no FreeBSD

   O journaling fornecido pelo GEOM no FreeBSD 7.X nao e especifico do
   sistema de arquivos (diferentemente do sistema de arquivos ext3 no
   Linux(R)), funcionando a nivel de bloco. Embora isso signifique que ele
   possa ser aplicado a sistemas de arquivos diferentes, no FreeBSD
   7.0-RELEASE, ele so pode ser usado com o UFS2.

   Esta funcionalidade e fornecida pelo carregamento do modulo
   geom_journal.ko no kernel (ou atraves da compilac,ao de um kernel
   personalizado) e pelo uso do comando gjournal para configurar os sistemas
   de arquivos. Em geral, voce gostaria de utilizar o journal em grandes
   sistemas de arquivos, como o /usr. Voce precisara no entanto (veja a
   sec,ao seguinte) reservar algum espac,o livre em disco para isso.

   Quando um sistema de arquivos e "journaled", e necessario algum espac,o em
   disco para manter o proprio journal. O espac,o em disco que contem os
   dados reais e chamado de data provider, enquanto o que contem o journal e
   chamado de journal provider. Os provedores de dados e de journal precisam
   estar em partic,oes diferentes ao fazer o journaling de uma partic,ao
   existente (nao vazia). Ao fazer o journaling de uma nova partic,ao, voce
   tem a opc,ao de usar um unico provedor para os dados e o journal. Em todo
   caso, o comando gjournal combina os dois provedores para criar o sistema
   de arquivos journaled final. Por exemplo:

     * Voce deseja fazer o journaling do seu sistema de arquivos /usr,
       armazenado em /dev/ad0s1f (que ja contem dados).

     * Voce reservou algum espac,o livre no disco, na partic,ao /dev/ad0s1g.

     * Usando o comando gjournal, um novo dispositivo /dev/ad0s1f.journal e
       criado no qual o /dev/ad0s1f e o data provider, e o /dev/ad0s1g e o
       journal provider. Este novo dispositivo e entao usado para todas as
       operac,oes de arquivo posteriores.

   A quantidade de espac,o em disco que voce precisa reservar para o journal
   provider depende da carga de uso do sistema de arquivos e nao do tamanho
   do data provider. Por exemplo, em um desktop tipico de escritorio, um
   journal provider de 1 GB para o sistema de arquivos /usr sera suficiente,
   enquanto uma maquina que lida com I/O de disco pesado (por exemplo,
   edic,ao de video) pode precisar de mais. Um kernel panic ocorrera se o
   espac,o do journal estiver esgotado antes de ter a chance de ser
   committed.

  Nota:

   E improvavel que os tamanhos de journal sugeridos aqui causem problemas no
   uso tipico de um desktop (como navegac,ao na Web, processamento de texto e
   reproduc,ao de arquivos de midia). Se sua carga de trabalho incluir
   intensa atividade de disco, use a regra a seguir para obter a
   confiabilidade maxima: o tamanho da RAM deve caber em 30% do espac,o do
   journal provider. Por exemplo, se o seu sistema tiver 1 GB de RAM, crie um
   journal provider de aproximadamente 3,3 GB. (Multiplique o tamanho total
   da sua RAM por 3.3 para obter o tamanho do journal).

   Para mais informac,oes sobre journaling, leia a pagina de manual do
   gjournal(8).

3. Etapas durante a instalac,ao do FreeBSD

  3.1. Reservando espac,o para o journaling

   Normalmente, um desktop tipico tem um disco rigido que armazena o sistema
   operacional e os dados do usuario. Indiscutivelmente, o esquema de
   particionamento padrao selecionado pelo sysinstall e mais ou menos
   adequado: Um desktop nao precisa de uma grande partic,ao /var, enquanto o
   /usr e alocado com a maior parte do espac,o em disco, ja que os dados do
   usuario e muitos pacotes sao instalados em seus subdiretorios.

   O particionamento padrao (aquele obtido pressionando A no editor de
   partic,oes do FreeBSD, chamado Disklabel) nao deixa nenhum espac,o nao
   alocado. Cada partic,ao que sera journaled, requer outra partic,ao para
   journal. Como a partic,ao /usr e a maior, faz sentido reduzir ligeiramente
   essa partic,ao, para obter o espac,o necessario para o journaling.

   No nosso exemplo, um disco de 80 GB e usado. A captura de tela a seguir
   mostra as partic,oes padroes criadas por Disklabel durante a instalac,ao:

   Se isso e mais ou menos o que voce precisa, e muito facil se ajustar ao
   journaling. Simplesmente use as teclas de seta para mover o realce para a
   partic,ao /usr e pressione D para exclui-la.

   Agora, mova o realce para o nome do disco na parte superior da tela e
   pressione C para criar uma nova partic,ao para /usr. Esta nova partic,ao
   deve ser menor em 1 GB (se voce pretende registrar apenas /usr), ou 2 GB
   (se voce pretende registrar ambos /usr e /var). No pop-up exibido, opte
   por criar um sistema de arquivos e digite /usr como o ponto de montagem.

  Nota:

   Voce deve fazer o journal da partic,ao /var? Normalmente, o journaling faz
   sentido em partic,oes grandes. Voce pode decidir nao fazer o journal do
   /var, embora faze-lo em um desktop tipico nao cause nenhum dano. Se o
   sistema de arquivos e usado levemente (bastante provavel para um desktop)
   voce pode querer alocar menos espac,o em disco para o seu journal.

   Em nosso exemplo, nos fizemos o journal em ambos /usr e /var. Voce pode,
   naturalmente, ajustar o procedimento `as suas proprias necessidades.

   Para manter as coisas o mais faceis o possivel, vamos usar o sysinstall
   para criar as partic,oes necessarias para o journaling. No entanto,
   durante a instalac,ao, o sysinstall insiste em pedir um ponto de montagem
   para cada partic,ao criada. Neste ponto, voce nao tem nenhum ponto de
   montagem para as partic,oes que irao manter os journals, e na realidade
   voce nem precisa deles. Estas nao sao partic,oes que iremos montar em
   algum lugar.

   Para evitar esses problemas com o sysinstall, vamos criar as partic,oes de
   journal como espac,o de troca. O swap nunca e montado, e o sysinstall nao
   tem problemas para criar tantas partic,oes de troca quantas forem
   necessarias. Apos a primeira reinicializac,ao, o /etc/fstab tera que ser
   editado, e as entradas extras do espac,o de troca serao removidas.

   Para criar o swap, use novamente as teclas de seta para mover o realce
   para a parte superior da tela do Disklabel, para que o nome do disco seja
   realc,ado. Em seguida, pressione N, insira o tamanho desejado (1024M) e
   selecione "swap space" no menu pop-up exibido. Repita para cada journal
   que voce deseja criar. Em nosso exemplo, criamos duas partic,oes para
   fornecer os diarios de /usr e /var. O resultado final e mostrado na
   seguinte captura de tela:

   Quando tiver concluido a criac,ao das partic,oes, sugerimos que voce anote
   os nomes das partic,oes e os pontos de montagem, para que possa consultar
   facilmente essas informac,oes durante a fase de configurac,ao. Isso
   ajudara a reduzir os erros que podem danificar sua instalac,ao. A tabela a
   seguir mostra nossas anotac,oes para a configurac,ao de exemplo:

   Tabela 1. Partic,oes e Journals

   +------------------------------------------------------------------------+
   |      Partic,oes      |      Ponto de montagem      |      Journal      |
   |----------------------+-----------------------------+-------------------|
   | ad0s1d               | /var                        | ad0s1h            |
   |----------------------+-----------------------------+-------------------|
   | ad0s1f               | /usr                        | ad0s1g            |
   +------------------------------------------------------------------------+

   Continue a instalac,ao como faria normalmente. No entanto, sugerimos que
   voce adie a instalac,ao de softwares de terceiros (pacotes) ate que voce
   configure completamente o journaling.

  3.2. Inicializando pela primeira vez

   Seu sistema ira iniciar normalmente, mas voce precisara editar o
   /etc/fstab para remover as partic,oes extras de swap que voce criou para
   os journals. Normalmente, a partic,ao swap que voce ira usar e aquela com
   o sufixo "b" (por exemplo, ad0s1b no nosso exemplo). Remova todas as
   outras entradas de espac,o swap e reinicialize para que o FreeBSD pare de
   usa-las.

   Quando o sistema voltar a funcionar, estaremos prontos para configurar o
   journaling.

4. Configurando o journaling

  4.1. Executando o gjournal

   Tendo preparado todas as partic,oes requeridas, e bastante facil
   configurar o journaling. Nos precisaremos mudar para o modo de single
   user, entao entre como root e digite:

 # shutdown now

   Pressione Enter para obter o shell padrao. Nos precisaremos desmontar as
   partic,oes que serao registradas no diario, no nosso exemplo /usr e /var:

 # umount /usr /var

   Carregue o modulo necessario para o journaling:

 # gjournal load

   Agora, use suas anotac,oes para determinar qual partic,ao sera usada para
   cada diario. Em nosso exemplo, /usr e ad0s1f e seu journal sera ad0s1g,
   enquanto /var e ad0s1d e sera journaled para ad0s1h. Os seguintes comandos
   sao necessarios:

 # gjournal label ad0s1f ad0s1g

 GEOM_JOURNAL: Journal 2948326772: ad0s1f contains data.
 GEOM_JOURNAL: Journal 2948326772: ad0s1g contains journal.

 # gjournal label ad0s1d ad0s1h

 GEOM_JOURNAL: Journal 3193218002: ad0s1d contains data.
 GEOM_JOURNAL: Journal 3193218002: ad0s1h contains journal.

  Nota:

   Se o ultimo setor de qualquer partic,ao for usado, o gjournal retornara um
   erro. Voce tera que executar o comando usando o sinalizador -f para
   forc,ar uma substituic,ao, ou seja:

 # gjournal label -f ad0s1d ad0s1h

   Como esta e uma nova instalac,ao, e altamente improvavel que qualquer
   coisa seja realmente sobrescrita.

   Neste ponto, dois novos dispositivos sao criados, a saber ad0s1d.journal e
   ad0s1f.journal. Os quais representam as partic,oes /var e /usr que temos
   que montar. Antes de montar, devemos definir o flag de Journal e limpar o
   flag de Soft Updates:

 # tunefs -J enable -n disable ad0s1d.journal

 tunefs: gjournal set
 tunefs: soft updates cleared

 # tunefs -J enable -n disable ad0s1f.journal

 tunefs: gjournal set
 tunefs: soft updates cleared

   Agora, monte os novos dispositivos manualmente em seus respectivos locais
   (note que agora podemos usar a opc,ao de montagem async):

 # mount -o async /dev/ad0s1d.journal /var
 # mount -o async /dev/ad0s1f.journal /usr

   Edite o /etc/fstab e atualize as entradas para /usr e /var:

 /dev/ad0s1f.journal     /usr            ufs     rw,async      2       2
 /dev/ad0s1d.journal     /var            ufs     rw,async      2       2

  Atenc,ao:

   Certifique-se de que as entradas acima estao corretas ou voce tera
   problemas para inicializar normalmente apos o reboot!

   Finalmente, edite o /boot/loader.conf e adicione a seguinte linha para que
   o modulo gjournal(8) seja carregado em cada boot:

 geom_journal_load="YES"

   Parabens! Seu sistema esta agora configurado para journaling. Voce pode
   digitar exit para retornar ao modo multiusuario ou reinicializar para
   testar sua configurac,ao (recomendado). Durante a inicializac,ao, voce
   vera mensagens como as seguintes:

 ad0: 76293MB XEC XE800JD-00HBC0 08.02D08 at ata0-master SATA150
 GEOM_JOURNAL: Journal 2948326772: ad0s1g contains journal.
 GEOM_JOURNAL: Journal 3193218002: ad0s1h contains journal.
 GEOM_JOURNAL: Journal 3193218002: ad0s1d contains data.
 GEOM_JOURNAL: Journal ad0s1d clean.
 GEOM_JOURNAL: Journal 2948326772: ad0s1f contains data.
 GEOM_JOURNAL: Journal ad0s1f clean.

   Apos um encerramento nao limpo, as mensagens variam ligeiramente, ou seja:

 GEOM_JOURNAL: Journal ad0s1d consistent.

   Isso geralmente significa que o gjournal(8) usou as informac,oes no
   journal provider para retornar o sistema de arquivos a um estado
   consistente.

  4.2. Fazendo journaling de partic,oes recem-criadas

   Embora o procedimento acima seja necessario para partic,oes que fazem uso
   de journaling e que ja contem dados, o journaling de uma partic,ao vazia e
   um pouco mais facil, uma vez que os dados e o journal provider podem ser
   armazenados na mesma partic,ao. Por exemplo, suponha que um novo disco
   tenha sido instalado e uma nova partic,ao /dev/ad1s1d tenha sido criada.
   Criar o journal seria tao simples quanto:

 # gjournal label ad1s1d

   O tamanho do journal sera 1 GB por padrao. Voce pode ajusta-lo usando a
   opc,ao -s. O valor pode ser dado em bytes, ou acrescentado por K, M ou G
   para indicar Kilobytes, Megabytes ou Gigabytes, respectivamente. Note que
   o comando gjournal nao permitira que voce crie journals de tamanhos
   pequenos e inadequados.

   Por exemplo, para criar um journal de 2 GB, voce poderia usar o seguinte
   comando:

 # gjournal label -s 2G ad1s1d

   Voce pode criar um sistema de arquivos em sua nova partic,ao e ativar o
   journaling usando a opc,ao -J :

 # newfs -J /dev/ad1s1d.journal

  4.3. Adicionando suporte ao journaling no seu kernel personalizado

   Se voce nao deseja carregar o geom_journal como um modulo, voce pode
   construir suas func,oes diretamente em seu kernel. Edite seu arquivo de
   configurac,ao do kernel personalizado e verifique se ele inclui estas duas
   linhas:

 options UFS_GJOURNAL # Note: This is already in GENERIC

 options GEOM_JOURNAL # You will have to add this one

   Recompile e reinstale seu kernel seguindo as instruc,oes relevantes no
   Handbook do FreeBSD.

   Nao se esquec,a de remover a entrada relevante "load" do /boot/loader.conf
   se voce a usou anteriormente.

5. Soluc,ao de problemas com journaling

   A sec,ao a seguir aborda as perguntas mais frequentes relacionadas a
   problemas relacionados ao journaling.

   5.1. Estou recebendo um kernel panic durante periodos de alta atividade de
   disco. Como isso esta relacionado ao journaling?

   5.2. Eu cometi algum erro durante a configurac,ao e nao consigo
   inicializar normalmente agora. Isso pode ser resolvido de alguma forma?

   5.3. Posso remover o registro no journal e retornar ao meu sistema de
   arquivos padrao com o Soft Updates?

   5.1. Estou recebendo um kernel panic durante periodos de alta atividade de 
        disco. Como isso esta relacionado ao journaling?                      
        O journal provavelmente se enche antes que ele tenha a chance de ser  
        enviado (descarregado) para o disco. Lembre-se de que o tamanho do    
        journal depende da carga de uso e nao do tamanho do provedor de       
        dados. Se a atividade do disco for alta, voce precisara de uma        
        partic,ao maior para o journal. Veja a nota na sec,ao Noc,oes basicas 
        sobre journaling.                                                     
   5.2. Eu cometi algum erro durante a configurac,ao e nao consigo            
        inicializar normalmente agora. Isso pode ser resolvido de alguma      
        forma?                                                                
        Voce esqueceu (ou escreveu incorretamente) a entrada em               
        /boot/loader.conf, ou existem erros no seu arquivo /etc/fstab. Estes  
        erros geralmente sao faceis de corrigir. Pressione Enter para acessar 
        o shell padrao do modo single user. Em seguida, localize a raiz do    
        problema:                                                             
                                                                              
        # cat /boot/loader.conf                                               
                                                                              
        Se a entrada geom_journal_load estiver ausente ou incorreta, os       
        dispositivos registrados nunca serao criados. Carregue o modulo       
        manualmente, monte todas as partic,oes e continue com a               
        inicializac,ao do modo multi usuario:                                 
                                                                              
        # gjournal load                                                       
                                                                              
        GEOM_JOURNAL: Journal 2948326772: ad0s1g contains journal.            
        GEOM_JOURNAL: Journal 3193218002: ad0s1h contains journal.            
        GEOM_JOURNAL: Journal 3193218002: ad0s1d contains data.               
        GEOM_JOURNAL: Journal ad0s1d clean.                                   
        GEOM_JOURNAL: Journal 2948326772: ad0s1f contains data.               
        GEOM_JOURNAL: Journal ad0s1f clean.                                   
                                                                              
        # mount -a                                                            
        # exit                                                                
        (boot continues)                                                      
                                                                              
        Se, por outro lado, esta entrada estiver correta, de uma olhada em    
        /etc/fstab. Voce provavelmente encontrara uma entrada incorreta ou    
        faltando. Nesse caso, monte todas as partic,oes restantes manualmente 
        e continue com o boot em modo multi-usuarios.                         
   5.3. Posso remover o registro no journal e retornar ao meu sistema de      
        arquivos padrao com o Soft Updates?                                   
        Certo. Use o procedimento a seguir, que inverte as alterac,oes. As    
        partic,oes que voce criou para os provedores de journal podem ser     
        usadas para outros propositos, se voce desejar.                       
                                                                              
        Fac,a login como root e alterne para o modo de usuario unico:         
                                                                              
        # shutdown now                                                        
                                                                              
        Desmonte as partic,oes journaled:                                     
                                                                              
        # umount /usr /var                                                    
                                                                              
        Sincronize os journals:                                               
                                                                              
        # gjournal sync                                                       
                                                                              
        Pare os provedores de journaling:                                     
                                                                              
        # gjournal stop ad0s1d.journal                                        
        # gjournal stop ad0s1f.journal                                        
                                                                              
        Limpe os metadados de journaling de todos os dispositivos usados:     
                                                                              
        # gjournal clear ad0s1d                                               
        # gjournal clear ad0s1f                                               
        # gjournal clear ad0s1g                                               
        # gjournal clear ad0s1h                                               
                                                                              
        Limpe o sinalizador de journaling do sistema de arquivos e restaure a 
        flag do Soft Updates:                                                 
                                                                              
        # tunefs -J disable -n enable ad0s1d                                  
                                                                              
        tunefs: gjournal cleared                                              
        tunefs: soft updates set                                              
                                                                              
        # tunefs -J disable -n enable ad0s1f                                  
                                                                              
        tunefs: gjournal cleared                                              
        tunefs: soft updates set                                              
                                                                              
        Remonte os dispositivos antigos `a mao:                               
                                                                              
        # mount -o rw /dev/ad0s1d /var                                        
        # mount -o rw /dev/ad0s1f /usr                                        
                                                                              
        Edite o /etc/fstab e restaure-o ao seu estado original:               
                                                                              
        /dev/ad0s1f     /usr            ufs     rw      2       2             
        /dev/ad0s1d     /var            ufs     rw      2       2             
                                                                              
        Finalmente, edite o /boot/loader.conf, remova a entrada que carrega o 
        modulo geom_journal e reinicie.                                       

6. Leitura Adicional

   Journaling e um recurso relativamente novo do FreeBSD e, como tal, ainda
   nao esta muito bem documentado. Voce pode, no entanto, encontrar as
   seguintes referencias adicionais uteis:

     * Uma nova sec,ao sobre journaling agora faz parte do Handbook do
       FreeBSD.

     * Este post em freebsd-current pelo desenvolvedor do gjournal(8), Pawel
       Jakub Dawidek <pjd@FreeBSD.org>.

     * Este post em freebsd-questions por Ivan Voras <ivoras@FreeBSD.org>.

     * As paginas de manual do gjournal(8) e geom(8).
