Frage Schrumpfende Amazon EBS-Volume-Größe


ich habe gesehen Diese Antwort auf wachsende EBS-Volumes, aber ich würde gerne einen verkleinern.

Die Standardbilder von Ubuntu Server sind 15 GB, während ich wirklich nur 2 GB maximal brauche (ich verwende ein anderes Volumen für Daten). Gibt es eine Möglichkeit, die Größe des Volumens zu verkleinern?


24
2017-09-21 06:24


Ursprung




Antworten:


Ich hatte die gleiche Frage wie du, also habe ich herausgefunden, wie es geht.

Zuerst habe ich dies aus dem Ubuntu 32-Bit EBS-gestützten AMI aus der Region USA-Ost gemacht, andere Betriebssysteme oder Bilder funktionieren möglicherweise anders. Ich vermute jedoch, dass Sie in Ordnung sein sollten, solange Sie ein ext * Dateisystem verwenden. Es könnte auf anderen Dateisystemen funktionieren, aber Sie müssen herausfinden, wie Sie die Größe selbst ändern können.

Die Schritte sind im Grunde:

  1. Hängen Sie zwei Volumes an eine laufende Instanz an, wobei die erste auf dem Snapshot basiert, den Sie verkleinern möchten, und der zweite ein leeres Volume mit der neuen Größe, auf die Sie verkleinern möchten.

  2. Überprüfen Sie das Dateisystem des ersten Volumes und beheben Sie etwaige Fehler.

  3. Verkleinern Sie das Dateisystem auf dem ersten Volume, sodass es nur so groß ist, wie es sein muss, um die Daten zu speichern.

  4. Kopieren Sie das Dateisystem vom ersten auf das zweite Volume.

  5. Erweitern Sie das Dateisystem auf dem zweiten Volume auf die maximale Größe.

  6. Stellen Sie sicher, dass alles gut aussieht, indem Sie den zweiten Datenträger auf Fehler überprüfen.

  7. Machen Sie eine Momentaufnahme des zweiten Bandes.

  8. Erstellen Sie ein Computer-Image basierend auf dem Snapshot des zweiten Volumes, das Sie gerade erstellt haben.

Sie müssen zuerst einige Informationen von der Ami erhalten, die Sie verkleinern möchten. Insbesondere benötigen Sie die Kernel-ID und die Ramdisk-ID, falls vorhanden (das Image, auf das ich geschrumpft bin, hatte keine Ramdisk). All diese Informationen sollten im AMI-Fenster über die Verwaltungskonsole von aws verfügbar sein.

Die Kernel-ID sieht wie folgt aus: kia-xxxxxxxx, und die Snapshot-ID sieht aus wie snap-xxxxxxxx, und Ramdisk-IDs sehen aus wie RIA-xxxxxxxx.

Als nächstes starten Sie eine Linux-Instanz. Ich habe eine Ubuntu-Instanz gestartet. Sie können eine t1.micro-Instanz verwenden, wenn Sie möchten. Es braucht nicht viel Energie, um diese nächsten Schritte auszuführen.

Nachdem der Computer gestartet wurde, fügen Sie den Schnappschuss ein, den Sie im ersten Schritt notiert haben. In meinem Fall habe ich es an / dev / sdf angehängt

Erstellen Sie dann ein neues Volume mit der gewünschten Größe. In meinem Fall habe ich ein 5GB-Volume erstellt, da dies die Größe ist, auf die ich es verkleinern wollte. Erstellen Sie dieses neue Volume nicht aus einem Snapshot. Wir brauchen ein neues leeres Volumen. Als nächstes hängt es an die laufende Instanz an, in meinem Fall habe ich es als / dev / sdg angehängt

Als nächstes, SSH in die Maschine, aber mounten Sie die angehängten Volumes nicht.

An dieser Stelle habe ich mich auf der Seite der Paranoia geirrt, und ich habe mich entschieden, das Dateisystem auf dem großen Volume zu überprüfen, nur um sicherzustellen, dass keine Fehler aufgetreten sind. Wenn Sie sicher sind, dass es keine gibt, können Sie diesen Schritt überspringen:

$ sudo e2fsck -f /dev/sdf

Als nächstes änderte ich das Dateisystem auf dem großen Volume so, dass es nur so groß wie die Daten auf dem Datenträger war:

$ sudo resize2fs -M -p /dev/sdf

Das -M verkleinert es, und die Option -p gibt den Fortschritt aus.

Die resize2fs sollte dir sagen, wie groß das shrunkin Dateisystem ist. In meinem Fall gab es mir die Größe in 4K Blöcken.

Wir kopieren nun das geschrumpfte Dateisystem auf die neue Festplatte. Wir werden die Daten in 16-MB-Chunks kopieren, also müssen wir herausfinden, wie viele 16-MB-Chunks wir kopieren müssen. Dies ist, wo dieses geschrumpfte Dateisystem Größe in Handey kommt.

In meinem Fall war das geschrumpfte Dateisystem knapp über 1 GB groß, weil ich vor dem Erstellen eines Snapshots viele andere Programme auf dem Ubuntu-Basissystem installiert hatte. Ich hätte es wahrscheinlich schaffen können, nur die Größe des auf die nächsten 16 MB aufgerundeten Dateisystems zu kopieren, aber ich wollte auf Nummer sicher gehen.

Also, 128 mal 16MB chunks = 2GB:

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

Ich habe in Blöcken von 16MB kopiert, weil du mit EBS für jeden Lese- und Schreibvorgang bezahlst, also wollte ich die Anzahl so weit wie möglich minimieren. Ich weiß nicht, ob es so gemacht hat, aber es hat wahrscheinlich nicht wehgetan.

Wir müssen dann das Dateisystem, das wir gerade auf das neue Volume kopiert haben, so skalieren, dass es den gesamten verfügbaren Speicherplatz auf dem Volume nutzt.

$ sudo resize2fs -p /dev/sdg

Schließlich, überprüfen Sie es, um sicherzustellen, dass alles in Ordnung ist:

$ sudo e2fsck -f /dev/sdg

Das ist alles, was wir in diesem Gerät tun müssen, obwohl es nicht schaden kann, das neue Volume zu installieren, nur als Test. Allerdings ist dieser Schritt mit ziemlicher Sicherheit optional, da e2fsck keine Probleme haben sollte.

Jetzt müssen wir das neue Volume aufnehmen und daraus ein AMI erstellen. Wir sind mit der Maschine fertig, damit Sie sie beenden können, wenn Sie möchten.

Stellen Sie sicher, dass das kleine Volume ausgehängt ist, wenn Sie es gemountet haben, und machen Sie dann einen Schnappschuss davon. Auch dies können Sie in der Verwaltungskonsole tun.

Der letzte Schritt erfordert die Kommandozeilen-Tools ec2.

BEARBEITEN:

Seit diese Antwort veröffentlicht wurde, können Sie die AWS-Konsole einfach verwenden   Klicken Sie mit der rechten Maustaste auf einen Schnappschuss und wählen Sie Bild aus Schnappschuss erstellen. Du wirst   müssen Sie immer noch die entsprechende Kernel-ID auswählen. Wenn es nicht erscheint   Stellen Sie auf der Liste sicher, dass Sie die entsprechende Architektur ausgewählt haben.

Wir verwenden die ec2-register-Anwendung, um ein AMI basierend auf dem Snapshot zu registrieren, den Sie gerade aufgenommen haben. Schreiben Sie also den snap-xxxxxxxx-Wert aus dem gerade aufgenommenen Snapshot.

Sie sollten dann einen Befehl wie verwenden:

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

Sie müssen natürlich die Kernel-ID durch die, die Sie zu Beginn geschrieben haben, und die Snapshot-ID durch die, die Sie im vorherigen Schritt erstellt haben, ersetzen. Sie müssen es auch auf Ihren geheimen Schlüssel (oben sk.pem) und Ihr x509-Zertifikat (cert.pem genannt) richten. Sie können natürlich für den Namen und die Beschreibung wählen, was Sie wollen.

Hoffe das hilft.


26
2017-12-22 17:50



Danke, das hat geholfen! Für große Volumes (wie 1 TB) dauert dieser Vorgang lange auf der Micro-Instanz. Ich habe no-fsck, rsync-basiertes Volume-Kopieren gesehen (z. B. hier ubuntuforums.org/showpost.php?p=9866025&postcount=27), aber dd-basierte Ansatz fühlt sich viel zuverlässiger, auch für Nicht-Root-Volumes. - chronos
Der erste Befehl sudo e2fsck -f /dev/sdf möglicherweise ein erforderlicher Schritt vor der Größenänderung (war auf meiner bestimmten Instanz, ein Amazon Linux AMI). - notacouch
Sollte offensichtlich sein, aber vergessen Sie nicht, ein Dateisystem auf dem Volume (/ facepalm) nach AWS-Dokumenten zu erstellen, sudo mkfs -t ext4 /dev/sdg. - notacouch


Ja, das habe ich auch gewundert. Das folgende Tutorial ist übertrieben, aber ich denke, es enthält die notwendigen Tools: http://www.linuxconfig.org/Howto_CREATE_BUNDLE_UPLOAD_and_ACCESS_custom_Debian_AMI_using_ubuntu

Anstatt wie oben auf ein neues Disk-Image zu installieren, sollte es möglich sein, das große AMI zu starten, ein neues EBS zu erstellen, EBS an die laufende Instanz anzuhängen und das laufende AMI auf das neue EBS zu kopieren. Registrieren Sie schließlich das neue EBS als AMI.

Sehen Sie sich diesen Blogpost an, um mehr Hintergrundinformationen zu erhalten, insbesondere den Kommentar von freremark: http://alestic.com/2010/01/public-ebs-boot-amis-for-ubuntu-on-amazon-ec2

Zu guter Letzt scheint der euca2ools ein guter Ersatz für ec2-ami-tools zu sein - euca2ools enthält aktuelle Manpages! Sie haben alle die gleichen Namen wie die ec2-* Befehle, nur mit dem euca-Präfix. http://open.eucalyptus.com/wiki/Euca2oolsUsing


1
2017-10-14 08:30





Ich wollte die Größe des von einer allgemeinen EC2-Instanz verwendeten Volumens reduzieren. Ich folgte ähnlichen Schritten zu den anderen Antworten hier, stieß aber auf ein Problem. Also hier ist, was ich tun musste, um mein Wurzelvolumen zu verkleinern ...

In der AWS-Konsole

 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

Auf der EC2-Instanz

 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

Zurück in der AWS-Konsole

 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

Hier sind wir auf ein Problem gestoßen, das bisher nicht erwähnt wurde. Die Instanz begann gut, großartig! Aber als ich versucht habe, die Instanz anzusprechen, konnte ich keine Verbindung herstellen. Nach vielen vielen Variationen der obigen Schritte entschied ich mich schließlich zu versuchen, das Wurzelvolumen von einer frisch gesponnenen EC2-Instanz zu verwenden.

In der AWS-Konsole

 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

Auf der EC2-Instanz

 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

Zurück in der AWS-Konsole

 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

Hoffe, das hilft jemandem


0
2018-01-27 19:06