Como reduzir o tamanho do volume da raiz do AWS EBS?

13

Ampliar uma instância do EC2 é fácil como uma respiração (por exemplo, criar uma AMI, iniciar uma instância a partir dela e, em seguida, alterar o tamanho do armazenamento).

Mas reduzir isso se torna mais difícil. Eu gostaria de reduzir o tamanho do volume da raiz do Elastic Block Store (EBS) de uma instância do Amazon Web Services (AWS) EC2. Há casais de velhos procedimentos de alto nível na rede. A versão mais detalhada que encontrei é uma resposta de um ano em uma pergunta do StackOverflow: como posso reduzir a capacidade de volume dos meus ebs , os passos têm um nível bastante alto:

Create a new EBS volume that is the desired size (e.g. /dev/xvdg)

Launch an instance, and attach both EBS volumes to it

Check the file system (of the original root volume): (e.g.) e2fsck -f /dev/xvda1

Maximally shrink the original root volume: (e.g. ext2/3/4) resize2fs -M -p /dev/xvda1

Copy the data over with dd:

  • Choose a chunk size (I like 16MB)

  • Calculate the number of chunks (using the number of blocks from the resize2fs output): blocks*4/(chunk_size_in_mb*1024) - round up a bit for safety

  • Copy the data: (e.g.) dd if=/dev/xvda1 ibs=16M of=/dev/xvdg obs=16M count=80

Resize the filesystem on the new (smaller) EBS volume: (e.g.) resize2fs -p /dev/xvdg

Check the file system (of the original root volume): (e.g.) e2fsck -f /dev/xvdg

Detach your new EBS root volume, and attach it to your original instance

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

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

Qualquer ajuda seria muito apreciada.

    
por herve 04.03.2015 / 18:42

4 respostas

6

No AWS Console:

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

  2. Crie um instantâneo do volume ativo e, em seguida, crie um volume "General Purpose SSD" desse instantâneo.

  3. Crie outro volume "General Purpose SSD" para o tamanho desejado.

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

    • / dev / sda1 para o volume ativo.
    • / dev / xvdf para o volume que é o tamanho do destino.
    • / dev / xvdg para o volume feito a partir do instantâneo do volume ativo.
  5. Inicie a instância.

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

  7. crie esses novos diretórios:

mkdir /source /target

  1. crie um sistema de arquivos ext4 em um 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 deveria ser, neste caso o rótulo é: " / "

e2label /dev/xvdf /

  1. monte o volume criado a partir do instantâneo:

mount -t ext4 /dev/xvdg /source

  1. Copie o conteúdo:

rsync -ax /source/ /target

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

  1. Umount dos sistemas de arquivos:

umount /target e umount /source

  1. De volta ao AWS Console: 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 deve ser inicializada.

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

    
por 02.09.2015 / 04:22
5

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

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

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

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

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

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

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

  2. Crie um instantâneo do volume VA e crie um volume "General Purpose SSD" desse instantâneo. Este volume vamos chamá-lo VASNAP.

  3. Gire uma nova instância com o amazon Linux, chamaremos essa instância C. Vamos usar essa instância para copiar o conteúdo do VASNAP para o VB. Provavelmente poderíamos usar também a instância A para executar essas etapas, mas eu prefiro fazer isso em uma máquina independente.

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

  5. Instância de reinicialização C.

  6. Faça login 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 você não receber nenhum erro, vá para a Etapa 11. Caso contrário, se você não tiver /dev/xvdf1 , será necessário criar a partição fazendo o seguinte i-vii:

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

sudo fdisk /dev/xvdf .

ii) Limpe o disco inserindo: wipefs

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

iv) Digite p para criar uma partição primária

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

vi) Quando ele pedir um comando novamente, digite w para gravar as alterações e sair.

vii) Verifique se você tem a partição /dev/xvdf1 fazendo: 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 prossiga para o passo 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 o Linux reconhecê-lo e inicializá-lo, use "e2label / dev / xvda1" em uma instância ativa para ver o que deveria ser, neste caso o rótulo é: " / "

e2label /dev/xvdf1 /

  1. Monte o VASNAP na / fonte:

mount -t ext4 /dev/xvdg1 /source

  1. Copie o conteúdo:

rsync -vaxSHAX /source/ /target

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

  1. Umount VB:

umount /target

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

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

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

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

por 06.03.2017 / 16:08
1

As etapas a seguir funcionaram para mim

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

Etapa 2. Crie uma nova instância com o volume da 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 o redimensionamento de volume e a cópia de volume a uma instância.

Etapa 4. Formatar redimensionar volume.

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

Nota: certifique-se de que o volume da partição é inserido /dev/xvdf1 não /dev/xvdf

Etapa 5. Montar o redimensionamento de volume e a cópia de volume     mkdir / mnt / copy     mkdir / mnt / resize

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

Passo 6. Copie os arquivos

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

Etapa 7. Assegure que e2label seja igual ao volume raiz

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

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

Pesquise e substitua o 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. Desmontar volumes

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

    
por 19.06.2016 / 05:06
0

Aqui está uma abordagem alternativa;

Anexe e monte o antigo volume 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, não com o volume sendo usado como um sistema ativo.

Crie um novo volume de EBS com o tamanho desejado.

Anexe o novo volume à instância e (cuidadosamente) formate um novo sistema de arquivos (por exemplo, usando o 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 um instantâneo de EBS do novo volume.

Registre o instantâneo como uma nova AMI.

    
por 05.03.2015 / 19:29