Riduzione delle dimensioni del volume di Amazon EBS


25

Ho visto questa risposta per i volumi in crescita di EBS , ma vorrei ridurne uno.

Le immagini predefinite di Ubuntu Server sono 15 GB mentre ho davvero bisogno solo di 2 GB max (utilizzo un volume diverso per i dati). C'è un modo per ridurre le dimensioni del volume?

Risposte:


27

Ho avuto la tua stessa domanda, quindi ho capito come farlo.

Innanzitutto, l'ho fatto dall'ami Ubuntu a 32 bit supportato da EBS della regione degli Stati Uniti orientali, altri sistemi operativi o immagini potrebbero funzionare in modo diverso. Tuttavia, sospetto che dovresti essere a posto, purché utilizzi un filesystem ext *. Potrebbe funzionare su altri filesystem, ma dovrai capire come ridimensionarli da soli.

I passaggi sono sostanzialmente:

  1. Collega due volumi a un'istanza in esecuzione, il primo basato sull'istantanea che desideri ridurre e il secondo un volume vuoto con le nuove dimensioni che desideri ridurre.

  2. Controllare il file system del primo volume e riparare eventuali errori.

  3. Riduci il file system sul primo volume in modo che sia grande solo quanto deve essere per contenere i dati.

  4. Copia il file system dal primo volume al secondo.

  5. Espandere il file system sul secondo volume alla dimensione massima.

  6. Assicurati che tutto appaia bene controllando il secondo volume per errori.

  7. Scatta un'istantanea del secondo volume.

  8. Crea un'immagine macchina in base all'istantanea del secondo volume appena acquisito.

Devi prima ottenere alcune informazioni dall'ami che vuoi ridurre. In particolare, sono necessari l'ID kernel e l'ID ramdisk, se presenti (l'immagine che ho ridotto non aveva un ramdisk). Tutte queste informazioni dovrebbero essere disponibili dalla console di gestione di aws, nella finestra AMI.

L'ID del kernel assomiglia a kia-xxxxxxxx e l'ID istantanea assomiglia a snap-xxxxxxxx e gli ID ramdisk assomigliano a RIA-xxxxxxxx.

Quindi, avvia un'istanza di Linux. Ho lanciato un'istanza di Ubuntu. Se lo desideri, puoi utilizzare un'istanza t1.micro. Non ci vuole molto potere per fare questi prossimi passi.

Dopo che la macchina è in esecuzione, allegare l'istantanea annotata dal primo passaggio. Nel mio caso, l'ho allegato a / dev / sdf

Quindi, crea un nuovo volume, con le dimensioni che desideri. Nel mio caso, ho creato un volume da 5 GB, in quanto è la dimensione che volevo ridurre. Non creare questo nuovo volume da un'istantanea. Abbiamo bisogno di un nuovo volume vuoto. Quindi, collegalo all'istanza corrente, nel mio caso l'ho collegato come / dev / sdg

Quindi, ssh nella macchina ma non montare i volumi collegati.

A questo punto, ho commesso un errore sul lato della paranoia e ho scelto di controllare il file system sul volume di grandi dimensioni, solo per assicurarmi che non ci fossero errori. Se sei sicuro che non ce ne siano, puoi saltare questo passaggio:

$ sudo e2fsck -f /dev/sdf

Successivamente, ho ridimensionato il file system sul volume di grandi dimensioni in modo che fosse grande solo quanto i dati sul disco:

$ sudo resize2fs -M -p /dev/sdf

-M lo riduce e -p stampa l'avanzamento.

Resize2fs dovrebbe dirti quanto è grande il filesystem shrunkin. Nel mio caso, mi ha dato la dimensione in blocchi 4K.

Copiamo ora il file system shrunkin sul nuovo disco. Coperemo i dati in blocchi da 16 MB, quindi dobbiamo capire quanti blocchi da 16 MB dobbiamo copiare. È qui che la dimensione del file system ridotta si rivela utile.

