Bem-vindo à décima sexta aula do nosso curso “FreeBSD — Do Zero ao Avançado”. Hoje vamos mergulhar em um dos componentes mais fascinantes e poderosos deste sistema operacional: o GEOM. Se você já precisou implementar redundância de dados, criar volumes lógicos, gerenciar criptografia de disco ou simplesmente entender como o FreeBSD organiza o armazenamento em nível de kernel, você está na aula certa. O GEOM é o framework modular de transformação de I/O que coloca o FreeBSD em posição de destaque quando o assunto é flexibilidade e robustez no gerenciamento de dispositivos de bloco.
Quando falamos de servidores em produção, cada segundo de inatividade pode representar prejuízos significativos. É nesse contexto que o GEOM brilha: ele permite criar mirrors para tolerância a falhas, striping para performance, concatenar discos para maior capacidade, e até mesmo criptografar volumes inteiros — tudo isso sem depender de hardware proprietário ou controladoras RAID caras. Em nossos projetos na JRT Technology Solutions, utilizamos diariamente classes GEOM como gmirror e geli para construir storages resilientes que suportam cargas críticas de bancos de dados e sistemas de arquivos ZFS. O domínio deste framework não é um diferencial opcional — é uma necessidade para qualquer profissional que se proponha a administrar FreeBSD em ambientes sérios.
Nesta aula, vamos partir dos conceitos fundamentais da arquitetura GEOM e avançar progressivamente até a criação prática de um RAID 1 com dois discos — passo a passo, com cada comando explicado e cada saída do terminal reproduzida para que você possa acompanhar e reproduzir em seu próprio ambiente. Você entenderá como as “classes” GEOM se empilham formando uma cadeia de transformações, como o FreeBSD lida com providers e consumers, e quais são os arquivos de configuração que controlam o comportamento do framework durante o boot. Esta é uma aula densa, com mais de 4000 palavras de conteúdo técnico puro, mas completamente funcional: siga cada etapa e você terá um mirror funcional ao final.
O conhecimento que você vai adquirir aqui serve como base para tópicos ainda mais avançados que exploraremos nas próximas aulas, como GELI (criptografia de disco), HAST (alta disponibilidade) e integração com ZFS. Reserve um tempo adequado para praticar cada bloco de comandos, compreenda o propósito de cada flag, e não hesite em repetir os procedimentos em máquinas virtuais até sentir-se completamente seguro. Vamos começar.
O que você vai aprender nesta aula
- Compreender a arquitetura GEOM: providers, consumers, classes e o modelo de empilhamento de transformações
- Identificar as principais classes GEOM disponíveis no FreeBSD e seus casos de uso
- Carregar e descarregar módulos GEOM dinamicamente no kernel
- Criar, configurar e gerenciar um RAID 1 (mirror) completo utilizando a classe gmirror
- Entender o layout de metadados e o processo de sincronização de discos espelhados
- Persistir configurações GEOM no arquivo
/boot/loader.confpara inicialização automática - Diagnosticar e resolver falhas comuns em configurações GEOM
- Verificar o status de componentes, consistência de metadados e estado de sincronização
Pré-requisitos e Ambiente
Para acompanhar esta aula sem obstáculos, você precisará de um ambiente FreeBSD funcional — recomendamos a versão 13.2 ou superior, embora os conceitos e comandos sejam compatíveis com versões 12.x e 14.x. É altamente desejável que você tenha dois discos adicionais (além do disco do sistema) para praticar a criação do mirror. Se estiver utilizando uma máquina virtual, adicione dois discos virtuais de tamanho idêntico (por exemplo, 2 GB cada) — isso é suficiente para todos os exercícios. Os dispositivos aparecerão como /dev/ada1 e /dev/ada2 (ajuste os nomes conforme seu hardware: podem ser /dev/da1, /dev/da2 em sistemas com controladoras SCSI/SAS, ou /dev/vtbd1, /dev/vtbd2 em virtualização com VirtIO).
Você também precisa ter acesso root, pois todas as operações com GEOM exigem privilégios de superusuário. Certifique-se de que os discos adicionais não contêm dados importantes — o procedimento de criação do mirror irá sobrescrever qualquer conteúdo existente. Antes de começar, identifique corretamente os dispositivos com o comando geom disk list ou simplesmente verificando /var/run/dmesg.boot. Um erro comum é confundir o disco do sistema com os discos de prática — se você não tiver certeza, execute gpart show para visualizar o particionamento atual e identificar qual dispositivo é o seu disco de boot. Em nossos laboratórios na JRT Technology Solutions, sempre recomendamos etiquetar os discos virtuais com nomes descritivos na configuração do hypervisor para evitar confusões.
Por fim, tenha em mente que trabalharemos diretamente com dispositivos de bloco. Embora as operações sejam seguras quando executadas corretamente, um comando direcionado ao disco errado pode resultar em perda de dados. A atenção aos detalhes e a confirmação visual de cada nome de dispositivo antes de executar comandos destrutivos é uma prática indispensável que reforçamos constantemente.
O que é o GEOM? Fundamentos da Arquitetura de Armazenamento no FreeBSD
O GEOM é muito mais do que um conjunto de ferramentas — é um framework de transformação de I/O em nível de kernel que redefine como o FreeBSD enxerga e gerencia dispositivos de bloco. Para entender sua importância, imagine uma pilha de camadas: no topo está o sistema de arquivos (UFS, ZFS) que precisa ler e escrever blocos; na base estão os dispositivos físicos (discos SATA, SSDs NVMe, volumes iSCSI). Entre eles, o GEOM insere módulos de transformação que podem espelhar dados, dividir I/O entre múltiplos discos, criptografar blocos, comprimir informações, criar snapshots, entre dezenas de outras possibilidades. Cada camada dessa pilha é chamada de classe GEOM.
A terminologia fundamental do GEOM gira em torno de dois conceitos complementares: providers (provedores) e consumers (consumidores). Um provider é qualquer entidade que fornece blocos de dados — pode ser um disco físico (/dev/ada0), uma partição (/dev/ada0p1), ou o resultado de uma transformação GEOM (como um mirror /dev/mirror/gm0). Um consumer é o componente que consome esses blocos — geralmente uma classe GEOM que se conecta a um ou mais providers para realizar sua transformação. Essa relação permite o empilhamento: você pode ter um disco físico (provider) consumido pelo gmirror (consumer), cujo provider resultante é consumido pelo geli para criptografia, cujo provider é consumido pelo sistema de arquivos. Essa flexibilidade arquitetural é o segredo por trás da potência do GEOM.
Quando o kernel do FreeBSD inicializa, ele ativa automaticamente as classes GEOM compiladas estaticamente ou carregadas via módulos. Cada classe realiza um “tasting” (degustação) dos providers disponíveis: ela verifica se o provider contém metadados que correspondem ao seu formato. Se encontrar, a classe se anexa ao provider e inicia sua transformação. Por exemplo, a classe gmirror vasculha os discos em busca de metadados de mirror; ao encontrá-los, monta o volume espelhado e o disponibiliza em /dev/mirror/. Esse processo é automático, determinístico e extremamente confiável — características que fazem do GEOM a espinha dorsal do armazenamento no FreeBSD há mais de duas décadas.
O design modular também permite que administradores carreguem e descarreguem classes sob demanda, sem reinicializar o sistema. O comando kldload carrega módulos GEOM no kernel em execução, enquanto kldstat lista os módulos ativos. Essa capacidade de extensão dinâmica é crucial em ambientes de produção, onde adicionar funcionalidades de armazenamento sem downtime é um requisito frequente. Nas próximas seções, exploraremos essa dinâmica na prática, começando com uma visão geral das classes disponíveis.
Classes GEOM Essenciais — Visão Geral e Propósitos
O FreeBSD oferece dezenas de classes GEOM, cada uma projetada para resolver um problema específico de armazenamento. Conhecer as principais classes é essencial para selecionar a ferramenta adequada em cada cenário. Abaixo, uma tabela de referência com as classes mais utilizadas em ambientes de produção e laboratório:
| Classe GEOM | Nome do Módulo | Propósito Principal | Dispositivo Resultante (exemplo) |
|---|---|---|---|
| gmirror | geom_mirror.ko | RAID 1 — espelhamento de discos para redundância | /dev/mirror/gm0 |
| gstripe | geom_stripe.ko | RAID 0 — striping para performance (sem redundância) | /dev/stripe/st0 |
| gconcat | geom_concat.ko | Concatenação (JBOD) — une discos sequencialmente | /dev/concat/ct0 |
| geli | geom_eli.ko | Criptografia de disco em nível de bloco (AES-XTS, AES-CBC) | /dev/mirror/gm0.eli |
| graid3 | geom_raid3.ko | RAID 3 — striping com disco de paridade dedicado | /dev/raid3/r0 |
| gmultipath | geom_multipath.ko | Multipath I/O — múltiplos caminhos para o mesmo dispositivo | /dev/multipath/mp0 |
| gjournal | geom_journal.ko | Journaling em nível de bloco para sistemas UFS | /dev/ada0p1.journal |
| gnop | geom_nop.ko | Dispositivo de passagem (útil para testes e simulações de falha) | /dev/ada0.nop |
Cada classe possui seu próprio conjunto de comandos de gerenciamento, tipicamente acessíveis através do utilitário geom (por exemplo, geom mirror load, geom mirror status) ou diretamente pelo comando específico da classe (gmirror, gstripe, geli, etc.). O padrão de nomenclatura segue a lógica g<nome_da_classe>, o que facilita a memorização e a descoberta de funcionalidades através do autocompletar do shell. Por exemplo, digitando gm e pressionando TAB, o shell listará todos os comandos iniciados com essas letras, incluindo gmirror e gmultipath.
Para verificar quais classes GEOM estão atualmente carregadas em seu sistema, utilize o comando kldstat | grep geom. A saída mostrará os módulos geom carregados, como geom_mirror.ko, geom_eli.ko, entre outros. Classes compiladas estaticamente no kernel (como GEOM_PART para particionamento) não aparecerão como módulos, mas estarão disponíveis desde o boot. Na prática diária, isso significa que você pode começar a usar classes como gpart imediatamente, enquanto outras como gmirror precisam ser carregadas explicitamente (se não estiverem compiladas no kernel customizado).
Uma distinção crucial que fazemos em nossos treinamentos na JRT Technology Solutions é entre classes que armazenam metadados nos próprios discos (como gmirror, que grava um setor de metadados no último setor de cada provider) e classes que são puramente voláteis (como gnop, que apenas redireciona I/O sem persistir configuração). As primeiras são “auto-detectáveis” no boot — o kernel lê os metadados e reconstrói a configuração automaticamente. As segundas precisam ser configuradas a cada inicialização via scripts. Essa diferença impacta diretamente a estratégia de recuperação de desastres e a documentação do ambiente.
Passo a Passo: Criando um RAID 1 (Mirror) com GEOM (gmirror)
Agora que você compreende a teoria, vamos colocar as mãos no teclado. Nosso objetivo é criar um RAID 1 — também chamado de mirror — utilizando dois discos idênticos, /dev/ada1 e /dev/ada2. Este tipo de arranjo garante que todos os dados escritos no volume sejam replicados integralmente em ambos os discos físicos. Se um disco falhar, o sistema continua operando normalmente com o disco sobrevivente. Quando o disco substituído for inserido, o GEOM sincroniza automaticamente os dados. Esta é a base da tolerância a falhas em nível de bloco no FreeBSD.
Atenção: Confirme novamente os nomes dos dispositivos no seu sistema antes de prosseguir. Execute camcontrol devlist ou geom disk list para listar todos os discos. Os discos que você usará devem estar sem partições e sem dados importantes. Se houver partições existentes, você pode removê-las com gpart destroy -F /dev/ada1 e gpart destroy -F /dev/ada2, assumindo que esses são os discos corretos.
- Carregue o módulo gmirror no kernel: O módulo geom_mirror.ko precisa estar carregado antes de qualquer operação. Execute como root:
# Carregar o módulo GEOM MIRROR dinamicamente
kldload geom_mirror
# Verificar se o módulo foi carregado com sucesso
kldstat | grep geom_mirror
6 1 0xffffffff82710000 5d90 geom_mirror.ko
A saída mostra que o módulo geom_mirror.ko está carregado no kernel. O número “6” indica o ID do módulo na lista de módulos carregados; “1” é o contador de referências (outros módulos que dependem dele); o endereço hexadecimal e o tamanho (5d90 em hex, aproximadamente 24 KB) são informativos.
- Carregue o módulo no boot (para persistência): Para que o mirror seja reconhecido automaticamente em reinicializações futuras, adicione a linha de carregamento no arquivo
/boot/loader.conf. Sem isso, o módulo não estará disponível no próximo boot, e o kernel não conseguirá interpretar os metadados do mirror nos discos.
# Adicionar o módulo ao carregamento automático
echo 'geom_mirror_load="YES"' >> /boot/loader.conf
# Verificar se a linha foi adicionada
cat /boot/loader.conf | grep geom_mirror
geom_mirror_load="YES"
- Crie o mirror com os dois discos: O comando gmirror label cria o mirror e grava os metadados nos discos. O parâmetro label define um nome amigável para o volume; usaremos gm0 (abreviação de “geom mirror 0”). As flags importantes são:
- -v: modo verboso — exibe informações detalhadas durante a operação
- -b prefer: política de balanceamento — “prefer” direciona leituras para o disco com menor latência média
- -s 2048: tamanho do setor — 2048 bytes é o padrão para compatibilidade com setores 4K (discos modernos)
# Criar o mirror chamado "gm0" com dois discos
gmirror label -v -b prefer -s 2048 gm0 /dev/ada1 /dev/ada2
Metadata value stored on /dev/ada1.
Metadata value stored on /dev/ada2.
Done.
A saída confirma que os metadados foram gravados em ambos os discos. A partir deste momento, o dispositivo /dev/mirror/gm0 está disponível e pronto para ser utilizado como um disco comum. O GEOM criou automaticamente o nó de dispositivo e iniciou o processo de sincronização inicial (se os discos estiverem vazios, a sincronização é instantânea, pois não há dados divergentes).
- Verifique o status do mirror: Imediatamente após a criação, é fundamental verificar se o mirror está íntegro e se ambos os discos estão ativos.
# Verificar o status geral do mirror
gmirror status
Name Status Components
mirror/gm0 COMPLETE ada1 (ACTIVE)
ada2 (ACTIVE)
O status COMPLETE indica que o mirror está totalmente sincronizado e funcional. Ambos os discos aparecem como ACTIVE, o que significa que estão participando ativamente do mirror. Se um disco estivesse sendo sincronizado, apareceria como SYNCHRONIZING com uma porcentagem de progresso (ex.: “ada2 (SYNCHRONIZING, 45%)”). O nome do dispositivo é apresentado como mirror/gm0, e o caminho completo no sistema de arquivos é /dev/mirror/gm0.
- Liste informações detalhadas do mirror: O comando gmirror list exibe um dicionário completo de propriedades, incluindo o estado de cada componente, o algoritmo de balanceamento, o tamanho do setor e a geração dos metadados.
# Listar propriedades detalhadas do mirror gm0
gmirror list gm0
Geom name: gm0
State: COMPLETE
Components: 2
Balance: prefer
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1441151881
Type: AUTOMATIC
Providers:
1. Name: mirror/gm0
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r1w1e1
Consumers:
1. Name: ada1
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
2. Name: ada2
Mediasize: 2147483648 (2.0G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Esta saída detalhada é uma mina de informações. Observe o Mediasize: 2 GB em cada disco, totalizando 2 GB de espaço útil (em RAID 1, a capacidade é igual à do menor disco). O Sectorsize de 512 bytes é o setor lógico; o slice de 4096 (4K) foi definido pela flag -s 2048 que especificamos (2048 setores de 512 bytes = 1 MB de slice — aguarde, vamos esclarecer: na verdade a flag -s define o tamanho do setor físico em bytes; o valor 2048 foi um exemplo didático, mas o padrão é 4096 para discos modernos. Peço que considere o valor padrão como ideal).
- Crie um sistema de arquivos no mirror e monte-o: Agora que o dispositivo /dev/mirror/gm0 está disponível, vamos formatá-lo com UFS e montá-lo para uso. Este passo valida que o mirror está realmente operacional como um disco comum.
# Criar sistema de arquivos UFS no volume mirror
newfs -U /dev/mirror/gm0
# Criar ponto de montagem
mkdir -p /mnt/mirror
# Montar o volume
mount /dev/mirror/gm0 /mnt/mirror
# Verificar a montagem
df -h /mnt/mirror
/dev/mirror/gm0 2.0G 8.0K 1.8G 0% /mnt/mirror
A saída do df -h confirma que o volume mirror está montado em /mnt/mirror com aproximadamente 2 GB de espaço disponível. A flag -U no newfs habilita soft-updates, uma otimização de performance para UFS que reduz drasticamente a necessidade de verificações de consistência após panes.
- Escreva dados de teste e verifique a replicação: Vamos criar um arquivo no mirror e depois verificar se ele está fisicamente presente em ambos os discos (embora normalmente você acesse apenas via mirror, didaticamente podemos inspecionar).
# Criar um arquivo de teste no mirror
echo "Dados críticos replicados pelo GEOM gmirror" > /mnt/mirror/teste.txt
# Sincronizar dados para garantir escrita em disco
sync
# Verificar o conteúdo lendo via mirror
cat /mnt/mirror/teste.txt
Dados críticos replicados pelo GEOM gmirror
Este simples teste confirma que a gravação via dispositivo mirror funciona perfeitamente. Internamente, o gmirror intercepta cada bloco escrito em /dev/mirror/gm0 e o replica sincronamente para /dev/ada1 e /dev/ada2. Se você desmontar o mirror e montar qualquer um dos discos individualmente (apenas para fins de recuperação de dados), encontrará o mesmo conteúdo — mas lembre-se de que acessar diretamente um disco que participa de um mirror ativo pode corromper os metadados e deve ser feito apenas em cenários de disaster recovery.
Configuração Avançada do GEOM — Arquivos e Parâmetros de Persistência
Um mirror funcional é apenas o começo. Em ambientes de produção, você precisa garantir que a configuração GEOM sobreviva a reinicializações e que o comportamento do mirror seja previsível sob diferentes condições de carga e falha. O FreeBSD oferece vários mecanismos para ajustar esses parâmetros. O arquivo central para persistência é o /boot/loader.conf, onde você pode não apenas carregar módulos, mas também definir variáveis de configuração específicas de cada classe GEOM.
Para o gmirror, além de geom_mirror_load="YES", você pode configurar o algoritmo de balanceamento padrão e o comportamento de slice size. Veja um exemplo completo de um loader.conf otimizado para um servidor de arquivos com mirror:
# /boot/loader.conf — Configuração de módulos GEOM
# Carregar módulos de armazenamento
geom_mirror_load="YES"
geom_eli_load="YES"
geom_journal_load="YES"
# Ajustes específicos do gmirror
# Balanceamento padrão: load (divide leituras entre discos por carga)
kern.geom.mirror.balance="load"
# Tamanho do slice em bytes (4096 = 4K, alinhado com discos modernos)
kern.geom.mirror.slice_size="4096"
# Sincronização com prioridade mais baixa (menos impacto durante sync)
kern.geom.mirror.sync_priority="20"
# Timeout para detecção de falha de disco (em segundos)
kern.geom.mirror.timeout="30"
# Desabilitar debug para produção
kern.geom.mirror.debug="0"
# Aumentar o número máximo de GEOMs para ambientes com muitos discos
kern.geom.maxunits="64"
Essas variáveis são lidas durante o boot e aplicadas antes da detecção de metadados. O parâmetro kern.geom.mirror.balance pode assumir os valores load (distribui leituras por carga), prefer (prefere o disco com menor latência), round-robin (alterna entre discos), ou split (divide por blocos). Em nossos servidores de banco de dados na JRT Technology Solutions, optamos por load para maximizar a utilização de ambos os discos durante picos de leitura.
Outro arquivo relevante é o /etc/sysctl.conf, onde você pode ajustar parâmetros em tempo de execução (após o boot) usando sysctl. Embora as configurações do loader sejam preferíveis para persistência, o sysctl permite ajustes dinâmicos sem reinicialização. Por exemplo, para alterar o balanceamento de um mirror já em operação:
# Alterar balanceamento para round-robin em tempo real
sysctl kern.geom.mirror.balance="round-robin"
Além dos arquivos de configuração, o GEOM mantém metadados nos próprios discos. No caso do gmirror, os metadados residem no último setor de cada provider. Você pode inspecioná-los com o comando:
# Ler os metadados do gmirror do disco ada1 (apenas para inspeção)
gmirror dump /dev/ada1
Metadata on /dev/ada1:
magic: GEOM::MIRROR
version: 5
name: gm0
id: 1441151881
syncid: 1
genid: 0
slice: 4096
balance: prefer
mediasize: 2147483648
sectorsize: 512
md_a_syncid: 1
md_a_genid: 0
md_b_syncid: 1
md_b_genid: 0
md_a_disk: ada1
md_b_disk: ada2
Este dump é extremamente útil para diagnóstico de falhas. O campo magic identifica o tipo de metadado (cada classe GEOM tem sua própria assinatura mágica). A version indica a versão do formato de metadados — incompatibilidades de versão podem ocorrer ao mover discos entre sistemas com versões diferentes do FreeBSD. Os campos md_a_* e md_b_* armazenam informações sobre cada disco componente do mirror.
Verificando a Instalação / Testando a Configuração
Após criar e configurar seu mirror, é indispensável executar uma bateria de verificações para garantir que tudo está funcionando conforme esperado. A seção a seguir lista comandos de diagnóstico que devem ser executados e a saída esperada em um ambiente saudável. Execute cada um deles no seu sistema e compare com as saídas fornecidas.
1. Verificação da classe GEOM carregada:
kldstat | grep geom_mirror
6 1 0xffffffff82710000 5d90 geom_mirror.ko
Interpretação: O módulo geom_mirror está presente na tabela de módulos do kernel. O primeiro número é o ID; o segundo é o contador de referências (deve ser ≥ 1). Se não houver saída, o módulo não foi carregado.
2. Listagem de mirrors configurados no sistema:
gmirror list
Geom name: gm0
State: COMPLETE
Components: 2
Balance: prefer
...
Interpretação: O mirror gm0 aparece com estado COMPLETE. Se aparecer DEGRADED ou BROKEN, há problemas sérios que precisam de intervenção imediata.
3. Status resumido do mirror:
gmirror status
Name Status Components
mirror/gm0 COMPLETE ada1 (ACTIVE)
ada2 (ACTIVE)
Interpretação: Ambos os componentes estão ACTIVE e o status é COMPLETE. Se um disco estiver ausente, aparecerá como MISSING.
4. Verificação do device node:
ls -la /dev/mirror/
total 1
drwxr-xr-x 2 root wheel 512 Aug 7 14:23 .
drwxr-xr-x 8 root wheel 512 Aug 7 14:23 ..
crw-r----- 1 root operator 0x73 Aug 7 14:23 gm0
Interpretação: O device node gm0 existe no diretório /dev/mirror/. As permissões padrão permitem leitura/escrita para root e grupo operator.
5. Verificação de consistência de metadados entre os discos:
gmirror dump /dev/ada1 | grep -E 'syncid|genid'
gmirror dump /dev/ada2 | grep -E 'syncid|genid'
syncid: 1
genid: 0
md_a_syncid: 1
md_a_genid: 0
md_b_syncid: 1
md_b_genid: 0
Interpretação: Os valores de syncid e genid devem ser idênticos em ambos os discos. Discordâncias indicam que os discos estão fora de sincronia ou que pertencem a mirrors diferentes.
6. Teste de I/O funcional:
dd if=/dev/random of=/mnt/mirror/teste_io bs=1M count=10
ls -lh /mnt/mirror/teste_io
10+0 records in
10+0 records out
10485760 bytes transferred in 0.023428 secs (447612425 bytes/sec)
-rw-r--r-- 1 root wheel 10M Aug 7 14:25 /mnt/mirror/teste_io
Interpretação: 10 megabytes foram escritos e lidos com sucesso. A taxa de transferência (~447 MB/s) reflete a performance do disco virtual; em hardware real, espere valores compatíveis com a velocidade dos discos.
Erros Comuns e Como Resolver
Mesmo administradores experientes encontram obstáculos ao trabalhar com GEOM. A diferença está em saber diagnosticar rapidamente e aplicar a solução correta. Compilamos aqui os erros mais frequentes que encontramos em campo, tanto em laboratórios de treinamento quanto em implantações na JRT Technology Solutions. Para cada erro, fornecemos a causa raiz, o sintoma observado e o procedimento completo de resolução.
-
Erro 1: “gmirror: can’t store metadata on /dev/ada1: Operation not permitted”
Causa: O disco /dev/ada1 contém uma tabela de partições (GPT ou MBR) com partições ativas montadas ou em uso, ou o disco está aberto por outro subsistema (como ZFS). O gmirror precisa gravar metadados no último setor do disco, e a presença de partições pode bloquear essa operação.
Sintoma: O comando gmirror label falha imediatamente com a mensagem de permissão negada, mesmo executando como root.
Solução: Destrua completamente a tabela de partições do disco. Primeiro, desmonte qualquer partição que esteja montada:umount /dev/ada1p*(se aplicável). Depois, destrua o esquema de particionamento com gpart: executegpart destroy -F /dev/ada1. Se houver resquícios de ZFS, usezpool labelclear -f /dev/ada1. Em último caso, sobrescreva os primeiros e últimos setores com zeros:dd if=/dev/zero of=/dev/ada1 bs=512 count=34edd if=/dev/zero of=/dev/ada1 bs=512 seek=$(diskinfo ada1 | awk '{print $3 - 34}') count=34. Após a limpeza, o comando gmirror label deve funcionar. -
Erro 2: Mirror aparece como DEGRADED após o boot, com um disco MISSING
Causa: O disco ausente pode ter falhado fisicamente, ter sido desconectado, ou pode haver um problema de detecção de hardware. Outra possibilidade comum é a ordem de enumeração de dispositivos ter mudado (ex.: o disco que antes era ada2 agora é ada3 após adicionar novo hardware), e os metadados do mirror não corresponderem ao dispositivo esperado.
Sintoma:gmirror statusmostra um componente como MISSING e o status do mirror como DEGRADED. O sistema pode inicializar lentamente, aguardando timeout do disco faltante.
Solução: Primeiro, verifique se o disco está fisicamente presente:camcontrol devlistougeom disk list. Se o disco aparecer com um nome diferente, você pode re-inseri-lo no mirror usando o novo nome:gmirror insert gm0 /dev/ada3(substitua ada3 pelo nome correto). Se o disco estiver presente mas com metadados corrompidos, remova-o do mirror comgmirror remove gm0 /dev/ada2e depois recrie-o:gmirror insert gm0 /dev/ada2. O processo de sincronização iniciará automaticamente. Se o disco realmente falhou, substitua-o por um novo de capacidade igual ou maior e executegmirror insert gm0 /dev/<novo_disco>. Em nossos procedimentos operacionais na JRT, sempre mantemos um cold spare rotulado para cada servidor. -
Erro 3: Falha na sincronização com “gmirror: Synchronization request failed”
Causa: Geralmente, um dos discos possui setores defeituosos (bad blocks) que impedem a leitura ou escrita durante a sincronização. Também pode ocorrer por timeout de I/O se o disco estiver respondendo lentamente devido a vibração excessiva, superaquecimento, ou cabo SATA danificado.
Sintoma: Durante a sincronização, o progresso trava em uma porcentagem específica (ex.: 45%) e depois o comando falha com a mensagem de erro. O dmesg pode mostrar erros de I/O comoREAD_DMAouWRITE_DMAcom status de erro.
Solução: Identifique qual disco está com problemas usandogmirror list gm0e observando qual consumidor apresenta contagem de erros (Mode: r1w1e1onde o ‘e’ indica erros). Execute um teste de superfície no disco suspeito:dd if=/dev/ada2 of=/dev/null bs=1Me observe o dmesg em busca de erros de leitura. Se confirmado, substitua o disco. Para forçar a retomada da sincronização ignorando setores defeituosos (apenas como medida temporária), você pode usargmirror forget gm0para limpar o status de sincronização e depois reiniciar comgmirror insert gm0 /dev/ada2. Contudo, a solução definitiva é a substituição do hardware. -
Erro 4: “geom_mirror.ko: module already loaded or in kernel”
Causa: O módulo geom_mirror já está carregado, seja porque foi compilado estaticamente no kernel, seja porque foi carregado anteriormente por outro script ou pelo loader.
Sintoma: Ao executarkldload geom_mirror, o sistema retorna a mensagem de que o módulo já está carregado. Isso não é exatamente um erro — o módulo já está funcional — mas pode confundir administradores que esperam uma confirmação de carregamento.
Solução: Simplesmente ignore a mensagem e prossiga com a criação do mirror. Para verificar se o módulo está realmente ativo, usekldstat | grep geom_mirror. Se houver uma entrada, o módulo está operacional. Não é necessário (nem possível) descarregar e recarregar se a classe já estiver em uso por mirrors ativos. -
Erro 5: “Cannot access /dev/mirror/gm0: No such file or directory” após o boot
Causa: O arquivo/boot/loader.confnão contém a linhageom_mirror_load="YES", portanto o módulo não foi carregado durante o boot e os metadados nos discos não foram interpretados pelo kernel. Sem o módulo, o device node em/dev/mirror/não é criado.
Sintoma: Após reinicializar, o mirror não aparece. Comandos comomount /dev/mirror/gm0 /mnt/mirrorfalham com “No such file or directory”.
Solução: Carregue o módulo manualmente:kldload geom_mirror. O kernel fará o tasting dos providers imediatamente e recriará o device node/dev/mirror/gm0. Para tornar permanente, adicione a linhageom_mirror_load="YES"ao arquivo/boot/loader.confe confirme comcat /boot/loader.conf | grep geom_mirror. Alternativamente, compile o módulo estaticamente no kernel adicionandodevice geom_mirrorao arquivo de configuração do kernel customizado.
Boas Práticas e Dicas Avançadas com GEOM
Dominar o GEOM vai além de saber criar mirrors — envolve adotar práticas que maximizam a confiabilidade e a performance ao longo do ciclo de vida do sistema. A primeira recomendação, e talvez a mais importante, é documentar meticulosamente a topologia de armazenamento. Em nossos datacenters na JRT Technology Solutions, mantemos um diagrama atualizado de cada servidor indicando quais discos físicos compõem qual volume GEOM, os respectivos números de série, e as relações de dependência entre classes. Quando ocorre uma falha às 3 da manhã, essa documentação reduz o tempo de diagnóstico de horas para minutos.
Utilize labels descritivos ao nomear seus volumes GEOM. Em vez de gm0, prefira nomes como mirror-postgres ou raid-zabbix-db. Isso parece trivial, mas em servidores com múltiplos mirrors, stripes e volumes criptografados, nomes genéricos são uma receita para desastres. O comando gmirror label -v mirror-postgres /dev/ada1 /dev/ada2 criará um device /dev/mirror/mirror-postgres que é autoexplicativo para qualquer administrador que acessar o sistema.
Monitore ativamente o status dos volumes GEOM com scripts de verificação periódica. Um simples script executado via cron pode detectar mirrors degradados e enviar alertas por e-mail antes que uma falha simples se transforme em perda de dados:
#!/bin/sh
# Script de monitoramento de mirrors GEOM
# Executar via cron a cada 5 minutos
STATUS=$(gmirror status | grep -c DEGRADED)
if [ "$STATUS
Quer aprender na prática com especialistas?
A JRT Technology Solutions oferece treinamentos e implementação de FreeBSD para equipes corporativas.