Come ridurre la dimensione del volume di root EBS AWS?


16

Ingrandire un'istanza EC2 è facile come un respiro (ad esempio, creare un'AMI, avviare un'istanza da essa e quindi modificare le dimensioni di archiviazione).

Ma ridurlo diventa più difficile. Vorrei ridurre le dimensioni del volume di root di un'istanza EC2 di Amazon Web Services (AWS) Elastic Block Store (EBS). Ci sono un paio di vecchie procedure di alto livello in rete. La versione più dettagliata che ho trovato è una risposta di un anno su una domanda StackOverflow: come posso ridurre la capacità del mio volume ebs , i passaggi hanno un livello piuttosto alto:

Creare un nuovo volume EBS delle dimensioni desiderate (ad es. / Dev / xvdg)

Avviare un'istanza e collegarvi entrambi i volumi EBS

Controllare il file system (del volume radice originale): (es.) E2fsck -f / dev / xvda1

Riduci al massimo il volume di root originale: (es. Ext2 / 3/4) resize2fs -M -p / dev / xvda1

Copia i dati con dd:

  • Scegli una dimensione del pezzo (mi piacciono i 16 MB)

  • Calcola il numero di blocchi (usando il numero di blocchi dall'uscita resize2fs): blocchi * 4 / (chunk_size_in_mb * 1024) - arrotondare un po 'per sicurezza

  • Copia i dati: (es.) Dd if = / dev / xvda1 ibs = 16M di = / dev / xvdg obs = 16M count = 80

Ridimensiona il filesystem sul nuovo (più piccolo) volume EBS: (es.) Resize2fs -p / dev / xvdg

Controllare il file system (del volume radice originale): (es.) E2fsck -f / dev / xvdg

Scollega il tuo nuovo volume root EBS e collegalo all'istanza originale

Non riesco a trovare una soluzione dettagliata "passo dopo passo".

Il mio volume di root EBS è collegato a un'istanza HVM Ubuntu.

Qualsiasi aiuto sarebbe molto apprezzato.


Sembra una soluzione "how to" graduale.
Ceejayoz,

dd - copia da disco a disco dd se = / dev / xvdf di = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Risposte:


6

Nella console AWS:

  1. Ferma l'istanza che desideri ridimensionare

  2. Creare un'istantanea del volume attivo e quindi creare un volume "SSD per uso generico" da quella istantanea.

  3. Creare un altro volume "SSD per uso generico" nella dimensione desiderata.

  4. Collega questi 3 volumi all'istanza come:

    • / dev / sda1 per il volume attivo.
    • / dev / xvdf per il volume di dimensioni target.
    • / dev / xvdg per il volume creato dall'istantanea del volume attivo.
  5. Avvia l'istanza.

  6. Accedere alla nuova istanza tramite SSH.

  7. creare queste nuove directory:

mkdir /source /target

  1. crea un filesystem ext4 sul nuovo volume:

mkfs.ext4 /dev/xvdf

  1. montalo su questa directory:

mount -t ext4 /dev/xvdf /target

  1. Questo è molto importante, il file system ha bisogno di un e2label affinché Linux lo riconosca e lo avvii, usa "e2label / dev / xvda1" su un'istanza attiva per vedere cosa dovrebbe essere, in questo caso l'etichetta è: "/"

e2label /dev/xvdf /

  1. montare il volume creato dall'istantanea:

mount -t ext4 /dev/xvdg /source

  1. Copia il contenuto:

rsync -ax /source/ /target

Nota: non è presente "/" seguito "/ target". Inoltre, potrebbero esserci alcuni errori su symlink e attrs, ma il ridimensionamento ha avuto ancora successo

  1. Smonta i file system:

umount /target
umount /source

  1. Torna in AWS Console: arresta l'istanza e scollega tutti i volumi.

  2. Collega il volume di nuova dimensione all'istanza come: "/ dev / sda1"

  3. Avviare l'istanza e dovrebbe avviarsi.

IL PASSAGGIO 10 È IMPORTANTE : etichettare il nuovo volume con "e2label" come menzionato sopra, altrimenti l'istanza sembrerà avviarsi in aws ma non passerà il controllo della connessione.


9
Ho eseguito questi passaggi più volte (Ubuntu 14.04) e ogni volta che allego il nuovo volume, l'istanza si ferma. Qualcun altro ha avuto questo problema? Questo mi sta tormentando il cervello!
thiesdiggity,

2
Non sei l'unico. Ho provato questa e altre soluzioni e, come il tuo buon sé, anche la mia istanza si spegne.
Blairmeister,

1
@blairmeister Ho avuto lo stesso problema, ma sono riuscito a farlo funzionare! Dai un'occhiata alla mia risposta qui sotto se sei ancora bloccato :)
Ruben Serrate

il mio e2label è cloudimg-rootfs ... seguendo tutti questi passaggi posso confermare su Ubuntu 14.04 non funziona
NineCattoRules

1
Sto ridimensionando questa risposta in quanto non copre abbastanza casi d'uso per un volume (come un volume di avvio) per proteggere gli utenti da danni involontari.
Jesse Adelman,

6

Nessuna delle altre soluzioni funzionerà se il volume viene utilizzato come dispositivo root (avviabile).

Nel disco appena creato manca la partizione di avvio, quindi dovrebbe avere GRUB installato e alcuni flag impostati correttamente prima che un'istanza possa utilizzarlo come volume di root.

La mia (ad oggi, funzionante ) soluzione per ridurre un volume di root è:

Sfondo: abbiamo un'istanza A, il cui volume principale vogliamo ridurre. Chiamiamo questo volume VA. Vogliamo ridurre VA da 30 GB per dire 10 GB

  1. Crea una nuova istanza ec2, B, con lo stesso sistema operativo dell'istanza A. Come memoria, scegli un volume dello stesso tipo di VA, ma con una dimensione di 10 GB. (o qualunque sia la tua dimensione target). Quindi ora abbiamo un'istanza B che utilizza questo nuovo volume (chiamiamolo VB) come volume di root.
  2. Una volta che la nuova istanza (B) è in esecuzione. Fermalo e scollega il suo volume di root (VB).

NOTA: I seguenti passaggi sono principalmente presi dalla soluzione di @bill:

  1. Interrompere l'istanza che si desidera ridimensionare (A).

  2. Creare un'istantanea del volume VA e quindi creare un volume "SSD per uso generico" da quella istantanea. Questo volume lo chiameremo VASNAP.

  3. Gira una nuova istanza con Amazon Linux, chiameremo questa istanza C. Utilizzeremo solo questa istanza per copiare il contenuto di VASNAP su VB. Probabilmente potremmo anche usare l'istanza A per fare questi passaggi, ma preferisco farlo in una macchina indipendente.

  4. Collegare i seguenti volumi all'istanza C. / dev / xvdf per VB. / dev / xvdg per VASNAP.

  5. Riavvia l'istanza C.

  6. Accedere all'istanza C tramite SSH.

  7. Crea queste nuove directory:

mkdir /source /target

  1. Formatta la partizione principale di VB con un filesystem ext4:

mkfs.ext4 /dev/xvdf1

Se non si ottengono errori, passare al punto 11. Altrimenti, in caso contrario /dev/xvdf1, è necessario creare la partizione procedendo come segue:

i) Se /dev/xvdf1non esiste per qualsiasi motivo, è necessario crearlo. Prima inserisci:

sudo fdisk /dev/xvdf.

ii) Pulisci il disco inserendo: wipefs

iii) Crea una nuova partizione inserendo: n

iv) Invio pper creare la partizione primaria

v) Continuare a premere invio per continuare con le impostazioni predefinite.

vi) Quando richiede di nuovo un comando, inserisci wper scrivere le modifiche ed esci.

vii) Verifica di avere la /dev/xvdf1partizione facendo: lsblk

Dovresti vedere qualcosa del tipo:

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

Ora vai al passaggio 11.

  1. Montalo su questa directory:

mount -t ext4 /dev/xvdf1 /target

  1. Questo è molto importante, il file system ha bisogno di un e2label per Linux per riconoscerlo e avviarlo, usare "e2label / dev / xvda1" su un'istanza attiva per vedere cosa dovrebbe essere, in questo caso l'etichetta è: "/"

e2label /dev/xvdf1 /

  1. Montare VASNAP su / sorgente:

mount -t ext4 /dev/xvdg1 /source

  1. Copia il contenuto:

rsync -vaxSHAX /source/ /target

Nota: non è presente "/" seguito "/ target". Inoltre, potrebbero esserci alcuni errori su symlink e attrs, ma il ridimensionamento ha avuto ancora successo

  1. Umount VB:

umount /target

  1. Di nuovo in AWS Console: Dettach VB dall'istanza C e anche dettach VA da A.

  2. Collegare il nuovo volume (VB) all'istanza come: "/ dev / xvda"

  3. Avvia l'istanza A, ora il suo dispositivo di root è 10 GB :)

  4. Elimina entrambe le istanze B e C e anche tutti i volumi tranne VB, che ora è il volume principale dell'istanza A.


Qual è il tuo sistema operativo?
NineCattoRules,

@NineCattoRules Amazon Linux
Ruben Serrate

Ho provato su Ubuntu 14.04 e non funziona
NineCattoRules

@NineCattoRules Ahi ... Posso confermare che funziona per Amazon Linux, ho dovuto farlo di recente.
Ruben Serrate,

1
Non dovremmo allegare il volume del passaggio 17 a /dev/sda1intstead di /dev/xvda@RubenSerrate?
alper l'

2

I seguenti passaggi hanno funzionato per me

Passaggio 1. Creare un'istantanea del volume di root ebs e creare un nuovo volume dall'istantanea (chiamiamo questo volume-copia)

Passaggio 2. Creare una nuova istanza con il volume radice ebs con la dimensione desiderata. (chiamiamo questo volume ridimensionato) Questo volume ebs avrà la partizione corretta per l'avvio. (La creazione di un nuovo volume ebs da zero non ha funzionato per me)

Passaggio 3. Allegare il ridimensionamento del volume e la copia del volume a un'istanza.

Passaggio 4. Formattare il ridimensionamento del volume.

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

Nota: assicurarsi che il volume della partizione /dev/xvdf1non sia inserito/dev/xvdf

Passaggio 5. Montare volume-ridimensiona e copia volume mkdir / mnt / copia mkdir / mnt / ridimensiona

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

Passaggio 6. Copia dei file

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

Passaggio 7. Assicurarsi che e2label sia uguale al volume di root

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

Passaggio 8. Aggiornare grub.conf su volume-copy in modo che corrisponda al nuovo volume udid

Cerca e sostituisci uudid in /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"

Passaggio 9. Smontare i volumi

Passaggio 10. Collegare il nuovo volume ebs ridimensionato all'istanza / dev / sda1


1
La combinazione di risposta @ruben serrate con l'aggiornamento UUID grub è ciò che ha funzionato per me.
Jonathan Maim,

Piccola nota come ho appena perso un po 'di tempo: l'esecuzione blkidsenza sudorestituire i risultati memorizzati nella cache senza convalidarli. Quindi sembrerà che l'UUID non sia cambiato.
Akhil Nair,

0

Ecco un approccio alternativo;

Collega e monta il vecchio volume EBS su un'istanza EC2 in esecuzione. Se si desidera copiare un volume di avvio, è consigliabile farlo su un'istanza diversa, con il vecchio volume montato come dati, non con il volume utilizzato come sistema live.

Creare un nuovo volume EBS della dimensione desiderata.

Collega il nuovo volume all'istanza e formatta (con attenzione) un nuovo filesystem su di esso (ad es. Usando mkfs). Montalo.

Copia il vecchio contenuto del filesystem dal vecchio volume al nuovo volume:

rsync -vaxSHAX /oldvol/ /newvol/

Smonta il nuovo volume e staccalo dall'istanza.

Se stavi copiando il filesystem di root, allora:

Creare un'istantanea EBS del nuovo volume.

Registrare l'istantanea come una nuova AMI.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.