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:
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:
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:
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:
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:
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:
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:
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:
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.