Diminuindo o tamanho do volume do Amazon EBS

25

Vi essa resposta para aumentar os volumes do EBS , mas gostaria de diminuir um.

As imagens padrão do Ubuntu Server são 15 GB, enquanto eu realmente preciso de apenas 2 GB no máximo (eu uso um volume diferente para dados). Existe uma maneira de diminuir o tamanho do volume?

Peter Smit
fonte

Respostas:

27

Eu tinha a mesma pergunta que você, então resolvi como fazê-lo.

Primeiro, fiz isso a partir do ami suportado pelo EBS de 32 bits do Ubuntu, da região leste dos EUA; outros sistemas operacionais ou imagens podem funcionar de maneira diferente. No entanto, suspeito que você deva estar bem, desde que esteja usando um sistema de arquivos ext *. Pode funcionar em outros sistemas de arquivos, mas você terá que descobrir como redimensioná-los por conta própria.

Os passos são basicamente:

  1. Anexe dois volumes a uma instância em execução, o primeiro com base na captura instantânea que você deseja reduzir e o segundo em um volume em branco com o novo tamanho para o qual você deseja reduzir.

  2. Verifique o sistema de arquivos do primeiro volume e repare os erros.

  3. Reduza o sistema de arquivos no primeiro volume para que ele tenha o tamanho necessário para armazenar os dados.

  4. Copie o sistema de arquivos do primeiro volume para o segundo.

  5. Expanda o sistema de arquivos no segundo volume para o tamanho máximo.

  6. Verifique se tudo está bem, verificando se há erros no segundo volume.

  7. Tire uma foto do segundo volume.

  8. Crie uma imagem de máquina com base no instantâneo do segundo volume que você acabou de tirar.

Você primeiro precisa obter algumas informações da ami que deseja reduzir. Em particular, você precisa do ID do kernel e do ramdisk, se houver (a imagem que eu reduzi não tinha um ramdisk). Todas essas informações devem estar disponíveis no console de gerenciamento do aws, na janela AMI.

O ID do kernel se parece com kia-xxxxxxxx, e o ID da captura instantânea se parece com snap-xxxxxxxx, e os IDs do ramdisk se parecem com RIA-xxxxxxxx.

Em seguida, inicie uma instância linux. Lancei uma instância do Ubuntu. Você pode usar uma instância t1.micro, se quiser. Não é preciso muito poder para executar esses próximos passos.

Depois que a máquina estiver funcionando, anexe o instantâneo que você anotou desde a primeira etapa. No meu caso, anexei-o ao / dev / sdf

Em seguida, crie um novo volume, com o tamanho desejado. No meu caso, criei um volume de 5 GB, pois esse é o tamanho que eu queria reduzi-lo. Não crie este novo volume a partir de um instantâneo. Precisamos de um novo volume em branco. Em seguida, anexe-o à instância em execução; no meu caso, anexei-o como / dev / sdg

Em seguida, faça o ssh na máquina, mas não monte os volumes anexados.

Nesse ponto, errei ao lado da paranóia e optei por verificar o sistema de arquivos no grande volume, apenas para garantir que não houvesse erros. Se você tem certeza de que não há, pode pular esta etapa:

$ sudo e2fsck -f /dev/sdf

Em seguida, redimensionei o sistema de arquivos no volume grande para que ele fosse tão grande quanto os dados no disco:

$ sudo resize2fs -M -p /dev/sdf

O -M diminui e o -p imprime o progresso.

O resize2fs deve informar o tamanho do sistema de arquivos shrunkin. No meu caso, ele me deu o tamanho em blocos de 4K.

Agora, copiamos o sistema de arquivos shrunkin para o novo disco. Vamos copiar os dados em pedaços de 16 MB, portanto, precisamos descobrir quantos pedaços de 16 MB precisamos copiar. É aqui que o tamanho do sistema de arquivos encolhido é acessível.

No meu caso, o sistema de arquivos encolhido tinha pouco mais de 1 GB, porque eu havia instalado muitos outros programas no sistema básico do Ubuntu antes de tirar uma captura instantânea. Eu provavelmente poderia ter conseguido copiar apenas o tamanho do sistema de arquivos arredondado para os 16 MB mais próximos, mas queria jogar com segurança.

Então, 128 vezes pedaços de 16 MB = 2 GB:

$ sudo dd if=/dev/sdf ibs=16M of=/dev/sdg obs=16M count=128

Copiei em blocos de 16 MB porque, com o EBS, você paga por cada leitura e gravação, então eu queria minimizar o número deles o máximo possível. Não sei se fazê-lo dessa maneira, mas provavelmente não doeu.

Em seguida, precisamos redimensionar o sistema de arquivos que acabamos de copiar para o novo volume, para que ele use todo o espaço disponível no volume.

$ sudo resize2fs -p /dev/sdg

Por fim, verifique, para garantir que está tudo bem:

$ sudo e2fsck -f /dev/sdg

É tudo o que precisamos fazer nesta máquina, embora não seja demais montar o novo volume, apenas como teste. No entanto, esta etapa é quase certamente opcional, pois o e2fsck deveria ter detectado algum problema.

Agora precisamos capturar instantaneamente o novo volume e criar uma AMI com base nele. Terminamos a máquina, para que você possa finalizá-la, se quiser.

Certifique-se de que o pequeno volume esteja desmontado se você o montou e tire uma foto instantânea. Novamente, você pode fazer isso no console de gerenciamento.

A etapa final requer as ferramentas ec2 da linha de comando.

EDITAR:

Como essa resposta foi publicada, o console da AWS permite que você simplesmente clique com o botão direito do mouse em um instantâneo e selecione Criar imagem do instantâneo. Você ainda precisará selecionar o ID do Kernel apropriado. Se ele não aparecer na lista, verifique se você selecionou a arquitetura apropriada.

