Dividindo um espelho raidctl com segurança

2

Eu tenho um servidor Sun T5220 com a placa LSI integrada e dois discos que estavam em um espelho RAID 1. Os dados não são importantes no momento, mas nós tivemos um disco com falha e estamos tentando entender como fazer isso de verdade se precisássemos nos recuperar de uma falha.

A situação inicial ficou assim:

# raidctl -l c1t0d0
Volume                  Size    Stripe  Status   Cache  RAID
         Sub                     Size                    Level
                 Disk
----------------------------------------------------------------
c1t0d0                  136.6G  N/A     DEGRADED OFF    RAID1
                 0.1.0   136.6G          GOOD
                 N/A     136.6G          FAILED

Luz verde no disco 0.0.0. Encontrar / ilumina o disco 0.1.0. Então eu sei que tenho um mau drive e qual é. O servidor ainda inicializa obviamente.

Primeiro, tentamos colocar um novo disco. Esse disco veio de uma fonte desconhecida. Formato não veria isso, cfgadm -al não veria tão raidctl -l não iria vê-lo. Eu acho que é ruim. Tentamos outro disco de outro servidor sobressalente:

# raidctl -c c1t1d0 c1t0d0  (where t1 is my good disk - 0.1.0)
Disk has occupied space.

Além disso, as diferentes opções de sintaxe não alteram nada:

# raidctl -C "0.1.0 0.0.0" -r 1 1
Disk has occupied space.

# raidctl -C "0.1.0 0.0.0" 1
Disk has occupied space.

Ok. Talvez seja porque o disco do servidor reserva já tinha um RAID 1. Aha, eu posso ver outro volume no raidctl:

