AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 789793
Accepted
Frederik Hoeft
Frederik Hoeft
Asked: 2025-01-19 01:25:14 +0800 CST2025-01-19 01:25:14 +0800 CST 2025-01-19 01:25:14 +0800 CST

procedimento para atualização do RAID5 para RAID6 no local do mdadm

  • 772

Tenho um host debian configurado como NAS usando 6 discos em uma configuração RAID 5. A configuração atual é a seguinte:

# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Mar 12 11:42:23 2021
        Raid Level : raid5
        Array Size : 19534424640 (18.19 TiB 20.00 TB)
     Used Dev Size : 3906884928 (3.64 TiB 4.00 TB)
      Raid Devices : 6
     Total Devices : 6
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Sat Jan 18 17:44:06 2025
             State : clean
    Active Devices : 6
   Working Devices : 6
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 64K

Consistency Policy : bitmap

              Name : data:0
              UUID : 2265a382:cb20817f:de0f543b:a830605c
            Events : 547472

    Number   Major   Minor   RaidDevice State
       9       8       33        0      active sync   /dev/sdc1
       8       8       17        1      active sync   /dev/sdb1
      10       8       81        2      active sync   /dev/sdf1
      11       8       97        3      active sync   /dev/sdg1
       6       8       65        4      active sync   /dev/sde1
       7       8       49        5      active sync   /dev/sdd1

sdbe sddsão discos de 8 TB, todos os outros membros RAID são de 4 TB. Agora, quero substituir os quatro discos de 4 TB por novos discos de 16 TB, converter a configuração RAID5 atual para RAID6 e aumentar o tamanho do dispositivo usado para 8 TB (o novo máximo, até que eu possa substituir os dois discos de 8 TB restantes por outros de 16 TB).

Agora estou procurando um procedimento para fazer isso com segurança, sem perda de dados e o mais livre de problemas possível. Durante o procedimento, o tempo de inatividade é aceitável, a perda de dados não. Como todos os slots SATA estão em uso no momento, não posso adicionar os novos discos enquanto os antigos ainda estiverem online. Terei que substituir um após o outro. Como tal, acho que seria sensato converter o RAID5 existente para RAID6 primeiro e, em seguida, trocar os discos um por um. Isso adicionaria outra camada de redundância durante o processo de reconstrução.

Depois de pesquisar online, o seguinte é o procedimento que eu criei. Alguém pode confirmar se essa é a maneira mais sensata de fazer isso, ou há etapas que estou esquecendo / há maneiras mais fáceis de fazer isso, dadas minhas restrições (atualização no local).

Meu plano atual:

  1. faça backup de todos os dados de /mnt/md0
  2. verificar integridade do backup
  3. desmontar /mnt/md0
  4. reduza o sistema de arquivos em /dev/md0 para o tamanho mínimo possível, veja https://access.redhat.com/articles/1196333 para o procedimento
    1. e2fsck -f /dev/md0verificar sistema de arquivos, -f força a verificação mesmo se estiver limpo
    2. resize2fs -P /dev/md0estimar tamanho mínimo
    3. resize2fs -p -M /dev/md0reduzir ao tamanho mínimo (-M) e imprimir o progresso (-p)
    4. e2fsck -f /dev/md0verifique o sistema de arquivos novamente para ter certeza de que está limpo
  5. verifique o novo tamanho atual do sistema de arquivos:dumpe2fs -h /dev/md0 |& awk -F: '/Block count/{count=$2} /Block size/{size=$2} END{print count*size}'
  6. falha em um dos discos de 8 TB no array RAID5:
    mdadm /dev/md0 --fail /dev/sdd
    
    falhamos em um disco de 8 TB porque isso garante que o mdadm não decidirá que a unidade é muito pequena (por algum motivo) quando a adicionarmos novamente mais tarde
  7. Estime o novo tamanho do array RAID5, tentando executar este comando e verificando a mensagem de erro:
mdadm --grow /dev/md0 --raid-devices=5
  1. Verifique se o sistema de arquivos é pequeno o suficiente para caber. Então, encolha o dispositivo de bloco:
mdadm --grow /dev/md0 --array-size [new_size]
  1. reduzir a matriz RAID5 de 6 para 5 discos
mdadm --grow /dev/md0 --raid-devices=5 --backup-file=/root/md0_raid5_shrink.bak
  1. aguarde o RAID5 terminar a reconstrução
  2. adicione o disco removido como um hotspare
mdadm --add /dev/md0 /dev/sdd
  1. aumentar a matriz RAID5 para RAID6 com 6 discos
