Era uma vez um servidor LAMP no Ubuntu 12.04 que funcionava em uma única unidade. Consequentemente, surgiu o problema de garantir a transferência do servidor para uma configuração mais tolerante a falhas - RAID1. Os camaradas encarregados desse servidor instalaram o segundo disco e o restante foi designado a mim, e o acesso ao servidor foi apenas via ssh, o que complicou a tarefa.
Após a pesquisa, um
guia foi encontrado e o treinamento começou em uma máquina virtual. Quando atingi o resultado desejado, com alguma empolgação, transferi com êxito o servidor mencionado para o RAID1 e desenhei as etapas necessárias com antecedência. Eu decidi colocar o artigo no qual o processo de transferência é descrito em mais detalhes em "Habr".
A divisão do disco foi a seguinte:
/dev/sda1 2048 1574911 786432 swap /dev/sda2 * 1574912 16254975 7340032 / /dev/sda3 16254976 31457279 7601152 /home
Como o segundo disco era novo, nenhuma operação foi necessária para excluir a partição anterior.
As primeiras coisas foram alteradas em
/etc/default/grub
:
GRUB_TIMEOUT = 5 (diminua o tempo limite);
GRUB_RECORDFAIL_TIMEOUT = 10 (adicione para que o sistema possa inicializar no caso de um erro, sem exigir intervenção interativa; tempo limite a gosto);
GRUB_CMDLINE_LINUX_DEFAULT = "bootdegraded" (certifique-se de adicionar "bootdegraded" para que o sistema possa inicializar a partir de uma matriz inferior);
# GRUB_HIDDEN_TIMEOUT_QUIET = true (deve ser comentado para que o menu GRUB seja sempre exibido).
Desative temporariamente a troca, configure o fdisk para a partição / dev / sda1 usando o fdisk (detecção automática de raide do Linux) e particione o segundo disco da mesma forma que o primeiro (todas as operações são executadas com direitos de superusuário):
sfdisk –d /dev/sda | sfdisk –f /dev/sdb
Então começamos a construir nosso RAID passo a passo:
mdadm --create --verbose /dev/md0 --raid-devices=2 --level=1 --metadata=1.2 /dev/sda1 /dev/sdb1
Crie uma seção em
swap
:
mkswap /dev/md0
/etc/fstab
, substituindo as partições do primeiro disco pelas partições RAID e alterando os números na sexta coluna (a necessidade de verificar o fsck) para zeros:
/dev/sda1 → /dev/md0
Ative a
swap
:
swapon -a
Como nosso servidor está atualmente trabalhando no primeiro disco, criamos o RAID usando até o momento apenas o segundo disco:
mdadm --create --verbose /dev/md1 --raid-devices=2 --level=1 --metadata=1.2 missing /dev/sdb2 mkfs.ext4 /dev/md1 mdadm --create --verbose /dev/md2 --raid-devices=2 --level=1 --metadata=1.2 missing /dev/sdb3 mkfs.ext4 /dev/md2
Atualizando a configuração do
mdadm.conf
:
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
initramfs
para que ele
initramfs
informações sobre o nosso RAID:
update-initramfs -u
Em seguida, o processo mais longo começa - sincronização de dados. Como nosso servidor executa algumas tarefas, pode ser que, após a conclusão da sincronização, parte das informações nas seções da matriz sejam diferentes dos dados nas seções correspondentes do disco de trabalho. Existem várias opções: você pode escolher o horário de menor carregamento, interromper parte dos serviços pela duração da sincronização ou negligenciar as discrepâncias. Em geral, montamos e sincronizamos:
mount /dev/md1 /mnt/ && [tmux|screen] rsync -axu / /mnt mount /dev/md2 /mnt/home && [tmux|screen] rsync -axu /home/ /mnt/home
Para impedir que a sincronização seja interrompida devido a uma interrupção inesperada na conexão ssh, o uso de um multiplexador de terminal não prejudicará.
Após aguardar o final da sincronização, monte os diretórios do sistema em uma nova raiz:
mount --bind /proc /mnt/proc mount --bind /dev /mnt/dev mount --bind /var /mnt/var mount --bind /run /mnt/run mount --bind /sys /mnt/sys
Estamos mudando para um novo sistema
chroot /mnt
e instale o carregador de inicialização nos dois discos
grub-install -–recheck /dev/sda grub-install --recheck /dev/sdb
Atualizamos a configuração de inicialização para carregar os módulos necessários para o RAID (
mdraid1x
):
update-grub
Retornamos ao sistema original e, se necessário, sincronizamos novamente as seções:
[tmux|screen] rsync -axu / /mnt [tmux|screen] rsync -axu /home/ /mnt/home
Como não temos acesso físico ao console ou ao servidor e não podemos selecionar o disco no qual o RAID inicializará, usamos este truque: transferimos a configuração do carregador de inicialização preparado para o disco no qual o sistema inicia e que não está no RAID Quem sabe sobre RAID. Copie o grub.cfg do disco localizado no RAID para o nosso disco de inicialização atual. Isso permitirá que o sistema inicie com / dev / sda, mas monte as matrizes e continue a inicializar a partir da partição que já está no RAID. Primeiro, salve o arquivo antigo, que pode ser necessário ao restaurar o sistema, se não for possível inicializar a partir do RAID, e depois copie o arquivo de configuração "combat":
cp -p /boot/grub/grub.cfg /boot/grub/grub.old cp -p /mnt/boot/grub/grub.cfg /boot/grub/grub.cfg
Além disso, você pode comparar esses arquivos e garantir que, no novo arquivo de configuração do carregador de inicialização, a partição raiz esteja listada como RAID.
Agora vamos para a etapa mais importante do trabalho realizado e reinicializamos. Você pode iniciar o
ping
no servidor no console para que fique claro quando o servidor estará disponível novamente.
lsblk
login e vemos que tudo saiu como desejávamos:
lsblk
mostra que os diretórios
/
e
/home
estão em partições RAID.
Um trabalho fácil e agradável permanece para o aperitivo - adicione duas partições do primeiro disco à matriz, depois de configurá-las com
fdisk
digitar
fd :
mdadm /dev/md1 --add /dev/sda2 mdadm /dev/md2 --add /dev/sda3
e observe periodicamente como está a sincronização do espelho:
watch -n 5 cat /proc/mdstat
Deixe-me terminar aqui, obrigado por sua atenção!