Substituindo uma unidade com falha em um array mdadm no Ubuntu
Publicado: 15 de fevereiro de 2025 às 22:02:30 UTC
Se você estiver na terrível situação de ter uma falha de unidade em um array RAID mdadm, este artigo explica como substituí-la corretamente em um sistema Ubuntu.
Replacing a Failed Drive in an mdadm Array on Ubuntu
As informações neste post são baseadas no Ubuntu 18.04 e na versão do mdadm incluída em seus repositórios; no momento da escrita v4.1-rc1. Pode ou não ser válido para outras versões.
Recentemente, tive uma falha repentina de unidade no meu servidor de arquivos doméstico, que consiste em nove unidades em um array mdadm RAID-6. Isso é sempre assustador, mas felizmente consegui rapidamente encontrar uma unidade de substituição que foi entregue no dia seguinte para que eu pudesse começar a reconstrução.
Admito que fui um pouco pão-duro quando configurei o servidor de arquivos originalmente; apenas duas das unidades são unidades NAS reais (Seagate IronWolf), enquanto o resto são unidades de desktop (Seagate Barracuda). Não é de surpreender que tenha sido uma das unidades de desktop que desistiu (depois de quase três anos de serviço, no entanto). Estava completamente morto; depois de movê-lo para um gabinete USB de desktop, tudo o que consegui foi um som de clique enervante e nem o Ubuntu 20.04 nem o Windows 10 conseguiram detectá-lo.
Bem, vamos à peça de substituição (e sim, o novo drive que comprei era um IronWolf, lição aprendida) - por mais assustador que seja perder um drive em um array em execução, é ainda mais assustador se você não souber o procedimento correto para substituí-lo. Não é a primeira vez que tenho que substituir um drive com falha em um array mdadm, mas felizmente é tão raro que geralmente tenho que procurar os comandos adequados. Desta vez, decidi preparar meu próprio pequeno guia para referência futura.
Então, antes de tudo, quando você receber o temido e-mail de evento de falha do mdadm, você precisa identificar qual drive falhou. Claro, ele dirá o nome do dispositivo (no meu caso, /dev/sdf), mas provavelmente não é óbvio qual drive físico é realmente, pois esses nomes podem mudar quando a máquina é inicializada.
Se você não tiver certeza de qual nome de dispositivo falhou, você pode usar o seguinte comando para descobrir (substitua /dev/md0 pelo seu dispositivo RAID):
Como mencionado, no meu caso era /dev/sdf, então vamos continuar com isso.
Então, você pode tentar encontrar o número de série da unidade com falha emitindo este comando:
(se smartctl não for encontrado, você precisa instalar o pacote smartmontools no Ubuntu)
O número de série pode então ser comparado aos números de série na etiqueta física das unidades para descobrir qual delas falhou.
Dessa vez, não tive tanta sorte. O drive estava completamente morto e até se recusou a fornecer SMART ou outros dados, incluindo o número de série.
Como eu tinha acesso físico ao servidor (o que você realmente precisa se for substituir um drive físico, eu suponho ;-)) e o servidor estava realmente funcionando quando o disco falhou (e continuou funcionando bem graças à redundância RAID-6), eu fui com o método realmente primitivo, mas na verdade altamente eficaz e óbvio, de simplesmente copiar um arquivo grande para o servidor e observar qual luz do HDD não piscava. Em poucos segundos eu tinha identificado o culpado.
Agora, antes de remover a unidade física, é uma boa ideia informar formalmente o mdadm sobre essa intenção, emitindo este comando (substitua os nomes dos dispositivos pelos seus, conforme apropriado):
Em caso de sucesso, o mdadm responderá com uma mensagem dizendo que "removeu a quente" a unidade, aparentemente porque o dispositivo RAID virtual está em execução no momento.
Se falhar com uma mensagem de erro similar a "dispositivo ou recurso ocupado", pode ser que o mdadm não tenha registrado a unidade para ter falhado completamente. Para fazer isso, emita este comando (novamente, lembre-se de substituir os nomes dos dispositivos pelos seus, conforme apropriado):
Depois disso, você poderá remover o dispositivo do array com o comando anterior.
Agora é hora de realmente substituir a unidade. Se você estiver realmente, realmente - tipo, realmente - certo de que sua máquina e controlador suportam troca a quente, você pode fazer isso sem desligar a máquina. Essa seria a maneira de fazer em sistemas de produção críticos rodando em hardware de servidor real e adequado que você sabe que pode lidar com isso. Meu servidor de arquivos doméstico é baseado em uma placa-mãe de desktop de nível de consumidor com alguns controladores SATA semi-noname nos slots PCIe para fornecer mais portas SATA, no entanto.
Embora o SATA geralmente suporte troca a quente, eu não estava disposto a arriscar nada nessa configuração, então optei por desligar a máquina enquanto substituía a unidade.
Antes de fazer isso, é uma boa ideia comentar o dispositivo RAID no arquivo /etc/fstab para que o Ubuntu não tente montá-lo automaticamente na próxima inicialização, porque ele pode travar e forçar você a entrar no modo de recuperação devido à matriz RAID degradada. Isso pode não ser um grande problema se for um sistema de desktop, mas eu executo este servidor sem monitor ou teclado conectado, então isso seria um pouco trabalhoso.
Após inicializar a máquina com o novo drive brilhante instalado, use lsblk ou algum outro meio para identificá-lo. Se você não alterou nada, ele provavelmente (mas não necessariamente ) receberá o mesmo nome do drive que você substituiu. No meu caso, recebeu, então o novo também é chamado de /dev/sdf.
Como meu array é baseado em partições em vez de dispositivos físicos, precisei copiar a tabela de partições de uma unidade de trabalho para a nova unidade para garantir que elas sejam exatamente as mesmas. Se você executar seu array em dispositivos físicos, pode pular esta etapa.
Usei sgdisk para esse propósito, copiando a tabela de partição de /dev/sdc para /dev/sdf. Certifique-se de substituir os nomes dos dispositivos para corresponder aos seus, conforme apropriado.
Observe a ordem aqui: você lista a unidade "para" primeiro! Isso é um pouco contraintuitivo para mim, mas apenas certifique-se de fazer isso corretamente para não ter outra falha de unidade no array ;-)
Então, para evitar conflitos de UUID, gere novos UUIDs para a nova unidade:
E agora finalmente chegou a hora de adicionar o novo drive ao array e começar a festa de reconstrução! (Ok, não é bem uma festa, é na verdade um processo bem lento e enervante, já que você realmente, realmente não quer outro drive falhando nesse momento. Cerveja pode ajudar, no entanto)
De qualquer forma, para adicionar a nova unidade ao array, emita este comando (novamente, certifique-se de substituir os nomes dos dispositivos pelos seus, conforme apropriado):
Se tudo correr bem, a unidade será adicionada ao array sem soluços. Acredito que ele seja adicionado como um "hot spare" por padrão, mas como esse array está sem um disco (aquele que falhou), ele é imediatamente colocado em uso e o processo de reconstrução será iniciado.
Você pode ficar de olho assim:
Isso provavelmente levará um tempo; no meu servidor humilde (baseado em grande parte em hardware de nível de consumidor e unidades de desktop, veja bem), ele conseguiu atingir pouco menos de 100 MB/seg. Tenha em mente que este é RAID-6, então há muitos cálculos de paridade envolvidos com uma reconstrução; um RAID-10 teria sido muito mais rápido. Esta máquina em particular tem uma CPU AMD A10 9700E quad core (o "E" significa que é um modelo de eficiência energética com clock inferior, ou seja, não é super rápido), só para dar uma ideia do que esperar. Com as nove unidades de 8 TB na minha configuração, a reconstrução completa levou pouco mais de 24 horas.
Durante a reconstrução, você pode montar o sistema de arquivos no array e usá-lo normalmente se desejar, mas eu prefiro deixar para a reconstrução até que esteja pronta. Tenha em mente que se uma unidade falhar, outra pode falhar em breve, então você quer que a reconstrução seja feita o mais rápido possível, pois você realmente não quer que outra unidade falhe durante isso. Portanto, não a sobrecarregue com outras E/S que não sejam estritamente necessárias.
Quando terminar, adicione-o novamente ao seu arquivo /etc/fstab, reinicie e aproveite seus arquivos :-)