mdadm --grow /dev/md0 --raid-devices 6 --level 6 --backup-file=/root/md0_raid5_to_raid6.bak
  1. aguarde o RAID6 terminar a reconstrução
  2. substitua cada disco de 4 TB um por um por discos de 16 TB, esperando que o RAID6 termine de reconstruir a cada vez, isso deve nos permitir manter a redundância durante a migração
    1. mdadm --fail /dev/md0 /dev/sdX
    2. mdadm --remove /dev/md0 /dev/sdX
    3. desligar e substituir disco
    4. mdadm --add /dev/md0 /dev/sdX
    5. aguarde o RAID6 terminar a reconstrução
  3. aumentar o array RAID6 até o tamanho máximo (limitado pelos dois discos de 8 TB)
mdadm --grow /dev/md0 --size=max
  1. aumentar o sistema de arquivos em /dev/md0 para o tamanho máximo
resize2fs /dev/md0
  1. remontar /mnt/md0

Minhas perguntas são as seguintes:

  1. Esta é a maneira recomendada de atualizar um array RAID5 para RAID6?
  2. Já que quero evitar fazer uma pergunta sim/não: Se meu procedimento faz sentido, há maneiras de melhorá-lo para evitar o risco de perda de dados/ter que restaurar do backup? Há uma maneira mais rápida de fazer isso?
  3. Tenho um arquivo de configuração gerado automaticamente no /etc/mdadm/mdadm.conf. Terei que alterá-lo de alguma forma? Isso acontecerá automaticamente ou não tem relação com todo o processo?

Mais algum contexto / outras informações:

  • O sistema de arquivos em /dev/md0 é ext4.
  • A raiz do sistema / está em /dev/sda, que não é impactada pela migração
  • A maioria dos guias fala sobre adicionar um novo spare primeiro e depois migrar de RAID5 para RAID6. Isso não é (facilmente) possível neste caso porque todos os slots SATA já estão em uso.
debian
  • 1 1 respostas
  • 75 Views

