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.


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.


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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.