# raidctl -l
Controller: 1
         Volume:c1t1d0  (this is my server's root mirror)
         Volume:c1t132d0  (this is the foreign root mirror)
         Disk: 0.0.0
         Disk: 0.1.0
         ...

Não tem problema. Eu não me importo com os dados, vou apenas apagar o espelho externo.

# raidctl -d c1t132d0
(warning about data deletion but it works)

Neste ponto, / usr / bin / binaries surtar. Com isso quero dizer, ls -l / usr / bin / que mostra 1.4k, mas cat /usr/bin/which me dá uma nova linha. Ótimo, eu acabei de explodir os binários (isto é: binários no mem ainda funcionam)? Eu salto a caixa. Tudo volta bem. WTF Enfim, voltando a recriar meu espelho.

# raidctl -l
Controller: 1
         Volume:c1t1d0  (this is my server's root mirror)
         Disk: 0.0.0
         Disk: 0.1.0
         ...

O cara diz que você pode excluir um espelho e ele irá dividi-lo. Ok, eu vou deletar o espelho raiz.

# raidctl -d c1t0d0
Array in use.  (this might not be the exact error)

Eu pesquisei isso e descobri que é claro que você não pode fazer isso (mesmo com -f) enquanto é retirado do espelho. Está bem. Eu boot cdrom -s e deletei o volume.

Agora eu tenho um disco que tem um tipo de "LSI-Logical-Volume" em c1t1d0 (onde meus dados estão) e um novo "Hitachi 146GB" em c1t0d0 (o que eu estou tentando espelhar):

(booted off the CD)
# raidctl -c c1t1d0 c1t0d0 (man says it's source destination for mirroring)
Illegal Array Layout.

# raidctl -C "0.1.0 0.0.0" -r 1 1  (alt syntax per man)
Illegal Array Layout.

# raidctl -C "0.1.0 0.0.0" 1  (assumes raid1, no help)
Illegal Array Layout.

Discos do mesmo tamanho, mesmo fabricante, mas excluí o volume em vez de colocá-lo em um disco em branco e esperar que ele seja ressincronizado. Talvez isso tenha sido um erro crítico. Eu tentei selecionar o tipo em formato para o meu disco bom para ser um disco de 146GB simples, mas redefine a tabela de partição que eu tenho certeza que iria limpar os dados (ruim se isso fosse produção).

Eu sou desossada? Alguém tem experiência em quebrar e ressincronizar um espelho? Não há nada no Google sobre "Illegal Array Layout", então aqui está minha contribuição para os deuses da pesquisa.

    
por squarism 18.02.2010 / 20:09

1 resposta

2

Como se constata, não consegui encontrar uma resposta para isso. Mas eu encontrei uma solução e algumas boas informações. Primeiramente, isso foi em 10/08 (U6) do Solaris 10. Eu inicializei um CD de boot 10/09 (U8) e descobri que há um bug no raidctl no U8. O U8 falha com um erro "Corrupt labe - bad geometry". Mesmo quando limpei completamente os discos, não consegui recriar um espelho usando o CD de inicialização do U8, mas no U7 (e presumivelmente no U6) o mesmo comando funcionou. Então, só um pouquinho de aviso de versão lá.

A essência da solução alternativa é algo assim (substitua seus discos, caminhos, etc.).

  • Minhas partições foram divididas, mas pude ver os dados do CD de inicialização. Eu precisava de muito espaço para fazer um ufsdump, então importei um grande pool de zfs. Isso pode significar coisas diferentes para você, talvez apenas montar uma partição grande. Vamos chamá-lo / mnt / espaço.
  • Copie ou despeje cada uma das suas tabelas de partições existentes em um arquivo. Lembre-se de que você foi iniciado a partir do CD neste momento.
    • format (1, p, p) ou faça um prtvtoc /dev/rdsk/c1t0d0s2 > /mnt/space/partitions.txt
  • partições de backup
    • ufsdump 0f - /dev/rdsk/c1t0d0s0 > /mnt/space/root_c1t1d0s0.dmp
    • ufsdump 0f - /dev/rdsk/c1t1d0s4 > /mnt/space/var_c1t1d0s4.dmp
    • continue para cada partição
  • Recrie raid (off U7 ou mais antigo CD, U8 tem um bug, falha).
    • raidctl -c c1t0d0 c1t1d0 AVISO: Isso limpa as duas unidades.
    • A criação do volume RAID destruirá todos os dados no espaço livre dos discos membros, proce ed (sim / não)? sim
  • Etiquete o novo disco de ataque com o formato. Você não deve receber erros de rotulagem estranhos ou com falha no formato.
  • Pesquise seu volume com raidctl -l (supondo que seja c1t1d0 nestas instruções)
  • Restaure o layout da sua partição.
    • cat /mnt/space/partitions.txt | fmthard -s - / dev / rdsk / c1t1d0s2
  • A essa altura, mudei para o DiskSuite, mas as etapas de restauração são semelhantes.
  • newfs de cada uma das partições.
    • newfs /dev/rdsk/c1t1d0s0 (através do s7, ignore obviamente s2)
  • Monte e restaure cada partição:
    • mkdir /tmp/s0
    • mount /dev/rdsk/ctt1d0s0 /tmp/s0
    • cd /tmp/s0
    • cat /mnt/space/root_c1t1d0s0.dmp | ufsrestore xf - (responda sim à permissão de dir raiz)
    • umount /tmp/s0
    • repita para cada fatia
  • Copie o bloco de inicialização. O caminho para este arquivo depende do seu hardware:
    • installboot platform/SUNW,SPARC-Enterprise-T5220/lib/fs/ufs/bootblk /dev/rdsk/c1t1d0s0
  • Desmonte tudo, exporte zpools se necessário, reinicie o CD.
  • Edite seu alias no prompt de inicialização aberto
    • probe-scei-all
    • show-disks (selecione disco)
    • nvalias disk Ctrl-Y
    • boot disk
  • Neste ponto, você deve estar de volta a um espelho de hardware ou talvez tenha mudado para o DiskSuite.

Se você quiser mudar para o disksuite no meio de tudo isso:  - backup usando o ufsdump como acima  - exclua sua definição de invasão de hardware  - restaurar partições para um primeiro disco, newfs as partições no primeiro disco  - ufsrestore para o primeiro disco, faça um boot de sanidade  - em seguida, inicie a instalação regular do disksuite. Se você tentar fazer o disksuite do CD de uma só vez, não será necessário porque o serviço meta não está em execução. Você receberá este erro: %código% Fazendo os meta-comandos não vai doer, eles simplesmente não vão ficar. IE: quando você reiniciar o disco rígido, o metastat dirá "nenhum banco de dados meta encontrado".

    
por 25.02.2010 / 18:44