1 respostas

  • Voted
  1. Best Answer
    Lutz Willek
    2025-01-24T03:05:27+08:002025-01-24T03:05:27+08:00

    A resposta "de acordo com o livro": Faça e verifique um backup, destrua seu raid atual, crie o novo raid exatamente como necessário, restaure, encerre o dia. Provavelmente essa também é a abordagem mais rápida, ao considerar os tempos de ressincronização.

    A resposta para sua pergunta: Não, você não precisa adaptar manualmente mdadm.confao usar o mdadm.

    "Como todos os slots SATA estão em uso no momento, não posso adicionar novos discos enquanto os antigos ainda estiverem online."

    Não questiono o fato, mas a conclusão. Como o mdadm é flexível e pode gerenciar arrays que incluem discos conectados por meio de diferentes interfaces. Isso permite que você use armazenamento externo temporário (como unidades USB) para auxiliar no processo de substituição de disco, mesmo quando todos os slots SATA internos estão em uso no momento. Então você tem opções.

    Sobre seu plano atual: No geral, Nahhhh. Como dito no começo, eu não faria dessa forma em geral. Mas minha preocupação desapareceu por um minuto e assumindo a abordagem como descrita por você, então...

    • Ponto 1 e 2 (primeiro backup e depois verificação): Muito bom, sempre o início correto. Aprovado.

    • Ponto 2,3,4: (desmonte e reduza o sistema de arquivos): Acho que essas etapas não são necessárias, pois mdadmoperam independentemente do fs. O processo de reconstrução do RAID lida com blocos de dados e paridade, independentemente de como o fs é organizado em cima desses blocos. Se você tiver um backup adequado e seu array RAID estiver em um estado estável, você pode prosseguir com a substituição dos discos um por um sem reduzir ou tocar no fs. Então você pode pular essas etapas.

    • Ponto 5: Nunca falha, sem remover. Por quê? Como isso é importante para garantir que o mdadm entenda que um disco não faz mais parte do array, e não deve mais esperar usá-lo para armazenamento de dados ou redundância. Corrigido:

    mdadm --manage /dev/md0 --fail /dev/sdd1
    mdadm --manage /dev/md0 --remove /dev/sd1
    
    • Ponto 7: Não. Reduzir o raid existente irá falhar. A --growopção pode ser usada para aumentar o número de dispositivos, mas não para diminuir. Até onde eu sei, isso não é suportado pelo mdadm. (Por favor, corrija-me alguém se eu estiver errado neste ponto)

    Caso você realmente queira fazer uma substituição no local, então :

    Antes de começar, pesquise no Google os diferentes tempos de reconstrução do Raid5 e do Raid6, depois faça um cálculo rápido para decidir se você realmente quer investir tanto tempo. (Você foi avisado)

    Caso você ainda queira fazer dessa forma e aceite os tempos de reconstrução:

    • Faça um backup
    • Verifique seu backup
    • Armazene o backup em um local que garanta que você o encontrará mais tarde, mas tão longe que o disco de backup não seja misturado acidentalmente com um dos outros discos no procedimento a seguir. (Eu alerto por experiência própria aqui)

    Em seguida, repita o seguinte procedimento para o disco sd[c|e|f|g], basicamente para substituir cada disco de 4 TB, um por um, por discos de 16 TB:

    (Substitua sdX1por sdc1na primeira execução, por sde1na segunda execução e assim por diante...)

    • Falha e remova o disco.
    mdadm --manage /dev/md0 --fail /dev/sdX1
    mdadm --manage /dev/md0 --remove /dev/sdX1
    
    • Desligue, substitua o disco antigo de 4 TB sdXpela nova variante de 16 TB e ligue novamente.
    • Crie uma partição no novo disco:
    parted /dev/sdX mklabel gpt
    parted /dev/sdX mkpart primary 0% 100%
    
    • Adicione o novo disco ao array:
    mdadm --manage /dev/md0 --add /dev/sdX1
    
    • Monitore o processo de reconstrução
    watch cat /proc/mdstat
    

    Aguarde até que a reconstrução esteja completa, antes de prosseguir para o próximo disco. Continue com as próximas etapas quando todos os discos de 4 TB tiverem sido substituídos por discos de 16 TB e o array for reconstruído.

    • Converta o RAID 5 para RAID 6 e use a capacidade total dos novos discos. Como você não tem spares para evitar uma matriz degradada durante a conversão, você tem que forçar essa etapa de conversão a acontecer.
    mdadm --grow /dev/md0 --level=6 --force
    mdadm --grow /dev/md0 --size=max
    

    Para ser bem claro e preciso sobre esse ponto de conversão de raid, a fim de definir as expectativas corretas: Essa conversão de Raid5 para Raid6 funcionará tecnicamente muito bem, e você acabará em um estado Raid6 limpo também. Mas ainda assim, o Raid6 permanecerá em estado degradado, até que você adicione um spare. Eu entendi que você não pode adicionar um disco como spare, pois todos os assentos já estão cheios em seu sistema. Então isso talvez (muito provavelmente) não seja o que você deseja alcançar.

    • Redimensione o sistema de arquivos. Você disse que está usando ext4:
    resize2fs /dev/md0
    

    DICA DICA DICA : Teste as ideias em um espaço seguro antes de prosseguir com dados reais. O mdadm é flexível e suporta qualquer tipo de dispositivo de bloco, incluindo os virtuais criados a partir de arquivos.

    Essa flexibilidade permite que você teste qualquer procedimento em um ambiente controlado antes de implementar em dados reais. Aqui está como replicar sua configuração atual para seus testes:

    # Create a test directory
    mkdir -p /root/my_raid_tests
    
    # Create files to represent block devices, associate loop devices with these files
    for i in {1..6}; do 
        dd if=/dev/zero of=/root/my_raid_tests/file$i.img bs=1M count=100
        losetup /dev/loop$i /root/my_raid_tests/file$i.img
    done
    
    # Create the RAID 5
    mdadm --create /dev/md/my_raid_tests --level=5 --raid-devices=6 --layout=left-symmetric --chunk=64K /dev/loop{1..6}
    
    # Verify the array
    mdadm --detail /dev/md/my_raid_tests
    
    # Create a filesystem on the array
    mkfs.ext4 /dev/md/my_raid_tests
    
    # Create a mount point and mount the array
    mkdir -p /mnt/my_raid_tests
    mount /dev/md/my_raid_tests /mnt/my_raid_tests
    

    E aqui está como se livrar dele:

    umount /mnt/my_raid_tests
    mdadm --stop /dev/md/my_raid_tests
    mdadm --zero-superblock /dev/loop{1..6}
    for i in {1..6}; do 
        losetup -d /dev/loop$i
    done
    rm -i /root/my_raid_tests/file{1..6}.img
    rmdir /root/my_raid_tests /mnt/my_raid_tests
    
    • 4

relate perguntas

  • Configuração do GRUB para reconhecer diferentes ambientes de desktop (instalações) da mesma distribuição Linux

  • astyle não altera a formatação do arquivo de origem

  • Recebendo e-mail em um novo Debian fresco

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve