
Capítulo 18. GEOM: Framework de Transformação de Disco Modular
Esta tradução pode estar desatualizada. Para ajudar com as traduções, acesse a ferramenta de traduções do FreeBSD.
Índice
18.1. Sinopse
No FreeBSD, o framework GEOM permite acesso e controle à classes, tais como Master Boot Records e labels BSD, através do uso de provedores, ou dos dispositivos de disco em /dev. Ao suportar várias configurações de RAID via software, o GEOM fornece, de forma transparente, acesso ao sistema operacional e aos utilitários do sistema operacional.
Este capítulo aborda o uso de discos sob o framework do GEOM no FreeBSD. Isso inclui os principais utilitários de controle RAID os quais usam o framework para configuração. Este capítulo não é um guia definitivo para as configurações de RAID e somente as classificações de RAID suportadas pelo GEOM são discutidas.
Depois de ler este capítulo, você saberá:
Que tipo de suporte a RAID está disponível através do GEOM.
Como usar os utilitários da base para configurar, manter e manipular os vários níveis de RAID.
Como espelhar, distribuir, criptografar e conectar remotamente dispositivos de disco por meio do GEOM.
Como solucionar problemas de discos conectados ao framework do GEOM.
Antes de ler este capítulo, você deve:
Entender como o FreeBSD trata os dispositivos de disco (Armazenamento).
Saber como configurar e instalar um novo kernel (Configurando o kernel do FreeBSD).
18.2. RAID0 - Striping
O striping combina várias unidades de disco em um único volume. O striping pode ser realizado através do uso de hardwares controladores de RAID. O subsistema de disco GEOM fornece suporte de software para striping de disco, também conhecido como RAID0, sem a necessidade de um controlador RAID de disco.
No RAID0, os dados são divididos em blocos que são gravados em todas as unidades do array. Como pode ser visto na ilustração a seguir, em vez de esperar no sistema para gravar 256k em um disco, o RAID0 pode gravar 64k simultaneamente em cada um dos quatro discos do array, oferecendo um desempenho de I/O superior. Esse desempenho pode ser aprimorado ainda mais usando vários controladores de disco.

