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

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

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

  1. 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.
  2. 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:

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

  2. 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.

  3. 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.

  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, 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/xvdf1nã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 ppara criar 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 saia.

vii) Verifique se você tem a /dev/xvdf1partiçã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.

  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 em /source:

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 atributos, mas o redimensionamento ainda foi bem-sucedido

  1. Quantidade VB:

umount /target

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

  2. Anexe o novo volume dimensionado (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 VB, que agora é o volume raiz da instância A.

Responder2

No console AWS:

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

  2. Crie um instantâneo do volume ativo e, em seguida, crie um volume "SSD de uso geral" a partir desse instantâneo.

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

  4. 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.
  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 deveria ser, neste caso o rótulo é: "/"

e2label /dev/xvdf /

  1. monte o volume criado a partir do snapshot:

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 atributos, mas o redimensionamento ainda foi bem-sucedido

  1. Desmontar os sistemas de arquivos:

umount /target
umount /source

  1. De volta ao Console AWS: interrompa a instância e desconecte 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" 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ção

Primeiro usamos o comando sudo parted -lpara 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 Use partedpara particionar e formatar o novo volume ebs.

Use lsblkpara 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 lsblknovamente, 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 umountpara desmontar o novo volume ebs:

umount /mnt/myroot/ 

Se for solicitado, o destino está ocupado. Você pode usar fuser -mv /mnt/myrootpara ver qual processo está funcionando nele. O que encontrei é o bash, o que significa que você precisa sair deste diretório no bash. Use cdpara 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/xvdacomo 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

2. obter captura de tela

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.

Diminua o tamanho do volume EBS em sua instância EC2

informação relacionada