Nel mio caso, il file system ridotto era poco più di 1 GB, perché avevo installato molti altri programmi sul sistema Ubuntu di base prima di scattare un'istantanea. Probabilmente avrei potuto andarmene semplicemente copiando la dimensione del file system arrotondata ai 16 MB più vicini, ma volevo giocarci sul sicuro.

Quindi, 128 volte blocchi da 16 MB = 2 GB:

$ sudo dd if=/dev/sdf ibs=16M of=/dev/sdg obs=16M count=128

Ho copiato in blocchi di 16 MB perché con EBS paghi per ogni lettura e scrittura, quindi volevo minimizzare il numero di essi il più possibile. Non so se farlo in questo modo lo abbia fatto, ma probabilmente non ha fatto male.

Dobbiamo quindi ridimensionare il file system che abbiamo appena copiato nel nuovo volume in modo che utilizzi tutto lo spazio disponibile sul volume.

$ sudo resize2fs -p /dev/sdg

Infine, controlla, per assicurarti che tutto vada bene:

$ sudo e2fsck -f /dev/sdg

Questo è tutto ciò che dobbiamo fare in questa macchina, anche se non poteva far male montare il nuovo volume, proprio come un test. Tuttavia, questo passaggio è quasi certamente facoltativo, poiché e2fsck avrebbe dovuto rilevare eventuali problemi.

Ora dobbiamo creare un'istantanea del nuovo volume e creare un AMI basato su di esso. Abbiamo finito con la macchina, quindi puoi terminarla se vuoi.

Assicurati che il piccolo volume sia smontato se lo hai montato, quindi fai un'istantanea. Ancora una volta, puoi farlo nella console di gestione.

Il passaggio finale richiede gli strumenti ec2 della riga di comando.

MODIFICARE:

Poiché questa risposta è stata pubblicata, la console AWS ti consente semplicemente di fare clic con il pulsante destro del mouse su un'istantanea e selezionare Crea immagine da istantanea. Sarà comunque necessario selezionare l'ID kernel appropriato. Se non appare nell'elenco, assicurarsi di aver selezionato l'architettura appropriata.

Usiamo l'applicazione ec2-register per registrare un AMI basato sull'istantanea appena scattata, quindi annota il valore snap-xxxxxxxx dall'istantanea appena scattata.

Dovresti quindi usare un comando come:

ec2-register -C cert.pem -K sk.pem -n The_Name_of_Your_New_Image
-d Your_Description_of_This_New_AMI --kernel aki-xxxxxxxx
-b "/dev/sda1=snap-xxxxxxxx" --root-device-name /dev/sda1

Ovviamente è necessario sostituire l'ID del kernel con quello annotato all'inizio e l'ID dell'istantanea con quello creato nel passaggio precedente. Devi anche puntarlo alla tua chiave segreta (chiamata sk.pem) sopra e al tuo certificato x509 (chiamato cert.pem). Puoi ovviamente scegliere quello che vuoi per il nome e la descrizione.

Spero che sia di aiuto.


Grazie, mi ha aiutato! Per grandi volumi (come 1 TB) questa procedura richiede molto tempo su microistanza. Ho visto la copiatura di volumi basati su rsync no-fsck (ad esempio qui ubuntuforums.org/showpost.php?p=9866025&postcount=27 ), ma l'approccio basato su dd sembra molto più affidabile, anche per volumi non root.
chronos,

Il primo comando sudo e2fsck -f /dev/sdfpotrebbe essere un passaggio richiesto prima di eseguire il ridimensionamento (era nella mia istanza particolare, un AMI Amazon Linux).
notacouch

1
Dovrebbe essere ovvio, ma non dimenticate di fare un file system sul volume (/ facepalm) come da documenti AWS, sudo mkfs -t ext4 /dev/sdg.
notacouch

1

Sì, mi chiedevo anche questo. Il seguente tutorial è eccessivo, ma penso che contenga gli strumenti necessari: http://www.linuxconfig.org/Howto_CREATE_BUNDLE_UPLOAD_and_ACCESS_custom_Debian_AMI_using_ubuntu

