..png)
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
- 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.
- 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:
Detenga la instancia cuyo tamaño desea cambiar (A).
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.
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.
Adjunte los siguientes volúmenes a la instancia C. /dev/xvdf para VB. /dev/xvdg para VASNAP.
Reinicie la instancia C.
Inicie sesión en la instancia C a través de SSH.
Cree estos nuevos directorios:
mkdir /source /target
- 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/xvdf1
no 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 p
para crear la partición primaria
v) Siga presionando Intro para continuar con la configuración predeterminada.
vi) Cuando vuelva a solicitar un comando, ingrese w
para escribir los cambios y salga.
vii) Verifique que tenga la /dev/xvdf1
partició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.
- Móntelo en este directorio:
mount -t ext4 /dev/xvdf1 /target
- 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 /
- Monte VASNAP en/fuente:
mount -t ext4 /dev/xvdg1 /source
- 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.
- Desmontar VB:
umount /target
De vuelta en la consola de AWS: desconecte VB de la instancia C y también desconecte VA de A.
Adjunte el volumen de nuevo tamaño (VB) a la instancia como: "/dev/xvda"
Arranque la instancia A, ahora su dispositivo raíz tiene 10 GB :)
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:
Detenga la instancia cuyo tamaño desea cambiar
Cree una instantánea del volumen activo y luego cree un volumen "SSD de uso general" a partir de esa instantánea.
Cree otro volumen "SSD de uso general" del tamaño que desee.
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.
Inicie la instancia.
Inicie sesión en la nueva instancia a través de SSH.
cree estos nuevos directorios:
mkdir /source /target
- cree un sistema de archivos ext4 en un nuevo volumen:
mkfs.ext4 /dev/xvdf
- montarlo en este directorio:
mount -t ext4 /dev/xvdf /target
- 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 /
- monte el volumen creado a partir de la instantánea:
mount -t ext4 /dev/xvdg /source
- 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.
- Desmonte los sistemas de archivos:
umount /target
umount /source
De vuelta en la consola de AWS: detenga la instancia y desconecte todos los volúmenes.
Adjunte el volumen de nuevo tamaño a la instancia como: "/dev/sda1"
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ónPrimero usamos el comando sudo parted -l
para 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 lsblk
para 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 lsblk
nuevamente, 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 -x
es 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 umount
para desmontar el nuevo volumen ebs:
umount /mnt/myroot/
Si le indica que el objetivo está ocupado. Puede utilizar fuser -mv /mnt/myroot
para ver qué proceso está funcionando en él. Lo que encontré es bash, lo que significa que debes salir de este directorio en bash. Úselo cd
para 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/xvda
Como 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
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.