CentOS 6.7 Remove completamente o RAID. Clode discos e inicialize a partir de /dev/sda

CentOS 6.7 Remove completamente o RAID. Clode discos e inicialize a partir de /dev/sda

Eu sou completamente novo no Linux. Herdei um servidor dedicado hospedado em algum lugar da Alemanha. O sistema operacional é o CentOS versão 6.7 (final) de 64 bits. O servidor possui dois discos de 3 TB na configuração de software RAID-1. A situação com a qual estou lidando é que, de acordo com a SMART, o segundo disco está prestes a falhar, porém o administrador anterior teve alguns problemas com o RAID e removeu completamente os componentes /dev/sda dele, então agora o sistema inicializa a partir de um único array RAID-1 de disco (degradado) com todos os arquivos em /dev/sdb (o disco que está prestes a falhar). Além disso, ele apagou completamente /dev/sda. Para resolver o problema preciso realizar as seguintes tarefas:

  1. Reparticione /dev/sda para ser igual a /dev/sdb.
  2. Copie (clone) todos os dados de /dev/sdb para /dev/sda.
  3. Remova completamente a configuração RAID-1.
  4. Configure o sistema para inicializar a partir de /dev/sda como um disco nativo (não de /dev/md*).
  5. Certifique-se de que tudo está funcionando bem.
  6. Apagamento seguro /dev/sdb.
  7. Peça ao suporte para substituir o disco com falha (/dev/sdb) por um novo.
  8. Recrie e sincronize a matriz RAID-1.

O problema é que não sei realizar essas tarefas no Linux. Observe que estou acessando o sistema remotamente, portanto não posso permitir nenhum erro que torne o sistema não inicializável. No entanto, tenho acesso a um sistema de resgate (um pequeno Linux inicializável a partir de DHCP com acesso ao sistema subjacente).

Aqui estão algumas saídas de comandos e arquivos de configuração (talvez úteis):

fdisk -l

Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000e76a6

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1567    12582912+  83  Linux
/dev/sdb2            1567        1633      524288+  fd  Linux raid autodetect
/dev/sdb3            1633      135307  1073741824+  fd  Linux raid autodetect
/dev/sdb4          135307      364802  1843413464    f  W95 Ext'd (LBA)
/dev/sdb5          135308      364802  1843412440   fd  Linux raid autodetect

Disk /dev/sda: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00074207

Device Boot      Start         End      Blocks   Id  System

Disk /dev/md3: 1887.7 GB, 1887654199296 bytes
2 heads, 4 sectors/track, 460853076 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md1: 536 MB, 536858624 bytes
2 heads, 4 sectors/track, 131069 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md2: 1099.5 GB, 1099511488512 bytes
2 heads, 4 sectors/track, 268435422 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

arquivo -s /dev/sdb

/dev/sdb: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3,     stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x83, starthead 32, startsector 2048, 25165825 sectors; partition 2: ID=0xfd, starthead 254, startsector 25169920, 1048577 sectors; partition 3: ID=0xfd, starthead 254, startsector 26220544, 2147483649 sectors; partition 4: ID=0xf, starthead 254, startsector 2173706240, 3686826928 sectors, code offset 0x48

arquivo -s /dev/sda

/dev/sda: x86 boot sector, code offset 0xb8

gato /etc/fstab

proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext4 defaults 0 0
/dev/md3 /home ext4 defaults 0 0

gato /boot/grub/grub.conf

timeout 5
default 0

