Como reduzir o tamanho do volume raiz do AWS EBS?

16

Ampliar uma instância do EC2 é fácil como uma respiração (por exemplo, crie uma AMI, inicie uma instância a partir dela e altere o tamanho do armazenamento).

Mas reduzi-lo se torna mais difícil. Gostaria de reduzir o tamanho do volume raiz da instância do Amazon Web Services (AWS) EC2 Elastic Block Store (EBS). Existem alguns procedimentos antigos de alto nível na rede. A versão mais detalhada que encontrei é uma resposta de um ano sobre uma pergunta do StackOverflow: como posso reduzir minha capacidade de volume de ebs , as etapas têm um nível bastante alto:

Crie um novo volume EBS com o tamanho desejado (por exemplo, / dev / xvdg)

Inicie uma instância e anexe os dois volumes EBS a ela

Verifique o sistema de arquivos (do volume raiz original): (por exemplo) e2fsck -f / dev / xvda1

Reduza ao máximo o volume raiz original: (por exemplo, ext2 / 3/4) resize2fs -M -p / dev / xvda1

Copie os dados com dd:

  • Escolha um tamanho de bloco (eu gosto de 16 MB)

  • Calcule o número de pedaços (usando o número de blocos da saída resize2fs): blocks * 4 / (chunk_size_in_mb * 1024) - arredondar um pouco para segurança

  • Copie os dados: (por exemplo) dd se = / dev / xvda1 ibs = 16M de = / dev / xvdg obs = 16M count = 80

Redimensione o sistema de arquivos no novo volume EBS (menor): (por exemplo) resize2fs -p / dev / xvdg

Verifique o sistema de arquivos (do volume raiz original): (por exemplo) e2fsck -f / dev / xvdg

Desanexe seu novo volume raiz do EBS e anexe-o à sua instância original

Não consigo encontrar uma solução detalhada de como fazer passo a passo.

Meu volume raiz do EBS está anexado a uma instância do HVM Ubuntu.

Qualquer ajuda seria muito apreciada.

herve
fonte
Parece uma boa solução passo a passo "como fazer".
precisa
dd - cópia de disco para disco dd if = / dev / xvdf de = / dev / xvdh bs = 4k contagem = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Respostas:

6

No console da AWS:

  1. Pare a instância que você deseja redimensionar

  2. Crie uma captura instantânea do volume ativo e crie um volume "General Purpose SSD" a partir dessa captura instantânea.

  3. Crie outro volume "SSD de uso geral" para o tamanho desejado.

  4. Anexe esses 3 volumes à instância como:

    • / dev / sda1 para o volume ativo.
    • / dev / xvdf para o volume que é o tamanho de destino.
    • / dev / xvdg para o volume criado a partir da captura instantânea do volume ativo.
  5. Inicie a instância.

  6. Faça logon na nova instância via SSH.

  7. crie estes novos diretórios:

mkdir /source /target

  1. crie um sistema de arquivos ext4 no novo volume:

mkfs.ext4 /dev/xvdf

  1. monte-o neste diretório:

mount -t ext4 /dev/xvdf /target

  1. Isso é muito importante, o sistema de arquivos precisa de um e2label para o linux reconhecê-lo e inicializá-lo; use "e2label / dev / xvda1" em uma instância ativa para ver o que deve ser; nesse caso, o rótulo é: "/"

e2label /dev/xvdf /

  1. monte o volume criado a partir da captura instantânea:

mount -t ext4 /dev/xvdg /source

  1. Copie o conteúdo:

rsync -ax /source/ /target

Nota: não há "/" following "/ target". Além disso, pode haver alguns erros sobre links simbólicos e atrs, mas o redimensionamento ainda foi bem-sucedido

  1. Desmonte os sistemas de arquivos:

umount /target
umount /source

  1. De volta ao console da AWS: pare a instância e desanexe todos os volumes.

  2. Anexe o novo volume dimensionado à instância como: "/ dev / sda1"

  3. Inicie a instância e ela deverá inicializar.

O PASSO 10 É IMPORTANTE : Rotule o novo volume com "e2label", como mencionado acima, ou a instância parecerá inicializar em aws, mas não passará na verificação de conexão.

