..png)
Ampliar uma instância EC2 é fácil como respirar (por exemplo, criar uma AMI, iniciar uma instância a partir dela e, em seguida, alterar o tamanho do armazenamento).
Mas reduzi-lo torna-se mais difícil. Gostaria de reduzir o tamanho do volume raiz do Elastic Block Store (EBS) de uma instância do Amazon Web Services (AWS) EC2. Existem alguns procedimentos antigos de alto nível na rede. A versão mais detalhada que encontrei é uma resposta de um ano para uma pergunta do StackOverflow:como posso reduzir minha capacidade de volume ebs, as etapas têm um nível bastante alto:
Crie um novo volume EBS com o tamanho desejado (por exemplo, /dev/xvdg)
Execute uma instância e anexe os dois volumes do 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 (gosto de 16 MB)
Calcule o número de pedaços (usando o número de blocos da saída resize2fs): blocos*4/(chunk_size_in_mb*1024) - arredonde um pouco para segurança
Copie os dados: (por exemplo) dd if=/dev/xvda1 ibs=16M of=/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
Desconecte seu novo volume raiz do EBS e anexe-o à sua instância original
Não consigo encontrar uma solução detalhada passo a passo de “como fazer”.
Meu volume raiz EBS está anexado a uma instância HVM Ubuntu.
Qualquer ajuda seria muito apreciada.
Responder1
Nenhuma das outras soluções funcionará se o volume for usado como dispositivo raiz (inicializável).
O disco recém-criado não tem a partição de inicialização, portanto, seria necessário ter o GRUB instalado e alguns sinalizadores configurados corretamente antes que uma instância possa usá-lo como volume raiz.
Meu (a partir de hoje,trabalhando) a solução para reduzir um volume raiz é:
Fundo: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
- Crie uma nova instância ec2, B, com o mesmo sistema operacional da instância A. Além disso, os kernels devem corresponder, portanto, atualize ou faça downgrade conforme necessário. Como armazenamento, escolha um volume do mesmo tipo do VA, mas com tamanho de 10 GB. (ou qualquer que seja o tamanho do seu alvo). Portanto, agora temos uma instância B que usa esse novo volume (vamos chamá-lo de VB) como volume raiz.
- Assim que a nova instância (B) estiver em execução. Pare e desconecte seu volume raiz (VB).
NOTA: As etapas a seguir são obtidas principalmente da solução do @bill:
Pare a instância que deseja redimensionar (A).
Crie um instantâneo do volume VA e, em seguida, crie um volume "SSD de uso geral" a partir desse instantâneo. Chamaremos este volume de VASNAP.
Gire uma nova instância com Amazon Linux, chamaremos essa instância de C. Usaremos esta instância apenas para copiar o conteúdo do VASNAP para VB. Provavelmente também poderíamos usar a instância A para executar essas etapas, mas prefiro fazê-lo em uma máquina independente.
Anexe os seguintes volumes à instância C. /dev/xvdf para VB. /dev/xvdg para VASNAP.
Reinicie a instância C.
Faça logon na instância C via SSH.
Crie estes novos diretórios:
mkdir /source /target
- Formate a partição principal do VB com um sistema de arquivos ext4:
mkfs.ext4 /dev/xvdf1
Se não houver erros, prossiga para a Etapa 11. Caso contrário, se não tiver /dev/xvdf1
, você precisará criar a partição fazendo o seguinte i-vii:
i) Se /dev/xvdf1
não existir por qualquer motivo, você precisa criá-lo. Primeiro digite:
sudo fdisk /dev/xvdf
.
ii) Limpe o disco digitando:
wipefs
iii) Crie uma nova partição digitando:
n
iv) Enter p
para criar partição primária
v) Continue pressionando enter para continuar com as configurações padrão.
vi) Quando solicitar um comando novamente, digite w
para escrever as alterações e saia.
vii) Verifique se você tem a /dev/xvdf1
partição fazendo:
lsblk
Você deverá 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 a Etapa 11.
- Monte-o neste diretório:
mount -t ext4 /dev/xvdf1 /target
- 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 /
- Monte o VASNAP em /source:
mount -t ext4 /dev/xvdg1 /source
- 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 atributos, mas o redimensionamento ainda foi bem-sucedido
- Quantidade VB:
umount /target
De volta ao Console AWS: Desconecte VB da instância C e também desconecte VA de A.
Anexe o novo volume dimensionado (VB) à instância como: "/dev/xvda"
Instância de inicialização A, agora seu dispositivo raiz tem 10 GB :)
Exclua as instâncias B e C e também todos os volumes, exceto VB, que agora é o volume raiz da instância A.
Responder2
No console AWS:
Pare a instância que você deseja redimensionar
Crie um instantâneo do volume ativo e, em seguida, crie um volume "SSD de uso geral" a partir desse instantâneo.
Crie outro volume "SSD de uso geral" no tamanho desejado.
Anexe esses três 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 do instantâneo do volume ativo.
Inicie a instância.
Faça logon na nova instância via SSH.
crie estes novos diretórios:
mkdir /source /target
- crie um sistema de arquivos ext4 no novo volume:
mkfs.ext4 /dev/xvdf
- monte-o neste diretório:
mount -t ext4 /dev/xvdf /target
- 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 /
- monte o volume criado a partir do snapshot:
mount -t ext4 /dev/xvdg /source
- 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 atributos, mas o redimensionamento ainda foi bem-sucedido
- Desmontar os sistemas de arquivos:
umount /target
umount /source
De volta ao Console AWS: interrompa a instância e desconecte todos os volumes.
Anexe o novo volume dimensionado à instância como: "/dev/sda1"
Inicie a instância e ela deverá inicializar.
O PASSO 10 É IMPORTANTE: Rotule o novo volume com "e2label" conforme mencionado acima, ou a instância parecerá inicializar no aws, mas não passará na verificação de conexão.
Responder3
1. Crie um novo volume ebs e anexe-o à instância.
Crie um novo volume EBS. Por exemplo, se você originalmente tinha 20G e deseja reduzi-lo para 8G, crie um novo volume EBS de 8G, certifique-se de estar na mesma zona de disponibilidade. Anexe-o à instância da qual você precisa reduzir a partição raiz.
2. Particione, formate e sincronize arquivos no volume ebs recém-criado.
(1. Verifique a situação da partiçãoPrimeiro usamos o comando sudo parted -l
para verificar as informações da partição do volume original:
[root@ip-172-31-16-92 conf.d]# sudo parted -l
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 20G
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bbp bios_grub
2 2097kB 20480MB 24G xfs root
Pode-se ver que este volume do dispositivo raiz de 20G é dividido em duas partições, uma é chamada bbp e a outra é raiz. Não há sistema de arquivos na partição bbp, mas há um sinalizador chamado bios_grub, que mostra que este sistema é inicializado pelo grub. Além disso, mostra que o volume raiz é particionado usando gpt. Quanto ao que é bios_grub, na verdade é a partição de inicialização do BIOS. A referência é a seguinte:
https://en.wikipedia.org/wiki/BIOS_boot_partition https://www.cnblogs.com/f-ck-need-u/p/7084627.html
Isso tem cerca de 1 MB e há uma partição chamada root na qual precisamos nos concentrar. Esta partição armazena todos os arquivos do sistema original. Então, a ideia do backup é transferir arquivos desta partição para outra partição menor no novo volume ebs.
(2 Useparted
para particionar e formatar o novo volume ebs.
Use lsblk
para listar o bloco:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
O novo volume ebs é o dispositivo nvme1n1 e precisamos particioná-lo.
~# parted /dev/nvme1n1
GNU Parted 3.2
Using /dev/xvdg
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt #Using the gpt layout would take up the first 1024 sectors
(parted) mkpart bbp 1MB 2MB # Since the first 1024 sectors are used, the start address here is 1024kb or 1MB, and bbp is the partition name, that is, BIOS boot partition, which needs to take up 1MB, so the end address is 2MB
(parted) set 1 bios_grub on #Set partition 1 as BIOS boot partition
(parted) mkpart root xfs 2MB 100% #allocate the remaining space (2MB to 100%) to the root partition.
Após o particionamento, use lsblk
novamente, podemos ver
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
├─nvme1n1p1 270:1 0 1M 0 part
└─nvme1n1p2 270:2 0 8G 0 part /
Você pode ver que existem mais duas partições, nvme1n1p1 e nvme1n1p2, onde nvme1n1p2 é nossa nova partição raiz. Use o seguinte comando para formatar a partição:
mkfs.xfs /dev/nvme1n1p2
Após a formatação, precisamos montar a partição, por exemplo, montamos em /mnt/myroot.
mkdir -p /mnt/myroot
mount /dev/nvme1n1p2 /mnt/myroot
(3 Use rsync para transferir todo o conteúdo para a partição raiz correspondente do novo volume.
sudo rsync -axv / /mnt/myroot/
Observe que o parâmetro acima -x
é muito importante, porque serve para fazer backup do diretório raiz da instância atual. Portanto, se você não adicionar este parâmetro, ele fará o backup do próprio /mnt/myroot para /mnt/myroot e cairá em um loop infinito. (O parâmetro –exclude também está ok) O comando rsync é diferente do comando cp. O comando cp será sobrescrito, enquanto o rsync é um backup incremental síncrono. Isso economizaria muito tempo. Tome um café e aguarde a conclusão da sincronização.
3.Substitua o uuid no arquivo correspondente.
Como o volume mudou, o UUID do volume também mudou. Precisamos substituir o uuid nos arquivos de inicialização. Os dois arquivos a seguir precisam ser modificados:
/boot/grub2/grub.cfg #or /boot/grub/grub.cfg
/etc/fstab
Então, o que precisa ser mudado? Primeiro, você precisa listar o uuid do volume relevante através do blkid:
[root@ip-172-31-16-92 boot]# sudo blkid
/dev/nvme0n1p2: LABEL="/" UUID="add39d87-732e-4e76-9ad7-40a00dbb04e5" TYPE="xfs" PARTLABEL="Linux" PARTUUID="47de1259-f7c2-470b-b49b-5e054f378a95"
/dev/nvme1n1p2: UUID="566a022f-4cda-4a8a-8319-29344c538da9" TYPE="xfs" PARTLABEL="root" PARTUUID="581a7135-b164-4e9a-8ac4-a8a17db65bef"
/dev/nvme0n1: PTUUID="33e98a7e-ccdf-4af7-8a35-da18e704cdd4" PTTYPE="gpt"
/dev/nvme0n1p1: PARTLABEL="BIOS Boot Partition" PARTUUID="430fb5f4-e6d9-4c53-b89f-117c8989b982"
/dev/nvme1n1: PTUUID="0dc70bf8-b8a8-405c-93e1-71c3b8a887c7" PTTYPE="gpt"
/dev/nvme1n1p1: PARTLABEL="bbp" PARTUUID="82075e65-ae7c-4a90-90a1-ea1a82a52f93"
Você pode ver que o uuid da partição raiz do antigo volume grande do EBS é add39d87-732e-4e76-9ad7-40a00dbb04e5
, e o uuid do novo volume pequeno do EBS é 566a022f-4cda-4a8a-8319-29344c538da9
. Use o comando sed para substituí-lo:
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /boot/grub2/grub.cfg
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /etc/fstab
Claro, você também pode tentar gerar manualmente arquivos grub usando grub-install
(Em alguns sistemas grub2-install
) aqui apenas por conveniência.
4.Desconecte dois volumes e reconecte o novo volume pequeno.
Em seguida, use umount
para desmontar o novo volume ebs:
umount /mnt/myroot/
Se for solicitado, o destino está ocupado. Você pode usar fuser -mv /mnt/myroot
para ver qual processo está funcionando nele. O que encontrei é o bash, o que significa que você precisa sair deste diretório no bash. Use cd
para retornar ao diretório inicial e digite o comando acima novamente para desmontar.
Em seguida, desconecte os dois volumes (interrompa a instância primeiro, é claro) e anexe novamente o novo volume como o dispositivo raiz, preenchendo o nome do dispositivo aqui. /dev/xvda
como mostrado abaixo
Em seguida, inicie a instância. Se o ssh falhar, você pode usar os seguintes métodos para depurar:
1. obtenha o log do sistema
Referência:
1.https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#InitialSteps
2.https://www.daniloaz.com/en/partitioning-and-resizing-the-ebs-root-volume-of-an-aws-ec2-instance/
3.https://medium.com/@m.yunan.helmy/decrease-the-size-of-ebs-volume-in-your-ec2-instance-ea326e951bce
Responder4
O artigo abaixo é um tutorial bom e direto sobre como diminuir o tamanho do volume do EBS. Possui um guia passo a passo fácil de seguir e capturas de tela.