title CentOS (2.6.32-573.7.1.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-573.7.1.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-573.7.1.el6.x86_64.img

title CentOS (2.6.32-504.1.3.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-504.1.3.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-504.1.3.el6.x86_64.img

gato /proc/mdstat

Personalities : [raid1]
md2 : active raid1 sdb3[1]
      1073741688 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1]
      524276 blocks super 1.0 [2/1] [_U]

md3 : active raid1 sdb5[1]
      1843412304 blocks super 1.0 [2/1] [_U]

unused devices: <none>

Qualquer ajuda sobre isso será muito apreciada.

Obrigado.

Responder1

Primeiro de tudo, é preciso entender que não se trata de alterar um disco com falha em uma matriz RAID-1, mas de como remover completamente a matriz RAID, clonar o disco que está prestes a falhar e, em seguida, inicializar o sistema a partir do disco bom. disco sem qualquer configuração RAID. A razão desta abordagem é porque o primeiro disco (sda), que é o disco bom, está completamente vazio, sem partições e sistemas de arquivos e quando eu o adiciono ao array ele falha na sincronização (reconstrução) provavelmente porque há erros de leitura no segundo disco (sdb). Além disso, o segundo disco (o defeituoso) é de onde o sistema inicializa. As etapas necessárias para concluir esta tarefa são bastante simples se você conhece o Linux e seus comandos; no entanto, o procedimento envolve tarefas de particionamento, clonagem e instalação de MBR que destruirão seus dados se você não for cuidadoso o suficiente. Finalmente, o procedimento a seguir é específico para a configuração dos discos descritos na pergunta, mas deve funcionar em outros sistemas se você substituir cuidadosamente os dispositivos e nomes de partição necessários.

Aqui está o procedimento:

1. Inicialize o sistema no modo de recuperação.

Como vamos clonar dados do disco de inicialização do sistema, não precisamos nos preocupar com arquivos bloqueados ou coisas assim. A melhor maneira de fazer isso é inicializar no modo de recuperação. Felizmente, minha empresa de hospedagem de servidores oferece suporte a isso de uma maneira muito fácil. Em um servidor ao qual você tem acesso direto (sem controle remoto), seria algo como inicializar a partir de um CD ao vivo ou selecionar "Modo de resgate" no menu de inicialização.

2. Prepare o primeiro disco (/dev/sda) para clonar os dados.

Para preparar o sda, precisamos obter informações de particionamento do sdb. Na verdade este passo não é obrigatório porque o nosso objectivo é arrancar o sistema sem qualquer configuração RAID ou sem qualquer relação com sdb, se preferir, por isso se o esquema de partição actual não for o que queremos esta é a oportunidade de alterá-lo. A única coisa que precisamos ter em mente é que as novas partições precisam ter espaço suficiente para armazenar os dados do sdb. No entanto, o particionamento no Linux requer algum conhecimento profundo sobre alinhamento e coisas assim e como o sdb já está particionado corretamente, achei mais fácil fazer o mesmo no sda. Para fazer isso primeiro precisamos visualizar as partições no sdb, usei o parted para isso.

Observação:A tarefa mais difícil quando você está pesquisando como fazer coisas com o Linux é descobrir qual comando (dos muitos) é melhor usar. Por exemplo, existem muitos comandos e utilitários de particionamento e decidir qual deles usar requer uma quantidade significativa de tempo lendo e comparando informações. Optei por usar o parted aqui porque mostra o sistema de arquivos junto com as partições e porque tem melhor suporte para discos grandes? (Não tenho certeza).

# parted /dev/sdb
(parted) unit s
(parted) print

saída:

Model: ATA ST3000DM001-1CH1 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: msdos

Number  Start        End          Size         Type      File system  Flags
 1      2048s        25167872s    25165825s    primary
 2      25169920s    26218496s    1048577s     primary   ext3         raid
 3      26220544s    2173704192s  2147483649s  primary   ext4         raid
 4      2173706240s  5860533167s  3686826928s  extended               lba
 5      2173708288s  5860533167s  3686824880s  logical   ext4         raid

(parted) quit

Como podemos ver aqui, o sdb possui uma tabela de partições do tipo msdos, o que significa que podemos criar até 4 partições primárias no disco. Neste caso possui 3 partições primárias (1,2,3) e uma estendida (4) que contém uma partição lógica (5).

O próximo passo é criar as mesmas partições no sda:

# parted /dev/sda
(parted) unit s
(parted) mkpart primary 2048 25167872
(parted) mkpart primary 25169920 26218496
(parted) mkpart primary 26220544 2173704192
(parted) mkpart extended 2173706240 5860533167
(parted) mkpart logical 2173708288 5860533167
(parted) quit

Como você pode ver, usei os mesmos setores inicial e final do sdb, é claro que os discos são os mesmos, caso contrário você precisará organizar os setores de acordo.

Agora precisamos informar ao sistema sobre as alterações na partição em sda:

# partprobe /dev/sda

Finalmente, precisamos criar os sistemas de arquivos no sda. Provavelmente esta etapa não é necessária porque vamos clonar as partições do sdb para que o procedimento de clonagem também copie as informações do sistema de arquivos, mas não fará mal.

# mkfs -t ext3 /dev/sda2
# mkfs -t ext4 /dev/sda3
# mkfs -t ext4 /dev/sda5

Observe que não criamos um sistema de arquivos na partição 4 (sda4). Isso porque se trata de uma partição estendida que contém uma partição lógica (sda5), bastando criar o sistema de arquivos na partição lógica.

Agora temos o sda particionado e pronto para armazenar nossos dados.

3. Copiando os dados do sdb.

Esta etapa exigiu mais pesquisa, principalmente porque existem muitas maneiras de copiar dados. Provavelmente cp -a seria suficiente, no entanto, não consegui encontrar nenhuma informação sólida sobre como lidar com arquivos ocultos, links etc. para inicializar o sistema corretamente. Então decidi usar um utilitário de cópia byte a byte (clonagem) em vez de um comando de cópia de arquivo. O utilitário que usei foi dd:

# dd if=/dev/md1 of=/dev/sda2 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md2 of=/dev/sda3 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md3 of=/dev/sda5 bs=512 conv=noerror,sync,notrunc

Notas: Primeiramente observe que estamos copiando de /dev/md* e não de /dev/sdb*. Isso ocorre porque nosso disco sdb faz parte de uma matriz RAID-1. Essa foi outra parte para a qual não consegui encontrar nenhuma informação sólida. Por exemplo, o sistema 'vê' /dev/sdb2, /dev/sdb3 e /dev/sdb5 que são as partições que armazenam nossos dados, mas de acordo com o arquivo /etc/fstab ele monta /dev/md1, /dev/md2 e /dev/md3 então presumi que é melhor copiar de /dev/md*. Outra coisa que você precisa observar é onde no sda você irá copiar os dados. Em outras palavras, onde em sda /dev/md1,2,3 precisa ser copiado. Bem, neste caso é fácil descobrir isso com base nos tamanhos das partições e nos sistemas de arquivos, porém em um sistema diferentedf-kpode mostrar isso, mas não no modo de recuperação; você precisa inicializar normalmente para que isso funcione.

Finalmente, com os comandos acima, instruímos o dd a clonar cada partição separadamente, byte por byte, sem parar em nenhum erro de leitura (parâmetro noerror). É claro que isso pode levar a um sistema não inicializável se houver algum erro de leitura de dados no sdb (o que existe neste caso), no entanto, antes de acabar usando o dd, usei algumas técnicas para descobrir quais arquivos foram afetados e se era seguro para prosseguir com a clonagem. Esta tarefa está além do escopo desta resposta, mas um bom lugar para começar éaqui.

Outro ponto significativo de atenção é o parâmetro de tamanho de bloco (bs). De acordo com a documentação do dd você deve definir o bs para 512 bytes porque se houver um erro de leitura, e isso acontecerá, ele "destruirá" apenas 512 bytes no disco de destino em vez de uma área maior, porém o processo será mais lento. Novamente, não consegui encontrar nenhuma informação sólida sobre isso e provavelmente um tamanho de bloco de 4.096 bytes teria os mesmos resultados.

Finalmente, dd não produz nenhuma saída durante sua operação e levará algum tempo para terminar devido ao tamanho das partições. Se você quiser ver onde está, você deve abrir uma nova sessão de console (no meu caso, uma nova sessão remota ssh, já que estou fazendo isso remotamente) e emitir o comando:

# kill -USR1 $(pidof dd)

Isso forçará o dd a imprimir seu progresso atual na primeira sessão do console.

4. Torne o sda inicializável.

Isso é bastante simples de fazer. Primeiro de tudo você precisa montar os pontos de montagem necessários no sda:

# mount -t ext4 /dev/sda3 /mnt
# mount -t proc proc /mnt/proc
# mount -t sysfs sys /mnt/sys
# mount -o bind /dev /mnt/dev
# mount -t ext3 /dev/sda2 /mnt/boot

Nota: o último comando não é necessário se você não tiver uma partição separada para /boot em seu sistema.

Em seguida, você precisa se tornar root no disco /dev/sda, agora você é root no sistema de recuperação.

# chroot /mnt /bin/bash

Em seguida, precisamos atualizar nosso arquivo etc/mtab. Eu realmente não sei por que deveríamos fazer isso, encontrei em outro tutorial de resgate sem explicação.

# grep -v rootfs /proc/mounts > /etc/mtab

Em seguida, precisamos instalar o GRUB no sda.

# grub-install --recheck /dev/sda

saída:

Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.

No momento temos o sda pronto para inicializar, porém existem mais algumas etapas para que o sistema saiba onde encontrar o arquivo necessário após inicializar a partir do sda.

A primeira coisa é editar/boot/grub/grub.conffile que é o arquivo que o GRUB irá ler para saber como irá proceder. No meu caso tive que substituir todos"raiz (hd0,0)"instância com"raiz (hd0,1)"e cada"/dev/md2"instância com"/dev/sda3".

grub.confpode ser muito confuso, especialmente para alguém que nunca o usou antes. A parte mais confusa são os parâmetros root, no grub existem dois significados diferentes para a palavra root. Quando aparece como "root (hd0,1)", ele informa ao grub onde está seu diretório raiz para encontrar os kernels Linux necessários e instruções sobre como inicializá-los. Muitas pessoas o confundem com o diretório raiz "/" no sistema quando ele está totalmente inicializado, mas o que o grub precisa aqui é onde está o diretório /boot. Neste caso, eu tenho uma partição separada (/dev/sda2) que contém o diretório /boot e como /dev/sda2 é a segunda partição do primeiro disco, preciso dizer exatamente isso ao grub, mas começando com zero (a primeira partição é 0, o segundo é 1 e assim por diante), então o comando "root (hd0,1)" diz ao grub que ele encontrará os arquivos necessários na segunda partição do primeiro disco.

Quando root aparece como "/dev/" ele informa ao kernel onde estará a raiz do sistema de arquivos, que é o "/" quando o sistema estiver totalmente inicializado. Portanto, neste caso, estamos inserindo o nome da partição (como o Linux vê) onde está "/", no meu caso /dev/sda3.

Finalmente precisamos editar/etc/fstabarquivo para informar ao sistema o que montar e onde quando for iniciado.

No meu caso, tive que substituir todas as entradas "/dev/md*" pelas partições "/dev/sda*" correspondentes que eram:

/dev/md1 --> /dev/sda2 /dev/md2 --> /dev/sda3 /dev/md3 --> /dev/sda5

5. Verifique e desative a inicialização do sdb.

Se você é compulsivo como eu, então você pode querer fugir

# file -s /dev/sda

para ver se o grub está instalado no sda. Se você obtiver uma saída como:

/dev/sda: sticky x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94;

então o grub (GRand Unified Bootloader) é instalado no sda.

Embora não seja necessário, você pode querer remover o grub do sdd. Fiz isso porque se algo com a configuração acima estiver errado, o sistema inicializará a partir do sdb e isso pode ser confuso. Para excluir o grub do sdb usei o dd:

# dd if=/dev/zero of=/dev/sdb bs=446 count=1

Isso gravará zero nos primeiros 446 bytes do disco, onde o grub reside em discos com tabelas de partição msdos.

$ file -s /dev/sdb

Isso verificará se o grub foi removido.

6. Saia do chroot e desmonte tudo.

# exit
# umount /mnt/boot
# umount /mnt/dev
# umount /mnt/sys
# umount /mnt/proc
# umount /mnt

Se aparecer algum erro durante a execução dos comandos acima, significa que algo não foi finalizado ou deu errado em nossa sessão chroot e provavelmente precisaremos recomeçar.

7. Reinicie.

Agora cruze os dedos e reinicie

# reboot

Se você conseguir fazer login no servidor com suas credenciais root originais e tudo parecer funcionar bem (bancos de dados, sites, etc.), você inicializou com êxito a partir do sda.

8. Prepare o sdb para substituição.

No meu caso eu queria apagar todos os dados do sdb antes de pedir ao suporte para substituí-lo. Além disso, precisei remover completamente a configuração RAID do sistema para construir uma nova do zero quando o novo disco estiver instalado. Comecei executando o parted para deletar as partições:

# parted /dev/sdb
# (parted) rm 5
# (parted) rm 4
# (parted) rm 2
# (parted) rm 2
# (parted) rm 1
# (parted) quit

Então percebi que todas as configurações do RAID também foram removidas, então presumi que a definição do RAID estava dentro das partições, então não realizei nenhuma ação adicional para isso. Então eu protegi o sdb apagado. Existem várias maneiras de fazer isso. Eu escolhi o/dev/urandommétodo deaqui

Responder2

Talvez seja melhor não tentar isso e, em vez disso, começar do zero ou algo assim. Eu não teria tentado isso quando era novo no Linux.

Dito isto, tudo o que você precisa fazer é particionar e adicionar /dev/sda de volta ao array raid e, uma vez reconstruído, substituir /dev/sdb. Certifique-se de que o grub esteja em ambos os discos e que o BIOS tente ambos os discos durante a inicialização.

informação relacionada