conta
fonte
9
Eu executei essas etapas várias vezes (Ubuntu 14.04) e toda vez que anexo o novo volume, a instância simplesmente para. Mais alguém está passando por esse problema? Isso está destruindo meu cérebro!
thiesdiggity
2
Você não é o único. Eu tentei essa e outras soluções e, como você, minha instância também é encerrada.
blairmeister
11
@blairmeister Eu tive o mesmo problema, mas consegui fazê-lo funcionar! Ter um olhar para a minha resposta abaixo se você ainda está encravada :)
Ruben Serrate
minha e2label é cloudimg-rootfs ... seguintes todos estes passos posso confirmar no Ubuntu 14.04 não funciona
NineCattoRules
11
Estou votando negativamente nesta resposta, pois ela não cobre casos de uso suficientes para um volume (como um volume de inicialização) para proteger os usuários contra danos inadvertidos.
Jesse Adelman
6

Nenhuma das outras soluções funcionará se o volume for usado como um dispositivo raiz (inicializável).

O disco recém-criado está ausente na partição de inicialização, portanto, é necessário ter o GRUB instalado e alguns sinalizadores configurados corretamente antes que uma instância possa usá-lo como volume raiz.

Minha (a partir de hoje, trabalhando ) solução para reduzir um volume raiz é:

Antecedentes: Temos uma instância A, cujo volume raiz queremos reduzir. Vamos chamar esse volume de VA. Queremos reduzir o VA de 30 GB para, digamos, 10 GB

  1. Crie uma nova instância do ec2, B, com o mesmo sistema operacional da instância A. Como armazenamento, escolha um volume do mesmo tipo que o VA, mas com um tamanho de 10 GB. (ou qualquer que seja o tamanho desejado). Então agora temos uma instância B que usa esse novo volume (vamos chamá-lo de VB) como volume raiz.
  2. Depois que a nova instância (B) estiver em execução. Pare e desanexe seu volume raiz (VB).

NOTA: As etapas a seguir são tomadas principalmente na solução da @bill:

  1. Pare a instância que você deseja redimensionar (A).

  2. Crie uma captura instantânea do volume VA e crie um volume "General Purpose SSD" a partir dessa captura instantânea. Esse volume será chamado de VASNAP.

  3. Gire uma nova instância com o amazon Linux, que chamaremos de instância C. Apenas usaremos essa instância para copiar o conteúdo do VASNAP para o VB. Provavelmente, também poderíamos usar a instância A para executar essas etapas, mas prefiro fazê-lo em uma máquina independente.

  4. Anexe os seguintes volumes à instância C. / dev / xvdf para VB. / dev / xvdg para VASNAP.

  5. Reinicie a instância C.

  6. Faça logon na instância C via SSH.

  7. Crie estes novos diretórios:

mkdir /source /target

  1. Formate a partição principal do VB com um sistema de arquivos ext4:

mkfs.ext4 /dev/xvdf1

Se não houver erros, continue na Etapa 11. Caso contrário, se você não tiver /dev/xvdf1, precisará criar a partição executando o seguinte i-vii:

i) Se /dev/xvdf1não existir por qualquer motivo, você precisará criá-lo. Primeiro digite:

sudo fdisk /dev/xvdf.

ii) Limpe o disco digitando: wipefs

iii) Crie uma nova partição digitando: n

iv) Enter ppara criar a partição primária

v) Continue pressionando enter para continuar com as configurações padrão.

vi) Quando solicitar um comando novamente, digite wpara escrever as alterações e sair.

vii) Verifique se você possui a /dev/xvdf1partição executando: lsblk

Você deve ver algo como:

NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  250G  0 disk
└─xvda1 202:1    0  250G  0 part
xvdf    202:80   0   80G  0 disk
└─xvdf1 202:81   0   80G  0 part 
xvdg    202:96   0  250G  0 disk
└─xvdg1 202:97   0  250G  0 part

Agora vá para a Etapa 11.

  1. Monte-o neste diretório:

mount -t ext4 /dev/xvdf1 /target

  1. Isso é muito importante, o sistema de arquivos precisa de um e2label para Linux para reconhecê-lo e inicializá-lo; use "e2label / dev / xvda1" em uma instância ativa para ver o que deve ser; nesse caso, o rótulo é: "/"

e2label /dev/xvdf1 /

  1. Monte o VASNAP em / fonte:

mount -t ext4 /dev/xvdg1 /source

  1. Copie o conteúdo:

