Ninguna de las otras soluciones funcionará si el volumen se utiliza como dispositivo raíz (de arranque).

Ninguna de las otras soluciones funcionará si el volumen se utiliza como dispositivo raíz (de arranque).

Ampliar una instancia EC2 es muy fácil (por ejemplo, cree una AMI, inicie una instancia desde ella y luego cambie el tamaño de almacenamiento).

Pero reducirlo se vuelve más difícil. Me gustaría reducir el tamaño del volumen raíz de una instancia EC2 de Amazon Web Services (AWS) Elastic Block Store (EBS). Hay un par de procedimientos antiguos de alto nivel en la red. La versión más detallada que encontré es una respuesta de hace un año a una pregunta de StackOverflow:¿Cómo puedo reducir la capacidad de volumen de mi ebs?, los pasos tienen un nivel bastante alto:

Cree un nuevo volumen de EBS que tenga el tamaño deseado (por ejemplo, /dev/xvdg)

Inicie una instancia y adjunte ambos volúmenes de EBS.

Verifique el sistema de archivos (del volumen raíz original): (por ejemplo) e2fsck -f /dev/xvda1

Reducir al máximo el volumen raíz original: (por ejemplo, ext2/3/4) resize2fs -M -p /dev/xvda1

Copie los datos con dd:

  • Elija un tamaño de fragmento (me gustan 16 MB)

  • Calcule la cantidad de fragmentos (usando la cantidad de bloques de la salida de resize2fs): bloques*4/(chunk_size_in_mb*1024) - redondee un poco por seguridad

  • Copie los datos: (por ejemplo) dd if=/dev/xvda1 ibs=16M of=/dev/xvdg obs=16M count=80

Cambie el tamaño del sistema de archivos en el nuevo volumen EBS (más pequeño): (por ejemplo) resize2fs -p /dev/xvdg

Verifique el sistema de archivos (del volumen raíz original): (por ejemplo) e2fsck -f /dev/xvdg

Separe su nuevo volumen raíz de EBS y conéctelo a su instancia original

No puedo encontrar una solución detallada paso a paso.

Mi volumen raíz de EBS está conectado a una instancia HVM de Ubuntu.

Cualquier ayuda sería realmente apreciada.

Respuesta1

Ninguna de las otras soluciones funcionará si el volumen se utiliza como dispositivo raíz (de arranque).

Al disco recién creado le falta la partición de inicio, por lo que sería necesario tener GRUB instalado y algunos indicadores configurados correctamente antes de que una instancia pueda usarlo como volumen raíz.

Mi (a partir de hoy,laboral) la solución para reducir el volumen de una raíz es:

Fondo:Tenemos una instancia A, cuyo volumen raíz queremos reducir. Llamemos a este volumen VA. Queremos reducir VA de 30 GB a, digamos, 10 GB

  1. Cree una nueva instancia ec2, B, con el mismo sistema operativo que la instancia A. Además, los núcleos deben coincidir para actualizar o degradar según sea necesario. Como almacenamiento, elija un volumen del mismo tipo que VA, pero con un tamaño de 10 GB. (o cualquiera que sea su tamaño objetivo). Ahora tenemos una instancia B que usa este nuevo volumen (llamémoslo VB) como volumen raíz.
  2. Una vez que se esté ejecutando la nueva instancia (B). Deténgalo y separe su volumen raíz (VB).

NOTA: Los siguientes pasos se toman principalmente de la solución de @bill:

  1. Detenga la instancia cuyo tamaño desea cambiar (A).

  2. Cree una instantánea del volumen VA y luego cree un volumen "SSD de uso general" a partir de esa instantánea. Este volumen lo llamaremos VASNAP.

  3. Haga girar una nueva instancia con amazon Linux, la llamaremos instancia C. Solo usaremos esta instancia para copiar el contenido de VASNAP a VB. Probablemente también podríamos usar la instancia A para realizar estos pasos, pero prefiero hacerlo en una máquina independiente.

  4. Adjunte los siguientes volúmenes a la instancia C. /dev/xvdf para VB. /dev/xvdg para VASNAP.

  5. Reinicie la instancia C.

  6. Inicie sesión en la instancia C a través de SSH.

  7. Cree estos nuevos directorios:

mkdir /source /target

  1. Formatee la partición principal de VB con un sistema de archivos ext4:

mkfs.ext4 /dev/xvdf1

Si no obtiene errores, continúe con el Paso 11. De lo contrario, si no tiene /dev/xvdf1, deberá crear la partición haciendo lo siguiente i-vii:

i) Si /dev/xvdf1no existe por cualquier motivo, es necesario crearlo. Primero ingresa:

sudo fdisk /dev/xvdf.

ii) Limpie el disco ingresando: wipefs

iii) Cree una nueva partición ingresando: n

iv) Ingrese ppara crear la partición primaria

v) Siga presionando Intro para continuar con la configuración predeterminada.

vi) Cuando vuelva a solicitar un comando, ingrese wpara escribir los cambios y salga.

vii) Verifique que tenga la /dev/xvdf1partición haciendo: lsblk

Deberías 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

Ahora continúe con el Paso 11.

  1. Móntelo en este directorio:

mount -t ext4 /dev/xvdf1 /target

  1. Esto es muy importante, el sistema de archivos necesita una e2label para que Linux lo reconozca y lo inicie, use "e2label /dev/xvda1" en una instancia activa para ver cuál debería ser, en este caso la etiqueta es: "/"

e2label /dev/xvdf1 /

  1. Monte VASNAP en/fuente:

mount -t ext4 /dev/xvdg1 /source

  1. Copia el contenido:

rsync -vaxSHAX /source/ /target

Nota: no hay "/" después de "/target". Además, puede haber algunos errores sobre enlaces simbólicos y atributos, pero el cambio de tamaño aún se realizó correctamente.

  1. Desmontar VB:

umount /target

  1. De vuelta en la consola de AWS: desconecte VB de la instancia C y también desconecte VA de A.

  2. Adjunte el volumen de nuevo tamaño (VB) a la instancia como: "/dev/xvda"

  3. Arranque la instancia A, ahora su dispositivo raíz tiene 10 GB :)

  4. Elimine las instancias B y C, y también todos los volúmenes excepto VB, que ahora es el volumen raíz de la instancia A.

Respuesta2

En la consola de AWS:

  1. Detenga la instancia cuyo tamaño desea cambiar

  2. Cree una instantánea del volumen activo y luego cree un volumen "SSD de uso general" a partir de esa instantánea.

  3. Cree otro volumen "SSD de uso general" del tamaño que desee.

  4. Adjunte estos 3 volúmenes a la instancia como:

    • /dev/sda1 para el volumen activo.
    • /dev/xvdf para el volumen que tiene el tamaño objetivo.
    • /dev/xvdg para el volumen creado a partir de la instantánea del volumen activo.
  5. Inicie la instancia.

  6. Inicie sesión en la nueva instancia a través de SSH.

  7. cree estos nuevos directorios:

mkdir /source /target

  1. cree un sistema de archivos ext4 en un nuevo volumen:

mkfs.ext4 /dev/xvdf

  1. montarlo en este directorio:

mount -t ext4 /dev/xvdf /target

  1. Esto es muy importante, el sistema de archivos necesita una etiqueta e2label para que Linux lo reconozca y lo inicie, use "e2label /dev/xvda1" en una instancia activa para ver cuál debería ser, en este caso la etiqueta es: "/"

e2label /dev/xvdf /

  1. monte el volumen creado a partir de la instantánea:

mount -t ext4 /dev/xvdg /source

  1. Copia el contenido:

rsync -ax /source/ /target

Nota: no hay "/" después de "/target". Además, puede haber algunos errores sobre enlaces simbólicos y atributos, pero el cambio de tamaño aún se realizó correctamente.

  1. Desmonte los sistemas de archivos:

umount /target
umount /source

  1. De vuelta en la consola de AWS: detenga la instancia y desconecte todos los volúmenes.

  2. Adjunte el volumen de nuevo tamaño a la instancia como: "/dev/sda1"

  3. Inicie la instancia y debería iniciarse.

EL PASO 10 ES IMPORTANTE: Etiquete el nuevo volumen con "e2label" como se mencionó anteriormente, o la instancia parecerá arrancar en aws pero no pasará la verificación de conexión.

Respuesta3

1. Cree un nuevo volumen ebs y adjúntelo a la instancia.

Cree un nuevo volumen de EBS. Por ejemplo, si originalmente tenía 20G y desea reducirlo a 8G, cree un nuevo volumen de EBS de 8G, asegúrese de estar en la misma zona de disponibilidad. Adjúntelo a la instancia cuya partición raíz necesita reducir.

2. Particione, formatee y sincronice archivos en el volumen ebs recién creado.