Cada disco em um stripe RAID0 deve ser do mesmo tamanho, pois as solicitações de I/O são intercaladas para ler ou gravar em vários discos em paralelo.
O RAID0 não fornece qualquer redundância. Isso significa que, se um disco no array falhar, todos os dados nos discos serão perdidos. Se os dados forem importantes, implemente uma estratégia de backup que salva regularmente os backups em um sistema ou dispositivo remoto. |
O processo para criar um RAID0 por software, baseado no GEOM, em um sistema FreeBSD usando discos comuns é o seguinte. Uma vez que o stripe tiver sido criado, consulte gstripe(8) para obter maioress informações sobre como controlar uma stripe existente.
Procedure: Criando um Stripe de Discos ATA Não Formatados
Carregue o módulo geom_stripe.ko:
# kldload geom_stripe
Assegure-se de que exista um ponto de montagem adequado. Se esse volume se tornar uma partição root, use temporariamente outro ponto de montagem, como /mnt.
Determine os nomes dos dispositivos para os discos que serão striped e crie o novo dispositivo de stripe. Por exemplo, para distribuir dois discos ATA não utilizados e não particionados com nomes de dispositivos /dev/ad2 e /dev/ad3:
# gstripe label -v st0 /dev/ad2 /dev/ad3 Metadata value stored on /dev/ad2. Metadata value stored on /dev/ad3. Done.
Escreva um label padrão, também conhecido como tabela de partição, no novo volume e instale o código do bootstrap padrão:
# bsdlabel -wB /dev/stripe/st0
Este processo deve criar dois outros dispositivos em /dev/stripe além de st0. Esses incluem o st0a e o st0c. Neste ponto, um sistema de arquivos UFS pode ser criado no st0a usando o
newfs
:# newfs -U /dev/stripe/st0a
Muitos números irão deslizar pela tela e, após alguns segundos, o processo será concluído. O volume foi criado e está pronto para ser montado.
Para montar manualmente o stripe de disco criado:
# mount /dev/stripe/st0a /mnt
Para montar este sistema de arquivos distribuído automaticamente durante o processo de inicialização, coloque as informações do volume no arquivo /etc/fstab. Neste exemplo, um ponto de montagem permanente, chamado stripe, é criado:
# mkdir /stripe # echo "/dev/stripe/st0a /stripe ufs rw 2 2" \ >> /etc/fstab
O módulo geom_stripe.ko também deve ser carregado automaticamente durante a inicialização do sistema, adicionando uma linha ao arquivo /boot/loader.conf:
# echo 'geom_stripe_load="YES"' >> /boot/loader.conf
18.3. RAID1 - Espelhamento
O RAID1, ou espelhamento, é a técnica de gravar os mesmos dados em mais de uma unidade de disco. Os espelhos são geralmente usados para proteger contra perda de dados devido a falhas na unidade. Cada unidade espelhada contém uma cópia idêntica dos dados. Quando uma unidade individual falha, o espelhamento continua a funcionar, fornecendo dados a partir das unidades que ainda estão funcionando. O computador continua funcionando e o administrador tem tempo para substituir a unidade com falha sem impactar o usuário.
Duas situações comuns são ilustradas nesses exemplos. O primeiro cria um espelhamento de dois novos discos e usa-o como um substituto para um único disco existente. O segundo exemplo cria um espelho em um único disco novo, copia os dados do disco antigo para ele e insere o disco antigo no espelho. Embora esse procedimento seja um pouco mais complicado, ele requer apenas um novo disco.
Tradicionalmente, os dois discos em um espelhamento são idênticos em modelo e capacidade, mas o gmirror(8) não requer isso. Os espelhamentos criados com discos diferentes terão uma capacidade igual à da menor unidade no espelhamento. O espaço extra em discos maiores não será usado. Os discos inseridos posteriormente no espelhamento devem ter pelo menos a mesma capacidade que o menor disco já existente no espelhamento.
Os procedimentos de espelhamento mostrados aqui são não-destrutivos, mas como em qualquer grande operação de disco, faça um backup completo primeiro. |
18.3.1. Problemas de Metadados
Muitos sistemas de disco armazenam metadados no final de cada disco. Metadados antigos devem ser apagados antes de reutilizar o disco em um espelhamento. A maioria dos problemas é causada por dois tipos particulares de metadados residuais: tabelas de partição GPT e metadados antigos de um espelhamento anterior.
Os metadados GPT podem ser apagados com gpart(8). Este exemplo apaga as tabelas de partições primárias e de backup do GPT do disco ada8:
# gpart destroy -F ada8
Um disco pode ser removido de um espelhamento ativo e os metadados apagados em uma etapa usando gmirror(8). Aqui, o disco de exemplo ada8 é removido do espelhamento ativo gm4:
# gmirror remove gm4 ada8
Se o espelhamento não estiver em execução, mas os metadados do espelhamento antigo ainda estiverem no disco, use o comando gmirror clear
para removê-lo:
# gmirror clear ada8
O gmirror(8) armazena um bloco de metadados no final do disco. Como os esquemas de partição GPT também armazenam metadados no final do disco, espelhar discos GPT inteiros com gmirror(8) não é recomendado. O particionamento MBR é usado aqui porque armazena apenas uma tabela de partição no início do disco e não entra em conflito com os metadados espelhados.
18.3.2. Criando um Espelhamento com Dois Discos Novos
Neste exemplo, o FreeBSD já foi instalado em um único disco, ada0. Dois novos discos, ada1 e ada2, foram conectados ao sistema. Um novo espelhamento será criado nesses dois discos e usado para substituir o antigo disco único.
O módulo do kernel geom_mirror.ko deve ser compilado no kernel ou carregado no boot ou em tempo de execução. Carregue manualmente o módulo do kernel agora:
# gmirror load
Crie o espelho com as duas novas unidades:
# gmirror label -v gm0 /dev/ada1 /dev/ada2
O gm0 é um nome de dispositivo escolhido pelo usuário atribuído ao novo espelhamento. Depois que o espelhamento for iniciado, o nome desse dispositivo aparecerá em /dev/mirror/.
As tabelas de partição MBR e bsdlabel agora podem ser criadas no mirror com o gpart(8). Este exemplo usa um layout de sistema de arquivos tradicional, com partições para /, swap, /var, /tmp e /usr. Um único / e uma partição swap também funcionarão.
As partições no espelho não precisam ser do mesmo tamanho que as do disco existente, mas devem ser grandes o suficiente para conter todos os dados já presentes no disco ada0.
# gpart create -s MBR mirror/gm0
# gpart add -t freebsd -a 4k mirror/gm0
# gpart show mirror/gm0
=> 63 156301423 mirror/gm0 MBR (74G)
63 63 - free - (31k)
126 156301299 1 freebsd (74G)
156301425 61 - free - (30k)
# gpart create -s BSD mirror/gm0s1
# gpart add -t freebsd-ufs -a 4k -s 2g mirror/gm0s1
# gpart add -t freebsd-swap -a 4k -s 4g mirror/gm0s1
# gpart add -t freebsd-ufs -a 4k -s 2g mirror/gm0s1
# gpart add -t freebsd-ufs -a 4k -s 1g mirror/gm0s1
# gpart add -t freebsd-ufs -a 4k mirror/gm0s1
# gpart show mirror/gm0s1
=> 0 156301299 mirror/gm0s1 BSD (74G)
0 2 - free - (1.0k)
2 4194304 1 freebsd-ufs (2.0G)
4194306 8388608 2 freebsd-swap (4.0G)
12582914 4194304 4 freebsd-ufs (2.0G)
16777218 2097152 5 freebsd-ufs (1.0G)
18874370 137426928 6 freebsd-ufs (65G)
156301298 1 - free - (512B)
Torne o espelhamento inicializável instalando o bootcode no MBR e no bsdlabel e definindo a slice ativa:
# gpart bootcode -b /boot/mbr mirror/gm0
# gpart set -a active -i 1 mirror/gm0
# gpart bootcode -b /boot/boot mirror/gm0s1
Formate os sistemas de arquivos no novo espelhamento, habilitando as atualizações simples.
# newfs -U /dev/mirror/gm0s1a
# newfs -U /dev/mirror/gm0s1d
# newfs -U /dev/mirror/gm0s1e
# newfs -U /dev/mirror/gm0s1f
Os sistemas de arquivos do disco original ada0 agora podem ser copiados para o espelho com o dump(8) e o restore(8).
# mount /dev/mirror/gm0s1a /mnt
# dump -C16 -b64 -0aL -f - / | (cd /mnt && restore -rf -)
# mount /dev/mirror/gm0s1d /mnt/var
# mount /dev/mirror/gm0s1e /mnt/tmp
# mount /dev/mirror/gm0s1f /mnt/usr
# dump -C16 -b64 -0aL -f - /var | (cd /mnt/var && restore -rf -)
# dump -C16 -b64 -0aL -f - /tmp | (cd /mnt/tmp && restore -rf -)
# dump -C16 -b64 -0aL -f - /usr | (cd /mnt/usr && restore -rf -)
Edite o arquivo /mnt/etc/fstab para apontar para os novos sistemas de arquivos espelhados:
# Device Mountpoint FStype Options Dump Pass# /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1d /var ufs rw 2 2 /dev/mirror/gm0s1e /tmp ufs rw 2 2 /dev/mirror/gm0s1f /usr ufs rw 2 2
Se o módulo do kernel geom_mirror.ko não foi compilado no kernel, o /mnt/boot/loader.conf é editado para carregar o módulo na inicialização:
geom_mirror_load="YES"
Reinicialize o sistema para testar o novo espelhamento e verifique se todos os dados foram copiados. A BIOS verá o espelhamento como duas unidades individuais em vez de um espelhamento. Como as unidades são idênticas, não importa qual seja selecionado para inicializar.
Veja Solução de problemas se houver problemas ao inicializar. Desligar e desconectar o disco original ada0 permitirá que ele seja mantido como um backup offline.
Em uso, o espelhamento se comportará exatamente como a unidade original.
18.3.3. Criando um Espelhamento com Uma Unidade Existente
Neste exemplo, o FreeBSD já foi instalado em um único disco, ada0. Um novo disco, ada1, foi conectado ao sistema. Um espelhamento de um disco será criado no novo disco, o sistema existente será copiado para ele e, em seguida, o disco antigo será inserido no espelho. Esse procedimento um pouco complexo é necessário porque o gmirror
precisa colocar um bloco de metadados de 512 bytes no final de cada disco, e o ada0 geralmente possui todo o seu espaço já alocado.
Carregue o módulo do kernel geom_mirror.ko:
# gmirror load
Verifique o tamanho da mídia do disco original com diskinfo
:
# diskinfo -v ada0 | head -n3
/dev/ada0
512 # sectorsize
1000204821504 # mediasize in bytes (931G)
Crie um espelhamento no novo disco. Para garantir que a capacidade do espelhamento não seja maior do que a unidade ada0 original, gnop(8) é usado para criar uma unidade falsa exatamente do mesmo tamanho. Esta unidade não armazena dados, mas é usada apenas para limitar o tamanho do espelhamento. Quando o gmirror(8) cria o espelhamento, ele irá restringir a capacidade ao tamanho de gzero.nop, mesmo se a nova unidade ada1 tiver mais espaço. Note que o 1000204821504 na segunda linha é igual ao tamanho de mídia do ada0 como mostrado pelo comando diskinfo
acima.
# geom zero load
# gnop create -s 1000204821504 gzero
# gmirror label -v gm0 gzero.nop ada1
# gmirror forget gm0
Como o gzero.nop não armazena nenhum dado, o espelhamento não o vê como conectado. É dito para o espelhamento "esquecer" os componentes desconectados, removendo referências para gzero.nop. O resultado é um dispositivo espelhado contendo apenas um único disco, ada1.
Depois de criar o gm0, veja a tabela de partições em ada0. Esta saída é de uma unidade de 1 TB. Se houver algum espaço não alocado no final da unidade, o conteúdo pode ser copiado diretamente de ada0 para o novo espelho.
No entanto, se a saída mostrar que todo o espaço no disco está alocado, como na listagem a seguir, não há espaço disponível para os 512-bytes de metadados de espelhamento no final do disco.
# gpart show ada0
=> 63 1953525105 ada0 MBR (931G)
63 1953525105 1 freebsd [active] (931G)
Neste caso, a tabela de partição deve ser editada para reduzir a capacidade de um setor em mirror/gm0. O procedimento será explicado mais tarde.
Em qualquer um dos casos, as tabelas de partição no disco principal devem ser primeiro copiadas usando gpart backup
e gpart restore
.
# gpart backup ada0 > table.ada0
# gpart backup ada0s1 > table.ada0s1
Esses comandos criam dois arquivos, table.ada0 e table.ada0s1. Este exemplo é de uma unidade de 1 TB:
# cat table.ada0
MBR 4
1 freebsd 63 1953525105 [active]
# cat table.ada0s1
BSD 8
1 freebsd-ufs 0 4194304
2 freebsd-swap 4194304 33554432
4 freebsd-ufs 37748736 50331648
5 freebsd-ufs 88080384 41943040
6 freebsd-ufs 130023424 838860800
7 freebsd-ufs 968884224 984640881
Se nenhum espaço livre for exibido no final do disco, o tamanho da slice e da última partição deve ser reduzido por um setor. Edite os dois arquivos, reduzindo o tamanho da fatia e da última partição em um. Estes são os últimos números em cada listagem.
# cat table.ada0
MBR 4
1 freebsd 63 1953525104 [active]
# cat table.ada0s1
BSD 8
1 freebsd-ufs 0 4194304
2 freebsd-swap 4194304 33554432
4 freebsd-ufs 37748736 50331648
5 freebsd-ufs 88080384 41943040
6 freebsd-ufs 130023424 838860800
7 freebsd-ufs 968884224 984640880
Se pelo menos um setor não foi alocado no final do disco, esses dois arquivos podem ser usados sem modificação.
Agora restaure a tabela de partições em mirror/gm0:
# gpart restore mirror/gm0 < table.ada0
# gpart restore mirror/gm0s1 < table.ada0s1
Verifique a tabela de partições com o comando gpart show
. Este exemplo tem gm0s1a para /, gm0s1d para /var, gm0s1e para /usr, gm0s1f para /data1 e gm0s1g para /data2.
# gpart show mirror/gm0
=> 63 1953525104 mirror/gm0 MBR (931G)
63 1953525042 1 freebsd [active] (931G)
1953525105 62 - free - (31k)
# gpart show mirror/gm0s1
=> 0 1953525042 mirror/gm0s1 BSD (931G)
0 2097152 1 freebsd-ufs (1.0G)
2097152 16777216 2 freebsd-swap (8.0G)
18874368 41943040 4 freebsd-ufs (20G)
60817408 20971520 5 freebsd-ufs (10G)
81788928 629145600 6 freebsd-ufs (300G)
710934528 1242590514 7 freebsd-ufs (592G)
1953525042 63 - free - (31k)
Tanto a fatia quanto a última partição devem ter pelo menos um bloco livre no final do disco.
Crie sistemas de arquivos nessas novas partições. O número de partições varia de acordo com o disco original, ada0.
# newfs -U /dev/mirror/gm0s1a
# newfs -U /dev/mirror/gm0s1d
# newfs -U /dev/mirror/gm0s1e
# newfs -U /dev/mirror/gm0s1f
# newfs -U /dev/mirror/gm0s1g
Torne o espelhamento inicializável instalando o bootcode no MBR e no bsdlabel e definindo a slice ativa:
# gpart bootcode -b /boot/mbr mirror/gm0
# gpart set -a active -i 1 mirror/gm0
# gpart bootcode -b /boot/boot mirror/gm0s1
Ajuste o arquivo /etc/fstab para usar as novas partições no espelhamento.Primeiro faça o backup deste arquivo copiando ele para /etc/fstab.orig.
# cp /etc/fstab /etc/fstab.orig
Edite o arquivo /etc/fstab, substituindo /dev/ada0 por mirror/gm0.
# Device Mountpoint FStype Options Dump Pass# /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1d /var ufs rw 2 2 /dev/mirror/gm0s1e /usr ufs rw 2 2 /dev/mirror/gm0s1f /data1 ufs rw 2 2 /dev/mirror/gm0s1g /data2 ufs rw 2 2
Se o módulo do kernel geom_mirror.ko não foi carregado no kernel, edite o arquivo /boot/loader.conf para carregá-lo no boot:
geom_mirror_load="YES"
Os sistemas de arquivos do disco original agora podem ser copiados para o espelhamento com o dump(8) e o restore(8). Cada sistema de arquivos copiados com o dump -L
irá primeiro criar um snapshot, o que pode levar algum tempo.
# mount /dev/mirror/gm0s1a /mnt
# dump -C16 -b64 -0aL -f - / | (cd /mnt && restore -rf -)
# mount /dev/mirror/gm0s1d /mnt/var
# mount /dev/mirror/gm0s1e /mnt/usr
# mount /dev/mirror/gm0s1f /mnt/data1
# mount /dev/mirror/gm0s1g /mnt/data2
# dump -C16 -b64 -0aL -f - /usr | (cd /mnt/usr && restore -rf -)
# dump -C16 -b64 -0aL -f - /var | (cd /mnt/var && restore -rf -)
# dump -C16 -b64 -0aL -f - /data1 | (cd /mnt/data1 && restore -rf -)
# dump -C16 -b64 -0aL -f - /data2 | (cd /mnt/data2 && restore -rf -)
Reinicie o sistema, inicializando a partir do ada1. Se tudo estiver funcionando, o sistema irá inicializar a partir de mirror/gm0, que agora contém os mesmos dados que o ada0 tinha anteriormente. Veja Solução de problemas se houver problemas ao inicializar.
Neste ponto, o espelhamento ainda consiste apenas no único disco ada1.
Após inicializar a partir de mirror/gm0 com sucesso, a etapa final é inserir ada0 no espelhamento.
Quando o ada0 for inserido no espelhamento, seu conteúdo anterior será substituído pelos dados do espelhamento. Certifique-se de que mirror/gm0 tenha o mesmo conteúdo do ada0 antes de adicionar o ada0 ao espelhamento. Se o conteúdo anteriormente copiado pelo dump(8) e restore(8) não forem idênticos ao que estava em ada0, reverta o arquivo /etc/fstab para montar os sistemas de arquivos em ada0, e reinicie todo o procedimento novamente. |
# gmirror insert gm0 ada0
GEOM_MIRROR: Device gm0: rebuilding provider ada0
A sincronização entre os dois discos será iniciada imediatamente. Use gmirror status
para visualizar o progresso.
# gmirror status
Name Status Components
mirror/gm0 DEGRADED ada1 (ACTIVE)
ada0 (SYNCHRONIZING, 64%)
Depois de um tempo, a sincronização será concluída.
GEOM_MIRROR: Device gm0: rebuilding provider ada0 finished.
# gmirror status
Name Status Components
mirror/gm0 COMPLETE ada1 (ACTIVE)
ada0 (ACTIVE)
O mirror/gm0 agora consiste de dois discos ada0 e ada1, e o conteúdo é automaticamente sincronizado entre eles. Em uso, o mirror/gm0 irá se comportar como a única unidade original.
18.3.4. Solução de problemas
Se o sistema não inicializar mais, as configurações da BIOS podem ter que ser alteradas para inicializar a partir de uma das novas unidades espelhadas. Qualquer uma das unidades espelhadas pode ser usada para inicializar, pois elas contêm dados idênticos.
Se a inicialização parar com esta mensagem, algo está errado com o dispositivo espelhado:
Mounting from ufs:/dev/mirror/gm0s1a failed with error 19.
Loader variables:
vfs.root.mountfrom=ufs:/dev/mirror/gm0s1a
vfs.root.mountfrom.options=rw
Manual root filesystem specification:
<fstype>:<device> [options]
Mount <device> using filesystem <fstype>
and with the specified (optional) option list.
eg. ufs:/dev/da0s1a
zfs:tank
cd9660:/dev/acd0 ro
(which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)
? List valid disk boot devices
. Yield 1 second (for background tasks)
<empty line> Abort manual input
mountroot>
Esquecer de carregar o módulo geom_mirror.ko no arquivo /boot/loader.conf pode causar este problema. Para consertá-lo, inicialize a partir de uma mídia de instalação do FreeBSD e escolha Shell
no primeiro prompt. Em seguida, carregue o módulo de espelhamento e monte o dispositivo espelhado:
# gmirror load
# mount /dev/mirror/gm0s1a /mnt
Edite o arquivo /mnt/boot/loader.conf, adicionando uma linha para carregar o módulo de espelhamento:
geom_mirror_load="YES"
Salve o arquivo e reinicie.
Outros problemas que causam o error 19
requerem mais esforço para serem corrigidos. Embora o sistema deva inicializar a partir de ada0, outro prompt para selecionar um shell aparecerá se o arquivo /etc/fstab estiver incorreto. Digite ufs:/dev/ada0s1a
no prompt do carregador de boot e pressione Enter. Desfaça as edições no arquivo /etc/fstab e monte os sistemas de arquivos a partir do disco original (ada0) em vez do espelhado. Reinicialize o sistema e tente o procedimento novamente.
Enter full pathname of shell or RETURN for /bin/sh:
# cp /etc/fstab.orig /etc/fstab
# reboot
18.3.5. Recuperando de Uma Falha de Disco
O benefício do espelhamento de disco é que um disco individual pode falhar sem fazer com que o espelho perca qualquer dado. No exemplo acima, se ada0 falhar, o espelho continuará funcionando, fornecendo dados a partir do disco que continua operacional, ada1.
Para substituir a unidade com falha, desligue o sistema e substitua fisicamente a unidade com falha por uma nova unidade com capacidade igual ou maior. Os fabricantes usam valores um tanto arbitrários ao classificar drives em gigabytes, e a única maneira de realmente ter certeza é comparar a contagem total de setores mostrados por diskinfo -v
. Uma unidade com maior capacidade que o espelho funcionará, embora o espaço extra na nova unidade não seja usado.
Depois que o computador for ligado novamente, o espelho será executado em um modo "degradado" com apenas uma unidade. O espelho é avisado para esquecer as unidades que não estão conectadas no momento:
# gmirror forget gm0
Quaisquer metadados antigos devem ser apagados do disco de substituição usando as instruções em Problemas de Metadados. Em seguida, o disco de substituição, ada4 para este exemplo, é inserido no espelho:
# gmirror insert gm0 /dev/ada4
A ressincronização começa quando a nova unidade é inserida no espelho. Esse processo de copiar dados espelhados para uma nova unidade pode demorar um pouco. O desempenho do espelho será bastante reduzido durante a cópia, portanto, a inserção de novos discos é deve ser executada quando houver pouca demanda no computador.
O progresso pode ser monitorado com o comando gmirror status
, que mostra as unidades que estão sendo sincronizadas e a porcentagem de conclusão. Durante a ressincronização, o status será DEGRADED
, mudando para COMPLETE
quando o processo for concluído.
18.4. RAID3 - Distribuição em Nível de Byte com Paridade Dedicada
O RAID3 é um método usado para combinar várias unidades de disco em um único volume com um disco de paridade dedicado. Em um sistema RAID3, os dados são divididos em vários bytes que são escritos em todas as unidades da matriz, exceto por um disco que atua como um disco de paridade dedicado. Isso significa que as leituras de disco de uma implementação de RAID3 acessam todos os discos na matriz. O desempenho pode ser aprimorado usando vários controladores de disco. O array RAID3 fornece uma tolerância a falhas de 1 unidade, enquanto fornece uma capacidade de 1 - 1/n vezes a capacidade total de todas as unidades no array, onde n é o número de unidades de disco rígido no array. Essa configuração é adequada principalmente para armazenar dados de tamanhos maiores, como arquivos multimídia.
Pelo menos 3 discos rígidos físicos são necessários para criar um array RAID3. Cada disco deve ter o mesmo tamanho, pois as solicitações de I/O são intercaladas para ler ou gravar em vários discos em paralelo. Além disso, devido à natureza do RAID3, o número de unidades deve ser igual a 3, 5, 9, 17 e assim por diante, ou 2^n + 1.
Esta seção demonstra como criar um RAID3 via software em um sistema FreeBSD.
Embora seja teoricamente possível inicializar a partir de um array RAID3 no FreeBSD, essa configuração é incomum e não é recomendada. |
18.4.1. Criando uma Matriz RAID3 Dedicada
No FreeBSD, o suporte para RAID3 é implementado pela classe GEOMgraid3(8). Criar um array dedicado de RAID3 no FreeBSD requer os seguintes passos.
Primeiro, carregue o módulo do kernel geom_raid3.ko emitindo um dos seguintes comandos:
# graid3 load
ou:
# kldload geom_raid3
Assegure-se de que exista um ponto de montagem adequado. Este comando cria um novo diretório para usar como ponto de montagem:
# mkdir /multimedia
Determine os nomes dos dispositivos para os discos que serão adicionados à matriz e crie o novo dispositivo RAID3. O dispositivo final listado atuará como o disco de paridade dedicado. Este exemplo usa três unidades ATA não-particionadas: ada1 e ada2 para dados e ada3 para paridade.
# graid3 label -v gr0 /dev/ada1 /dev/ada2 /dev/ada3 Metadata value stored on /dev/ada1. Metadata value stored on /dev/ada2. Metadata value stored on /dev/ada3. Done.
Particione o dispositivo gr0 recém-criado e coloque um sistema de arquivos UFS:
# gpart create -s GPT /dev/raid3/gr0 # gpart add -t freebsd-ufs /dev/raid3/gr0 # newfs -j /dev/raid3/gr0p1
Muitos números irão ser exibios na tela e, após algum tempo, o processo será concluído. O volume foi criado e está pronto para ser montado:
# mount /dev/raid3/gr0p1 /multimedia/
A matriz RAID3 está agora pronta para uso.
Uma configuração adicional é necessária para manter essa configuração nas reinicializações do sistema.
O módulo geom_raid3.ko deve ser carregado antes que o array possa ser montado. Para carregar automaticamente o módulo do kernel durante a inicialização do sistema, adicione a seguinte linha ao arquivo /boot/loader.conf:
geom_raid3_load="YES"
As seguintes informações de volume devem ser adicionadas ao arquivo /etc/fstab para montar automaticamente o sistema de arquivos do array durante o processo de inicialização do sistema:
/dev/raid3/gr0p1 /multimedia ufs rw 2 2
18.5. Dispositivos RAID por Software
Algumas placas-mãe e placas de expansão adicionam um hardware simples, geralmente apenas uma ROM, que permite que o computador inicialize a partir de um array RAID. Após a inicialização, o acesso ao array RAID é feito pelo software em execução no processador principal do computador. Este "RAID via software assistido por hardware" fornece arrays RAID que não dependem de nenhum sistema operacional em particular, e que são funcionais antes mesmo de um sistema operacional ser carregado.
Vários níveis de RAID são suportados, dependendo do hardware em uso. Veja graid(8) para uma lista completa.
O graid(8) requer o módulo do kernel geom_raid.ko, que está incluído no kernel GENERIC a partir do FreeBSD 9.1. Se necessário, ele pode ser carregado manualmente com o comando graid load
.
18.5.1. Criando um Array
Os dispositivos de RAID via software geralmente têm um menu que pode ser acessado pressionando teclas especiais quando o computador está inicializando. O menu pode ser usado para criar e excluir arrays RAID. O graid(8) também pode criar arrays diretamente a partir da linha de comando.
O graid label
é usado para criar um novo array. A placa-mãe usada neste exemplo tem um chipset RAID da Intel, portanto, o formato de metadados da Intel é especificado. A nova matriz recebe um rótulo de gm0, é um espelhamento (RAID1) e usa as unidades ada0 e ada1.
Algum espaço nas unidades será sobrescrito quando elas forem transformadas em um novo array. Faça o backup dos dados existentes primeiro! |
# graid label Intel gm0 RAID1 ada0 ada1
GEOM_RAID: Intel-a29ea104: Array Intel-a29ea104 created.
GEOM_RAID: Intel-a29ea104: Disk ada0 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:0-ada0 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Array started.
GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from STARTING to OPTIMAL.
Intel-a29ea104 created
GEOM_RAID: Intel-a29ea104: Provider raid/r0 for volume gm0 created.
Uma verificação de status mostra que o novo espelhamento está pronto para uso:
# graid status
Name Status Components
raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE))
ada1 (ACTIVE (ACTIVE))
O dispositivo de array aparece em /dev/raid/. O primeiro array é chamado de r0. Arrays adicionais, se presentes, serão r1, r2 e assim por diante.
O menu da BIOS em alguns desses dispositivos pode criar arrays com caracteres especiais em seus nomes. Para evitar problemas com esses caracteres especiais, os arrays recebem nomes numerados simples como r0. Para mostrar os rótulos reais, como gm0 no exemplo acima, use o sysctl(8):
# sysctl kern.geom.raid.name_format=1
18.5.2. Múltiplos Volumes
Alguns dispositivos de RAID via software suportam mais de um volume em um array. Os volumes funcionam como partições, permitindo que o espaço nas unidades físicas seja dividido e usado de diferentes maneiras. Por exemplo, os dispositivos RAID via software Intel suportam dois volumes. Este exemplo cria um espelho de 40 G para armazenar com segurança o sistema operacional, seguido por um volume de 20 G RAID0 (stripe) para armazenamento temporário rápido:
# graid label -S 40G Intel gm0 RAID1 ada0 ada1
# graid add -S 20G gm0 RAID0
Os volumes aparecem como entradas adicionais rX em /dev/raid/. Um array com dois volumes mostrará r0 e r1.
Veja graid(8) para o número de volumes suportados por diferentes dispositivos RAID via software.
18.5.3. Convertendo uma Única Unidade em um Espelho
Sob certas condições específicas, é possível converter uma única unidade existente em um array graid(8) sem reformatar. Para evitar a perda de dados durante a conversão, a unidade existente deve atender a esses requisitos mínimos:
A unidade deve ser particionada com o esquema de particionamento MBR. O GPT ou outros esquemas de particionamento com metadados no final da unidade serão sobrescritos e corrompidos pelos metadados do graid(8).
Deve haver espaço não particionado e não utilizado o suficiente no final da unidade para conter os metadados do graid(8). Esses metadados variam em tamanho, mas o maior ocupa 64 M, então pelo menos este espaço livre é recomendado.
Se a unidade atender a esses requisitos, comece fazendo um backup completo. Em seguida, crie um espelhamento de unidade única com essa unidade:
# graid label Intel gm0 RAID1 ada0 NONE
Os metadados do graid(8) foram gravados no final da unidade no espaço não utilizado. Uma segunda unidade pode agora ser inserida no espelhamento:
# graid insert raid/r0 ada1
Os dados da unidade original começarão imediatamente a ser copiados para a segunda unidade. O espelhamento operará em status degradado até que a cópia seja concluída.
18.5.4. Inserindo Novos Discos no Array
As unidades podem ser inseridas em uma matriz como substitutos de unidades que falharam ou estão faltando. Se não houver unidades com falha ou ausentes, a nova unidade se tornará uma reserva. Por exemplo, inserir uma nova unidade em um espelhamento de duas unidades de trabalho resulta em um espelhamento de duas unidades com uma unidade sobressalente, não em um espelhamento de três unidades.
No array de espelho do exemplo, os dados começam a ser copiados imediatamente para a unidade recém-inserida. Qualquer informação existente na nova unidade será substituída.
# graid insert raid/r0 ada1
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from NONE to ACTIVE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NONE to NEW.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 state changed from NEW to REBUILD.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-ada1 rebuild start at 0.
18.5.5. Removendo Discos do Array
Discos individuais podem ser permanentemente removidos de um array e seus metadados apagados:
# graid remove raid/r0 ada1
GEOM_RAID: Intel-a29ea104: Disk ada1 state changed from ACTIVE to OFFLINE.
GEOM_RAID: Intel-a29ea104: Subdisk gm0:1-[unknown] state changed from ACTIVE to NONE.
GEOM_RAID: Intel-a29ea104: Volume gm0 state changed from OPTIMAL to DEGRADED.
18.5.6. Parando o Array
Um array pode ser interrompido sem remover os metadados das unidades. O array será reiniciado quando o sistema for inicializado.
# graid stop raid/r0
18.5.7. Verificando o Status do Array
O status do array pode ser verificado a qualquer momento. Depois que um disco foi adicionado ao espelho no exemplo acima, os dados estarão sendo copiados do disco original para o novo disco:
# graid status
Name Status Components
raid/r0 DEGRADED ada0 (ACTIVE (ACTIVE))
ada1 (ACTIVE (REBUILD 28%))
Alguns tipos de arrays, como RAID0
ou CONCAT
, podem não ser mostrados no relatório de status se os discos falharem. Para ver esses arrays com falhas parciais, adicione -ga
:
# graid status -ga
Name Status Components
Intel-e2d07d9a BROKEN ada6 (ACTIVE (ACTIVE))
18.5.8. Excluindo Arrays
Arrays são destruídos, excluindo todos os volumes deles. Quando o último volume presente é excluído, o array é interrompido e os metadados são removidos dos discos:
# graid delete raid/r0
18.5.9. Excluindo Arrays Inesperados
Os discos podem conter metadados graid(8) inesperados, originados no seu uso anterior ou em testes do fabricante. O graid(8) detectará estes discos e criará um array, interferindo no acesso ao disco individual. Para remover os metadados indesejados:
Inicialize o sistema. No menu de inicialização, selecione
2
para o prompt do utilitário de boot. Entre:OK set kern.geom.raid.enable=0 OK boot
O sistema inicializará com o graid(8) desativado.
Fazer backup de todos os dados na unidade afetada.
Como solução alternativa, a detecção de arrays graid(8) pode ser desativada incluindo se a variável
kern.geom.raid.enable=0
no arquivo /boot/loader.conf.
Para remover permanentemente os metadados graid(8) do disco afetado, inicialize uma instalação do FreeBSD usando um CD-ROM ou um memory stick e selecione a opção
Shell
. Use o comandostatus
para encontrar o nome do array, normalmenteraid/r0
:# graid status Name Status Components raid/r0 OPTIMAL ada0 (ACTIVE (ACTIVE)) ada1 (ACTIVE (ACTIVE))
Exclua o volume pelo nome:
# graid delete raid/r0
Se houver mais de um volume exibido, repita o processo para cada volume. Após o último array ter sido excluído, o volume será destruído.
Reinicialize e verifique os dados, restaurando a partir do backup, se necessário. Depois que os metadados forem removidos, a entrada
kern.geom.raid.enable=0
no arquivo /boot/loader.conf também pode ser removida.
18.6. GEOM Network Gate
O GEOM fornece um mecanismo simples para fornecer acesso remoto a dispositivos como discos, CDs e sistemas de arquivos através do uso do daemon GEOM Network Gate, ggated. O sistema com o dispositivo executa o daemon do servidor que manipula solicitações feitas por clientes usando o ggatec. Os dispositivos não devem conter dados confidenciais, pois a conexão entre o cliente e o servidor não é criptografada.
Semelhante ao NFS, que é discutido em Network File System (NFS), o ggated é configurado usando um arquivo de exportação. Este arquivo especifica quais sistemas têm permissão para acessar os recursos exportados e em qual nível de acesso eles são oferecidos. Por exemplo, para fornecer ao cliente 192.168.1.5
acesso de leitura e gravação à quarta slice do primeiro disco SCSI, crie o arquivo /etc/gg.exports com esta linha:
192.168.1.5 RW /dev/da0s4d
Antes de exportar o dispositivo, verifique se ele não está montado no momento. Em seguida, inicie o ggated:
# ggated
Várias opções estão disponíveis para especificar uma porta de escuta alternativa ou para alterar o local padrão do arquivo de exportação. Consulte ggated(8) para maiores detalhes.
Para acessar o dispositivo exportado na máquina cliente, primeiro use o comando ggatec
para especificar o endereço IP do servidor e o nome do dispositivo exportado. Se bem sucedido, este comando irá exibir um nome de dispositivo ggate
para montar. Monte esse nome de dispositivo especificado em um ponto de montagem livre. Este exemplo conecta-se à partição /dev/da0s4d no 192.168.1.1
, em seguida, monta o /dev/ggate0 em /mnt:
# ggatec create -o rw 192.168.1.1 /dev/da0s4d
ggate0
# mount /dev/ggate0 /mnt
O dispositivo no servidor pode agora ser acessado por meio do /mnt no cliente. Para maiores detalhes sobre o ggatec
e alguns exemplos de uso, consulte ggatec(8).
A montagem falhará se o dispositivo estiver atualmente montado no servidor ou em qualquer outro cliente na rede. Se for necessário acesso simultâneo aos recursos de rede, use o NFS. |
Quando o dispositivo não for mais necessário, desmonte-o com o umount
para que o recurso fique disponível para outros clientes.
18.7. Rotulando Dispositivos de Disco
Durante a inicialização do sistema, o kernel do FreeBSD cria nós de dispositivos conforme os dispositivos são encontrados. Esse método de detectar dispositivos gera alguns problemas. Por exemplo, e se um novo dispositivo de disco for adicionado via USB? É provável que um dispositivo flash receba o nome do dispositivo da0 e o da0 original alterado para da1. Isso causará problemas ao montar sistemas de arquivos se eles estiverem listados no /etc/fstab, o que também pode impedir que o sistema seja inicializado.
Uma solução é encadear os dispositivos SCSI para que um novo dispositivo adicionado à placa SCSI receba números de dispositivo não utilizados. Mas e os dispositivos USB que podem substituir o disco principal SCSI? Isso acontece porque os dispositivos USB geralmente são examinados antes da placa SCSI. Uma solução é inserir esses dispositivos apenas após o sistema ter sido inicializado. Outro método é usar apenas uma única unidade ATA e nunca listar os dispositivos SCSI no arquivo /etc/fstab.
Uma solução melhor é usar o glabel
para rotular os dispositivos de disco e usar os rótulos no arquivo /etc/fstab. Como o glabel
armazena o rótulo no último setor de um determinado provedor, o rótulo permanecerá persistente nas reinicializações. Ao usar esse rótulo como um dispositivo, o sistema de arquivos pode sempre ser montado independentemente do nó do dispositivo pelo qual ele é acessado.
O |
18.7.1. Tipos de Rótulos e Exemplos
Os rótulos permanentes podem ser um rótulo genérico ou de um sistema de arquivos. Rótulos de sistema de arquivos permanentes podem ser criados com tunefs(8) ou newfs(8). Esses tipos de rótulos são criados em um subdiretório /dev e serão nomeados de acordo com o tipo de sistema de arquivos. Por exemplo, os rótulos do sistema de arquivos UFS2 serão criados em /dev/ufs. Rótulos permanentes genéricos podem ser criados com o glabel label
. Estes não são específicos do sistema de arquivos e serão criados em /dev/label.
Os rótulos temporários são destruídos na próxima reinicialização. Esses rótulos são criados em /dev/label e são adequados para experimentação. Um rótulo temporário pode ser criado usando glabel create
.
Para criar um rótulo permanente para um sistema de arquivos UFS2 sem destruir nenhum dado, emita o seguinte comando:
# tunefs -L home /dev/da3
Um rótulo deve agora existir em /dev/ufs que pode ser adicionado ao arquivo /etc/fstab:
/dev/ufs/home /home ufs rw 2 2
O sistema de arquivos não deve ser montado durante a tentativa de executar o |
Agora o sistema de arquivos pode ser montado:
# mount /home
A partir deste ponto, desde que o módulo do kernel geom_label.ko seja carregado na inicialização com o /boot/loader.conf ou com a opção do kernel GEOM_LABEL
estando presente, o nó do dispositivo pode mudar sem qualquer efeito negativo no sistema.
Os sistemas de arquivos também podem ser criados com um rótulo padrão usando a flag -L
com o comando newfs
. Consulte newfs(8) para obter maiores informações.
O seguinte comando pode ser usado para destruir o rótulo:
# glabel destroy home
O exemplo a seguir mostra como rotular as partições de um disco de inicialização.
Exemplo 1. Rotulando Partições no Disco de Inicialização
Ao marcar permanentemente as partições no disco de inicialização, o sistema deve poder continuar a inicializar normalmente, mesmo se o disco for movido para outro controlador ou transferido para um sistema diferente. Para este exemplo, presume-se que um único disco ATA é usado, que é atualmente reconhecido pelo sistema como ad0. Também é assumido que o esquema de partição padrão do FreeBSD é usado, com /, /var, /usr e /tmp, bem como uma partição de swap.
Reinicialize o sistema e, no prompt do loader(8), pressione 4 para inicializar no modo de usuário único. Em seguida, insira os seguintes comandos:
# glabel label rootfs /dev/ad0s1a
GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
# glabel label var /dev/ad0s1d
GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
# glabel label usr /dev/ad0s1f
GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
# glabel label tmp /dev/ad0s1e
GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
# glabel label swap /dev/ad0s1b
GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
# exit
O sistema continuará com a inicialização multiusuário. Depois que a inicialização terminar, edite o arquivo /etc/fstab e substitua os nomes de dispositivos convencionais por seus respectivos rótulos. No final o /etc/fstab ficará assim:
# Device Mountpoint FStype Options Dump Pass# /dev/label/swap none swap sw 0 0 /dev/label/rootfs / ufs rw 1 1 /dev/label/tmp /tmp ufs rw 2 2 /dev/label/usr /usr ufs rw 2 2 /dev/label/var /var ufs rw 2 2
O sistema agora pode ser reinicializado. Se tudo correr bem, ele aparecerá normalmente e o comando mount
mostrará:
# mount
/dev/label/rootfs on / (ufs, local)
devfs on /dev (devfs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)
A classe glabel(8) suporta um tipo de rótulo para sistemas de arquivos UFS, com base no ID do sistema de arquivos exclusivo ufsid
. Esses rótulos podem ser encontrados em /dev/ufsid e são criados automaticamente durante a inicialização do sistema. É possível usar rótulos ufsid
para montar partições usando o /etc/fstab. Use o glabel status
para receber uma lista de sistemas de arquivos e seus rótulos ufsid
correspondentes:
% glabel status
Name Status Components
ufsid/486b6fc38d330916 N/A ad4s1d
ufsid/486b6fc16926168e N/A ad4s1f
No exemplo acima, ad4s1d representa /var, enquanto ad4s1f representa /usr. Usando os valores ufsid
mostrados, essas partições podem agora ser montadas com as seguintes entradas em /etc/fstab:
/dev/ufsid/486b6fc38d330916 /var ufs rw 2 2 /dev/ufsid/486b6fc16926168e /usr ufs rw 2 2
Quaisquer partições com rótulos ufsid
podem ser montadas dessa forma, eliminando a necessidade de criar manualmente rótulos permanentes, enquanto ainda desfruta dos benefícios da montagem independente do nome do dispositivo.
18.8. Journaling UFS através do GEOM
Suporte para journaling em sistemas de arquivos UFS está disponível no FreeBSD. A implementação é fornecida através do subsistema GEOM e é configurada usando o comando gjournal
. Ao contrário de outras implementações de journaling de sistemas de arquivos, o método gjournal
é baseado em blocos e não é implementado como parte do sistema de arquivos. É uma extensão do GEOM.
O jornaling armazena um log de transações do sistema de arquivos, como alterações que compõem uma operação de gravação em disco completa, antes que os metadados e as gravações de arquivos sejam confirmados no disco. Esse log de transação pode ser repetido posteriormente para refazer as transações do sistema de arquivos, evitando inconsistências no sistema de arquivos.
Esse método fornece outro mecanismo para proteger contra perda de dados e inconsistências do sistema de arquivos. Ao contrário das Soft Updates, que rastreiam e impõem atualizações de metadados e snapshots, que criam uma imagem do sistema de arquivos, um log é armazenado no espaço em disco especificamente para essa tarefa. Para melhor desempenho, o journal pode ser armazenado em outro disco. Nessa configuração, o provedor do journal ou o dispositivo de armazenamento deve ser listado após o dispositivo para ativar o journaling.
O kernel GENERIC fornece suporte para o gjournal
. Para carregar automaticamente o módulo do kernel geom_journal.ko no momento da inicialização, adicione a seguinte linha ao arquivo /boot/loader.conf:
geom_journal_load="YES"
Se um kernel personalizado for usado, certifique-se de que a linha a seguir esteja no arquivo de configuração do kernel:
options GEOM_JOURNAL
Depois que o módulo é carregado, um journal pode ser criado em um novo sistema de arquivos usando as etapas a seguir. Neste exemplo, da4 é um novo disco SCSI:
# gjournal load
# gjournal label /dev/da4
Isto irá carregar o módulo e criar um nó de dispositivo /dev/da4.journal em /dev/da4.
Um sistema de arquivos UFS pode agora ser criado no dispositivo journaled e depois montado em um ponto de montagem existente:
# newfs -O 2 -J /dev/da4.journal
# mount /dev/da4.journal /mnt
No caso de várias slices, será criado um journal para cada slice individual. Por exemplo, se ad4s1 e ad4s2 forem slices, o |
O journaling também pode ser ativado nos sistemas de arquivos atuais usando o tunefs
. No entanto, sempre faça um backup antes de tentar alterar um sistema de arquivos existente. Na maioria dos casos, o gjournal
falhará se não for possível criar o registro de log, mas isso não protege contra a perda de dados incorrida como resultado do uso indevido do tunefs
. Consulte gjournal(8) e tunefs(8) para maiores informações sobre esses comandos.
É possível fazer o journaling do disco de inicialização de um sistema FreeBSD. Consulte o artigo Implementando o journaling do UFS em um PC de mesa para obter instruções detalhadas.
Última alteração em: 18 de fevereiro de 2025 por Fernando Apesteguía