rsync -vaxSHAX /source/ /target

Nota: não há "/" following "/ target". Além disso, pode haver alguns erros sobre links simbólicos e atrs, mas o redimensionamento ainda foi bem-sucedido

  1. Umount VB:

umount /target

  1. De volta ao console da AWS: desanexe o VB da instância C e também desanexe o VA de A.

  2. Anexe o novo volume de tamanho (VB) à instância como: "/ dev / xvda"

  3. Instância de inicialização A, agora seu dispositivo raiz tem 10 GB :)

  4. Exclua as instâncias B e C e também todos os volumes, exceto o VB, que agora é o volume raiz da instância A.

Ruben Serrate
fonte
Qual é o seu sistema operacional?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
Tentei no Ubuntu 14.04 e ele não funciona
NineCattoRules
@NineCattoRules Ouch ... Posso confirmar que funciona para o Amazon Linux, tive que fazê-lo recentemente.
Ruben Serrate
11
Não devemos anexar o volume da etapa 17 ao /dev/sda1intstead do /dev/xvda@RubenSerrate?
Alper
2

Os seguintes passos funcionaram para mim

Etapa 1. Crie um instantâneo do volume raiz ebs e crie um novo volume a partir do instantâneo (vamos chamar isso de cópia de volume)

Etapa 2. Crie uma nova instância com o volume raiz do ebs com o tamanho desejado. (vamos chamar isso de redimensionado por volume) Este volume ebs terá a partição correta para a inicialização. (Criar um novo volume de ebs do zero não funcionou para mim)

Etapa 3. Anexe redimensionar volume e copiar volume a uma instância.

Etapa 4. Formate redimensionar volume.

sudo fdisk -l
    sudo mkfs -t ext4 /dev/xvdf1

Nota: verifique se o volume da partição está inserido /dev/xvdf1não/dev/xvdf

Etapa 5. Monte o redimensionamento de volume e copie o volume mkdir / mnt / copy mkdir / mnt / resize

sudo mount /dev/xvdh1 /mnt/copy
sudo mount /dev/xvdf1 /mnt/resize

Etapa 6. Copie arquivos

rsync -ax /mnt/copy/ /mnt/resize

Etapa 7. Verifique se o e2label é igual ao volume raiz

sudo E2label /dev/xvdh1 > cloudimg-rootfs
sudo E2label /dev/xvdf1 cloudimg-rootfs

Etapa 8. Atualize o grub.conf na cópia de volume para corresponder ao novo volume udid

Pesquise e substitua uudid em /boot/grub/grub.cfg

ubuntu@server:~/mnt$ sudo blkid
/dev/xvdh1: LABEL="cloudimg-rootfs" UUID="1d61c588-f8fc-47c9-bdf5-07ae1a00e9a3" TYPE="ext4"
/dev/xvdf1: LABEL="cloudimg-rootfs" UUID="78786e15-f45d-46f9-8524-ae04402d1116" TYPE="ext4"

Etapa 9. Desmonte volumes

Etapa 10. Anexe o novo volume ebs redimensionado à instância / dev / sda1

DrewJaja
fonte
11
Combinar a resposta serrilhada @ruben com a atualização do grub UUID é o que funcionou para mim.
Jonathan Maim
Nota pequena, pois acabei de perder algum tempo: Executar blkidsem sudoretornar resultados armazenados em cache sem validá-los. Então, parece que o UUID não mudou.
precisa saber é o seguinte
0

Aqui está uma abordagem alternativa;

Anexe e monte o volume antigo do EBS em uma instância do EC2 em execução. Se você deseja copiar um volume de inicialização, é melhor fazê-lo em uma instância diferente, com o volume antigo montado como dados, e não com o volume sendo usado como um sistema ativo.

Crie um novo volume EBS do tamanho desejado.

Anexe o novo volume à instância e (com cuidado) formate um novo sistema de arquivos (por exemplo, usando mkfs). Monte-o.

Copie o conteúdo antigo do sistema de arquivos do volume antigo para o novo volume:

rsync -vaxSHAX /oldvol/ /newvol/

Desmonte o novo volume e desanexe-o da instância.

Se você estava copiando o sistema de arquivos raiz, então:

Crie uma captura instantânea do EBS do novo volume.

Registre o instantâneo como uma nova AMI.

Eric Hammond
fonte