¿Cómo reducir el tamaño del volumen raíz de AWS EBS?

16

Ampliar una instancia de EC2 es fácil como una respiración (por ejemplo, crear una AMI, iniciar una instancia desde ella y luego cambiar el tamaño de almacenamiento).

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

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

Inicie una instancia y adjúntele ambos volúmenes EBS

Compruebe el sistema de archivos (del volumen raíz original): (p. Ej.) E2fsck -f / dev / xvda1

Reduzca 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 el número de fragmentos (utilizando el número de bloques de la salida resize2fs): blocks * 4 / (chunk_size_in_mb * 1024): redondee un poco por seguridad

  • Copie los datos: (p. Ej.) Dd if = / dev / xvda1 ibs = 16M of = / dev / xvdg obs = 16M count = 80

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

Compruebe el sistema de archivos (del volumen raíz original): (p. Ej.) E2fsck -f / dev / xvdg

Separe su nuevo volumen raíz de EBS y adjúntelo a su instancia original

No puedo encontrar una solución detallada "cómo" paso a paso.

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

Cualquier ayuda sería muy apreciada.

herve
fuente
Parece una muy buena solución paso a paso de "cómo hacerlo".
ceejayoz
dd: copia de disco a disco dd if = / dev / xvdf of = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Respuestas:

6

En la consola de AWS:

  1. Detenga la instancia que desea cambiar de tamaño

  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 propósito general" al 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 es el tamaño de destino.
    • / dev / xvdg para el volumen realizado a partir de la instantánea del volumen activo.
  5. Inicia 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 e2 para que Linux lo reconozca y arranque, 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. Montar el volumen creado a partir de la instantánea:

mount -t ext4 /dev/xvdg /source

  1. Copia los contenidos:

rsync -ax /source/ /target

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

  1. Desmontar los sistemas de archivos:

umount /target
umount /source

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

  2. Adjunte el nuevo volumen de 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.

cuenta
fuente
99
He seguido estos pasos varias veces (Ubuntu 14.04) y cada vez que adjunto el nuevo volumen, la instancia simplemente se detiene. ¿Cualquier otra persona que experimenta este problema? ¡Esto me está destrozando el cerebro!
thiesdiggity
2
No eres el único. He intentado esta y otras soluciones y, al igual que tú, mi instancia también se cierra.
blairmeister
1
@blairmeister ¡Tuve el mismo problema, pero logré que funcionara! Echa un vistazo a mi respuesta a continuación si todavía estás atrapado :)
Ruben Serrate
mi e2label es cloudimg-rootfs ... siguiendo todos estos pasos que puedo confirmar en Ubuntu 14.04 no funciona
NineCattoRules
1
Estoy rechazando esta respuesta, ya que no cubre suficientes casos de uso para un volumen (como un volumen de arranque) para proteger a los usuarios de daños involuntarios.
Jesse Adelman
6

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

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

Mi solución (a partir de hoy, trabajando ) para reducir un volumen raíz es:

Antecedentes: tenemos una instancia A, cuyo volumen raíz queremos reducir. Llamemos a este volumen VA. Queremos reducir el VA de 30 GB a 10 GB

  1. Cree una nueva instancia de ec2, B, con el mismo sistema operativo que la instancia A. Como almacenamiento, elija un volumen que sea del mismo tipo que VA, pero con un tamaño de 10 GB. (o cualquiera que sea su tamaño objetivo). Así que ahora tenemos una instancia B que usa este nuevo volumen (llamémoslo VB) como volumen raíz.
  2. Una vez que se ejecuta 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 que desea cambiar de tamaño (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. Gire una nueva instancia con amazon Linux, llamaremos a esta 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 los tiene /dev/xvdf1, debe crear la partición haciendo lo siguiente i-vii:

i) Si /dev/xvdf1no existe por alguna razón, debe crearlo. Primero ingrese:

sudo fdisk /dev/xvdf.

ii) Limpie el disco ingresando: wipefs

iii) Cree una nueva partición ingresando: n

iv) Ingrese ppara crear una partición primaria

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

vi) Cuando solicite un comando nuevamente, ingrese wpara escribir los cambios y salga.