Invece di installare su una nuova immagine del disco come sopra, dovrebbe essere possibile avviare l'AMI di grandi dimensioni, creare una nuova EBS, collegare EBS all'istanza in esecuzione e copiare l'AMI in esecuzione sulla nuova EBS. Infine, registra la nuova EBS come AMI.

Dai un'occhiata a questo post sul blog per ulteriori informazioni, in particolare il commento di freremark: http://alestic.com/2010/01/public-ebs-boot-amis-for-ubuntu-on-amazon-ec2

Infine, euca2ools sembra un ottimo sostituto di ec2-ami-tools - euca2ools include delle pagine man reali! Hanno tutti gli stessi nomi dei comandi ec2- *, solo con il prefisso euca. http://open.eucalyptus.com/wiki/Euca2oolsUsing


0

Volevo ridurre la dimensione del volume utilizzato da un'istanza EC2 generale. Ho seguito passaggi simili alle altre risposte qui, ma ho riscontrato un problema. Quindi ecco cosa ho dovuto fare per ridurre il mio volume di root ...

Nella console AWS

 1. Stop the source EC2 instance
 2. Create a snapshot of the volume you want to shrink
 3. Use the snapshot to create a new 'source' volume
 4. Created a new volume with smaller size (made sure it was big enough for the data on source)
 5. Attached both volumes to any EC2 instance (mine were /dev/sdf = source & /dev/sdg = target)
 6. Start the EC2 instance

Sull'istanza EC2

 7. sudo su -   (everything from here is run as root)
 8. mkdir /source /target
 9. mount -t ext4 /dev/sdf /source
 10. mkfs.ext4 /dev/sdg
 11. mount -t ext4 /dev/sdg /target
 12. rsync -aHAXxSP /source/ /target 
     ** notice that there is no trailing '/' after target if 
       you put one there your data will be copied to 
       /target/source and you will have to move it up a directory
 13. cat /boot/grub/grub.conf  (indicated that grub is using root=LABEL=/)
 14. cat /source/etc/fstab (indicated that fstab was also using LABEL=/)
 15. e2label /dev/sdg /
 16. umount /source
 17. umount /target

Di nuovo nella console AWS

 18. Stop the instance
 19. Detach ALL volumes from the instance
 20. Attach the 'target' volume to the instance using /dev/sda1 as the device
 21. Start the instance

Qui è dove abbiamo riscontrato un problema che non è stato menzionato per quanto posso trovare. L'istanza è iniziata bene, fantastico! Ma quando ho provato a ssh all'istanza, non sono riuscito a connettermi. Dopo molte varianti dei passaggi precedenti, ho finalmente deciso di provare a utilizzare il volume di root da un'istanza EC2 appena lanciata.

Nella console AWS

 1. Create a new EC2 instance with the right sized root volume
 2. Stop the new instance
 3. Detach the /dev/sda1 volume from the new instance
    ** used the 'source' volume from before & the new volume we just detached
 4. Attached both volumes to the original EC2 instance (/dev/sdf & /dev/sdg)
 5. Start the instance with the attached volumes

Sull'istanza EC2

 1. sudo su - 
 2. mkdir /source /target (only need to do this if you don't already have these directories)
 3. mount -t ext4 /dev/sdf /source
 4. mount -t ext4 /dev/sdg /target (no need to create a file system because it is already there)
 5. rsync -aHAXxSP /source/ /target 
 6. umount /source
 7. umount /target

Di nuovo nella console AWS

 1. Stop the instance
 2. Detach the 'source' and 'target' volumes from instance
 3. Attach the 'target' volume to the instance from step 1 using /dev/sda1 as the device
 4. Start the instance
 5. ** we use an elastic IP so we just reassigned the IP to the new instance

Spero che questo aiuti qualcuno


La dimensione di un volume può solo essere aumentata, non ridotta. dall'istantanea.
Ankit Kumar Rajpoot,
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.