Usamos o aplicativo ec2-register para registrar uma AMI com base no instantâneo que você acabou de tirar, portanto, anote o valor snap-xxxxxxxx no instantâneo que você acabou de tirar.

Você deve usar um comando como:

ec2-register -C cert.pem -K sk.pem -n The_Name_of_Your_New_Image
-d Your_Description_of_This_New_AMI --kernel aki-xxxxxxxx
-b "/dev/sda1=snap-xxxxxxxx" --root-device-name /dev/sda1

É claro que você precisa substituir o ID do kernel pelo que você anotou no início e o ID do instantâneo pelo que você criou na etapa anterior. Você também precisa apontar para sua chave secreta (chamada sk.pem) acima e seu certificado x509 (chamado cert.pem). Obviamente, você pode escolher o que quiser para o nome e a descrição.

Espero que isto ajude.

Aaron
fonte
Obrigado, isso ajudou! Para grandes volumes (como 1 TB), esse procedimento leva um longo tempo na micro instância. Eu já vi cópias de volume baseadas em rsync no-fsck (por exemplo, aqui ubuntuforums.org/showpost.php?p=9866025&postcount=27 ), mas a abordagem baseada em dd parece muito mais confiável, mesmo para volumes não raiz.
cronológico
O primeiro comando sudo e2fsck -f /dev/sdfpode ser uma etapa necessária antes de redimensionar (em minha instância específica, uma Amazon Linux AMI).
Notacouch 6/03/2014
11
Deve ser óbvio, mas não se esqueça de criar um sistema de arquivos no volume (/ facepalm) conforme os documentos da AWS sudo mkfs -t ext4 /dev/sdg,.
Notacouch 7/03/14
1

Sim, eu também me perguntei isso. O tutorial a seguir é um exagero, mas acho que ele contém as ferramentas necessárias: http://www.linuxconfig.org/Howto_CREATE_BUNDLE_UPLOAD_and_ACCESS_custom_Debian_AMI_using_ubuntu

Em vez de instalar em uma nova imagem de disco, como acima, deve ser possível iniciar a AMI grande, criar um novo EBS, anexar o EBS à instância em execução e copiar a AMI em execução no novo EBS. Por fim, registre o novo EBS como um AMI.

Dê uma olhada neste blog para obter mais informações, especialmente o comentário de freremark: http://alestic.com/2010/01/public-ebs-boot-amis-for-ubuntu-on-amazon-ec2

Em uma nota final, o euca2ools parece ser um ótimo substituto para o ec2-ami-tools - o euca2ools inclui páginas de manual reais! Eles têm todos os mesmos nomes que os comandos ec2- *, apenas com o prefixo euca-. http://open.eucalyptus.com/wiki/Euca2oolsUsing


fonte
0

Eu queria reduzir o tamanho do volume que está sendo usado por uma instância geral do EC2. Eu segui etapas semelhantes às outras respostas aqui, mas tive um problema. Então, aqui está o que eu tive que fazer para reduzir meu volume raiz ...

No console da AWS

 1. Stop the source EC2 instance
 2. Create a snapshot of the volume you want to shrink
 3. Use the snapshot to create a new 'source' volume
 4. Created a new volume with smaller size (made sure it was big enough for the data on source)
 5. Attached both volumes to any EC2 instance (mine were /dev/sdf = source & /dev/sdg = target)
 6. Start the EC2 instance

Na instância do EC2

 7. sudo su -   (everything from here is run as root)
 8. mkdir /source /target
 9. mount -t ext4 /dev/sdf /source
 10. mkfs.ext4 /dev/sdg
 11. mount -t ext4 /dev/sdg /target
 12. rsync -aHAXxSP /source/ /target 
     ** notice that there is no trailing '/' after target if 
       you put one there your data will be copied to 
       /target/source and you will have to move it up a directory
 13. cat /boot/grub/grub.conf  (indicated that grub is using root=LABEL=/)
 14. cat /source/etc/fstab (indicated that fstab was also using LABEL=/)
 15. e2label /dev/sdg /
 16. umount /source
 17. umount /target

De volta ao console da AWS

 18. Stop the instance
 19. Detach ALL volumes from the instance
 20. Attach the 'target' volume to the instance using /dev/sda1 as the device
 21. Start the instance

Aqui é onde encontramos um problema que não foi mencionado até onde posso encontrar. A instância começou bem, ótimo! Mas quando tentei ssh para a instância, não consegui me conectar. Depois de muitas variações das etapas acima, finalmente decidi tentar usar o volume raiz de uma instância do EC2 recém-gerada.

No console da AWS

 1. Create a new EC2 instance with the right sized root volume
 2. Stop the new instance
 3. Detach the /dev/sda1 volume from the new instance
    ** used the 'source' volume from before & the new volume we just detached
 4. Attached both volumes to the original EC2 instance (/dev/sdf & /dev/sdg)
 5. Start the instance with the attached volumes

Na instância do EC2

 1. sudo su - 
 2. mkdir /source /target (only need to do this if you don't already have these directories)
 3. mount -t ext4 /dev/sdf /source
 4. mount -t ext4 /dev/sdg /target (no need to create a file system because it is already there)
 5. rsync -aHAXxSP /source/ /target 
 6. umount /source
 7. umount /target

De volta ao console da AWS

 1. Stop the instance
 2. Detach the 'source' and 'target' volumes from instance
 3. Attach the 'target' volume to the instance from step 1 using /dev/sda1 as the device
 4. Start the instance
 5. ** we use an elastic IP so we just reassigned the IP to the new instance

Espero que isso ajude alguém

Kasdega
fonte
O tamanho de um volume só pode ser aumentado, não diminuído. do instantâneo.
Ankit Kumar Rajpoot