(1. Verifique la situación de la partición

Primero usamos el comando sudo parted -lpara verificar la información de la partición del volumen 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

Se puede ver que este volumen de dispositivo raíz de 20G está dividido en dos particiones, una se llama bbp y la otra es raíz. No hay ningún sistema de archivos en la partición bbp, pero hay un indicador llamado bios_grub, que muestra que este sistema se inicia mediante grub. Además, muestra que el volumen raíz está particionado usando gpt. En cuanto a qué es bios_grub, en realidad es la partición de arranque del BIOS. La referencia es la siguiente:

https://en.wikipedia.org/wiki/BIOS_boot_partition https://www.cnblogs.com/f-ck-need-u/p/7084627.html

Esto es aproximadamente 1 MB y hay una partición llamada raíz en la que debemos centrarnos. Esta partición almacena todos los archivos del sistema original. Entonces, la idea de la copia de seguridad es transferir archivos de esta partición a otra partición más pequeña en el nuevo volumen ebs.

(2 usoparted para particionar y formatear el nuevo volumen ebs.

Utilice lsblkpara enumerar el bloque:

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 

El nuevo volumen ebs es el dispositivo nvme1n1 y necesitamos particionarlo.

~# 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.


Después de particionar, usarlo lsblknuevamente, 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 /

Puede ver que hay dos particiones más, nvme1n1p1 y nvme1n1p2, donde nvme1n1p2 es nuestra nueva partición raíz. Utilice el siguiente comando para formatear la partición:

mkfs.xfs /dev/nvme1n1p2

Después de formatear, necesitamos montar la partición, por ejemplo, la montamos en /mnt/myroot.

mkdir -p /mnt/myroot
mount /dev/nvme1n1p2 /mnt/myroot
(3 Utilice rsync para transferir todo el contenido a la partición raíz correspondiente del nuevo volumen.
sudo rsync -axv / /mnt/myroot/ 

Tenga en cuenta que el parámetro anterior -xes muy importante, porque sirve para realizar una copia de seguridad del directorio raíz de la instancia actual. Por lo tanto, si no agrega este parámetro, realizará una copia de seguridad de /mnt/myroot en /mnt/myroot y caerá en un bucle sin fin. (El parámetro –excluir también está bien) El comando rsync es diferente del comando cp. El comando cp se sobrescribirá, mientras que rsync es una copia de seguridad incremental sincrónica. Ahorraría mucho tiempo. Toma un café y espera a que se complete la sincronización.

3.Reemplace el uuid en el archivo correspondiente.

Debido a que el volumen ha cambiado, el uuid del volumen también cambia. Necesitamos reemplazar el uuid en los archivos de arranque. Es necesario modificar los dos archivos siguientes:

/boot/grub2/grub.cfg #or /boot/grub/grub.cfg
/etc/fstab

Entonces, ¿qué es necesario cambiar? Primero, debe enumerar el uuid del volumen relevante a través de 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"

Puede ver que el uuid de la partición raíz del antiguo volumen grande de EBS es add39d87-732e-4e76-9ad7-40a00dbb04e5, y el uuid del nuevo volumen pequeño de EBS es 566a022f-4cda-4a8a-8319-29344c538da9. Utilice el comando sed para reemplazarlo:

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

Por supuesto, también puede intentar generar archivos grub manualmente usando grub-install(en algunos sistemas están grub2-install) aquí solo por conveniencia.

4.Separe dos volúmenes y luego vuelva a colocar el nuevo volumen pequeño.

Luego use umountpara desmontar el nuevo volumen ebs:

umount /mnt/myroot/ 

Si le indica que el objetivo está ocupado. Puede utilizar fuser -mv /mnt/myrootpara ver qué proceso está funcionando en él. Lo que encontré es bash, lo que significa que debes salir de este directorio en bash. Úselo cdpara regresar al directorio de inicio e ingrese el comando anterior nuevamente para desmontar.

Luego, separe los dos volúmenes (detenga la instancia primero, por supuesto) y vuelva a conectar el nuevo volumen como dispositivo raíz ingresando el nombre del dispositivo aquí. /dev/xvdaComo se muestra abajo

Luego inicie la instancia. Si falla el ssh, puede utilizar los siguientes métodos para depurar:

1. obtener el registro del sistema

2.obtener captura de pantalla

Referencia:

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

Respuesta4

El siguiente artículo es un tutorial bueno y sencillo sobre cómo disminuir el tamaño del volumen de EBS. Tiene una guía paso a paso fácil de seguir y capturas de pantalla.

Disminuya el tamaño del volumen de EBS en su instancia EC2

información relacionada