vii) Verifique que tiene 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 proceda al Paso 11.

  1. Montarlo en este directorio:

mount -t ext4 /dev/xvdf1 /target

  1. Esto es muy importante, el sistema de archivos necesita una etiqueta e2 para que Linux lo reconozca y arranque, 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 los contenidos:

rsync -vaxSHAX /source/ /target

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

  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 nuevo volumen de tamaño (VB) a la instancia como: "/ dev / xvda"

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

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

Serrato de Rubén
fuente
¿Cuál es tu sistema operativo?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
Probé
@NineCattoRules Ouch ... Puedo confirmar que funciona para Amazon Linux, tuve que hacerlo recientemente.
Ruben Serrate
1
¿No deberíamos adjuntar el volumen en el paso 17 en /dev/sda1lugar de /dev/xvda@RubenSerrate?
alper
2

Los siguientes pasos me funcionaron

Paso 1. Cree una instantánea del volumen de ebs raíz y cree un nuevo volumen a partir de la instantánea (llamemos a esto copia de volumen)

Paso 2. Cree una nueva instancia con el volumen raíz de ebs con el tamaño deseado. (Llamemos a esto volumen redimensionado) Este volumen ebs tendrá la partición correcta para el arranque. (Crear un nuevo volumen de ebs desde cero no funcionó para mí)

Paso 3. Adjunte el cambio de tamaño y la copia de volumen a una instancia.

Paso 4. Formatee el cambio de tamaño del volumen.

sudo fdisk -l
    sudo mkfs -t ext4 /dev/xvdf1

Nota: asegúrese de que el volumen de la partición /dev/xvdf1no se ingrese/dev/xvdf

Paso 5. Monte el cambio de tamaño del volumen y la copia del volumen mkdir / mnt / copy mkdir / mnt / resize

sudo mount /dev/xvdh1 /mnt/copy
sudo mount /dev/xvdf1 /mnt/resize

Paso 6. Copie archivos

rsync -ax /mnt/copy/ /mnt/resize

Paso 7. Asegúrese de que e2label sea el mismo que el volumen raíz

sudo E2label /dev/xvdh1 > cloudimg-rootfs
sudo E2label /dev/xvdf1 cloudimg-rootfs

Paso 8. Actualice grub.conf en volume-copy para que coincida con el nuevo volumen udid

Busque y reemplace uudid en /boot/grub/grub.cfg

ubuntu@server:~/mnt$ sudo blkid
/dev/xvdh1: LABEL="cloudimg-rootfs" UUID="1d61c588-f8fc-47c9-bdf5-07ae1a00e9a3" TYPE="ext4"
/dev/xvdf1: LABEL="cloudimg-rootfs" UUID="78786e15-f45d-46f9-8524-ae04402d1116" TYPE="ext4"

Paso 9. Desmontar volúmenes

Paso 10. Adjunte un nuevo volumen ebs redimensionado a instancia / dev / sda1

DrewJaja
fuente
1
Combinar la respuesta de serrate de @ruben con la actualización grub de UUID es lo que funcionó para mí.
Jonathan Maim
Pequeña nota ya que acabo de perder algo de tiempo: Ejecutar blkidsin sudoretornos resultados en caché sin validarlos. Entonces parecerá que el UUID no ha cambiado.
Akhil Nair
0

Aquí hay un enfoque alternativo;

Adjunte y monte el antiguo volumen EBS en una instancia EC2 en ejecución. Si desea copiar un volumen de arranque, es mejor hacerlo en una instancia diferente, con el volumen anterior montado como datos, no con el volumen utilizado como un sistema en vivo.

Cree un nuevo volumen EBS del tamaño deseado.

Adjunte el nuevo volumen a la instancia y formatee (cuidadosamente) un nuevo sistema de archivos en él (por ejemplo, usando mkfs). Móntalo.

Copie el contenido del sistema de archivos anterior del volumen anterior al nuevo volumen:

rsync -vaxSHAX /oldvol/ /newvol/

Desmonta el nuevo volumen y sepáralo de la instancia.

Si estaba copiando el sistema de archivos raíz, entonces:

Cree una instantánea de EBS del nuevo volumen.

Registre la instantánea como una nueva AMI.

Eric Hammond
fuente