Wie kann man die Größe des AWS EBS-Root-Volumes reduzieren?

16

Das Vergrößern einer EC2-Instanz ist einfach wie ein Atemzug (erstellen Sie beispielsweise eine AMI, starten Sie eine Instanz davon und ändern Sie dann die Speichergröße).

Das Reduzieren wird jedoch schwieriger. Ich möchte die Größe eines EBS-Stammvolumes (Elastic Block Store) einer Amazon Web Services (AWS) EC2-Instanz reduzieren. Es gibt ein paar alte High-Level-Verfahren im Netz. Die detailliertere Version, die ich gefunden habe, ist eine einjährige Antwort auf eine StackOverflow-Frage: Wie kann ich meine EBS-Volumenkapazität reduzieren? Die Schritte haben ein ziemlich hohes Niveau:

Erstellen Sie ein neues EBS-Volume mit der gewünschten Größe (z. B. / dev / xvdg).

Starten Sie eine Instanz und hängen Sie beide EBS-Volumes an

Überprüfen Sie das Dateisystem (des ursprünglichen Root-Volumes): (zB) e2fsck -f / dev / xvda1

Verkleinere das ursprüngliche Root-Volume maximal: (zB ext2 / 3/4) resize2fs -M -p / dev / xvda1

Kopieren Sie die Daten mit dd:

  • Wähle eine Blockgröße (ich mag 16MB)

  • Berechnen Sie die Anzahl der Chunks (unter Verwendung der Anzahl der Blöcke aus der Ausgabe von resize2fs): blocks * 4 / (chunk_size_in_mb * 1024) - Runden Sie aus Sicherheitsgründen ein bisschen auf

  • Kopieren Sie die Daten: (zB) dd if = / dev / xvda1 ibs = 16M von = / dev / xvdg obs = 16M count = 80

Ändern Sie die Größe des Dateisystems auf dem neuen (kleineren) EBS-Volume: (z. B.) resize2fs -p / dev / xvdg

Überprüfen Sie das Dateisystem (des ursprünglichen Root-Volumes): (zB) e2fsck -f / dev / xvdg

Trennen Sie Ihr neues EBS-Root-Volume und hängen Sie es an Ihre ursprüngliche Instanz an

Ich kann keine detaillierte schrittweise Anleitung finden.

Mein EBS-Root-Volume ist an eine HVM-Ubuntu-Instanz angehängt.

Jede Hilfe wäre sehr dankbar.

herve
quelle
Das sieht nach einer ziemlich guten Schritt-für-Schritt-Lösung aus.
Ceejayoz
dd - Kopieren Disk-to-Disk - dd if = / dev / xvdf von = / dev / xvdh bs = 4k count = 227.613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Antworten:

6

In der AWS Console:

  1. Stoppen Sie die Instanz, deren Größe Sie ändern möchten

  2. Erstellen Sie einen Snapshot des aktiven Volumes und erstellen Sie dann aus diesem Snapshot ein "General Purpose SSD" -Volume.

  3. Erstellen Sie ein anderes "General Purpose SSD" -Volume mit der gewünschten Größe.

  4. Fügen Sie diese 3 Volumes der Instanz wie folgt hinzu:

    • / dev / sda1 für das aktive Volume.
    • / dev / xvdf für das Volume, das die Zielgröße ist.
    • / dev / xvdg für das Volume, das aus dem Snapshot des aktiven Volumes erstellt wurde.
  5. Starten Sie die Instanz.

  6. Melden Sie sich über SSH bei der neuen Instanz an.

  7. erstelle diese neuen Verzeichnisse:

mkdir /source /target

  1. erstelle ein ext4 Dateisystem auf einem neuen Volume:

mkfs.ext4 /dev/xvdf

  1. Hänge es in dieses Verzeichnis ein:

mount -t ext4 /dev/xvdf /target

  1. Dies ist sehr wichtig. Das Dateisystem benötigt ein e2label, damit Linux es erkennt und bootet. Verwenden Sie "e2label / dev / xvda1" auf einer aktiven Instanz, um zu sehen, wie es aussehen soll. In diesem Fall lautet das Label: "/"

e2label /dev/xvdf /

  1. Hängen Sie das aus dem Snapshot erstellte Volume ein:

mount -t ext4 /dev/xvdg /source

  1. Kopieren Sie den Inhalt:

rsync -ax /source/ /target

Hinweis: Es gibt kein "/" nach "/ target". Möglicherweise sind auch einige Fehler bei Symlinks und Attributen aufgetreten, die Größenänderung war jedoch weiterhin erfolgreich

  1. Hängen Sie die Dateisysteme um:

umount /target
umount /source

  1. Zurück in AWS Console: Stoppen Sie die Instanz und trennen Sie alle Volumes.

  2. Hängen Sie das neue Volume mit der folgenden Größe an die Instanz an: "/ dev / sda1"

  3. Starten Sie die Instanz und sie sollte hochfahren.

SCHRITT 10 IST WICHTIG : Beschriften Sie das neue Volume wie oben erwähnt mit "e2label". Andernfalls wird die Instanz in aws gebootet, besteht jedoch die Verbindungsprüfung nicht.

Rechnung
quelle
9
Ich habe diese Schritte mehrmals durchlaufen (Ubuntu 14.04) und jedes Mal, wenn ich das neue Volume anhänge, wird die Instanz einfach gestoppt. Gibt es noch jemanden, bei dem dieses Problem auftritt? Das geht mir durch den Kopf!
Thiesdiggity
2
Du bist nicht die einzige. Ich habe diese und andere Lösungen ausprobiert und mag dein gutes Ich. Meine Instanz wird ebenfalls heruntergefahren.
blairmeister
1
@blairmeister Ich hatte das gleiche Problem, aber es gelang mir, es zum Laufen zu bringen! Werfen Sie einen Blick auf meine Antwort unten, wenn Sie immer noch feststecken :)
Ruben Serrate
Mein e2label ist cloudimg-rootfs ... nach all diesen Schritten kann ich bestätigen, dass Ubuntu 14.04 nicht funktioniert
NineCattoRules
1
Ich stimme dieser Antwort nicht zu, da sie nicht genügend Anwendungsfälle für ein Volume (wie z. B. ein Startvolume) abdeckt, um Benutzer vor versehentlichem Schaden zu schützen.
Jesse Adelman
6

Keine der anderen Lösungen funktioniert, wenn das Volume als Root-Gerät (bootfähig) verwendet wird.

Auf dem neu erstellten Datenträger fehlt die Startpartition. Daher muss GRUB installiert und einige Flags ordnungsgemäß eingerichtet sein, bevor eine Instanz es als Root-Volume verwenden kann.

Meine (bis heute funktionierende ) Lösung zum Verkleinern eines Root-Volumes ist:

Hintergrund: Wir haben eine Instanz A, deren Root-Volume wir verkleinern möchten. Nennen wir dieses Volumen VA. Wir möchten VA von 30 GB auf 10 GB verkleinern

  1. Erstellen Sie eine neue ec2-Instanz, B, mit demselben Betriebssystem wie die Instanz A. Wählen Sie als Speicher ein Volume, das dem VA-Typ entspricht, jedoch eine Größe von 10 GB hat. (oder was auch immer Ihre Zielgröße ist). Jetzt haben wir also eine Instanz B, die dieses neue Volume (nennen wir es VB) als Root-Volume verwendet.
  2. Sobald die neue Instanz (B) ausgeführt wird. Stoppen Sie es und entfernen Sie das Root-Volume (VB).

HINWEIS: Die folgenden Schritte werden hauptsächlich von der @ bill-Lösung ausgeführt:

  1. Stoppen Sie die Instanz, deren Größe Sie ändern möchten (A).

  2. Erstellen Sie einen Snapshot der Volume-VA und erstellen Sie dann aus diesem Snapshot ein "General Purpose SSD" -Volume. Diesen Band nennen wir es VASNAP.

  3. Starten Sie eine neue Instanz mit Amazon Linux. Diese Instanz wird C genannt. Mit dieser Instanz wird der Inhalt von VASNAP nach VB kopiert. Wir könnten wahrscheinlich auch Instanz A verwenden, um diese Schritte auszuführen, aber ich bevorzuge es, dies auf einem unabhängigen Computer auszuführen.

  4. Hängen Sie die folgenden Volumes an Instanz C. / dev / xvdf für VB an. / dev / xvdg für VASNAP.

  5. Starten Sie Instanz C neu.

  6. Melden Sie sich über SSH bei Instanz C an.

  7. Erstellen Sie diese neuen Verzeichnisse:

mkdir /source /target

  1. Formatieren Sie die Hauptpartition von VB mit einem ext4-Dateisystem:

mkfs.ext4 /dev/xvdf1

Wenn keine Fehler auftreten, fahren Sie mit Schritt 11 fort. Andernfalls müssen /dev/xvdf1Sie die Partition wie folgt erstellen:

i) Wenn /dev/xvdf1es aus irgendeinem Grund nicht gibt, müssen Sie es erstellen. Zuerst eingeben:

sudo fdisk /dev/xvdf.

ii) Wischen Sie die Festplatte ab, indem Sie Folgendes eingeben: wipefs

iii) Erstellen Sie eine neue Partition, indem Sie Folgendes eingeben: n

iv) Geben Sie ein p, um eine primäre Partition zu erstellen

v) Halten Sie die Eingabetaste gedrückt, um mit den Standardeinstellungen fortzufahren.

vi) Wenn Sie erneut nach einem Befehl gefragt werden, drücken Sie die Eingabetaste w, um die Änderungen zu schreiben und den Vorgang zu beenden.

vii) Stellen Sie sicher, dass Sie über die /dev/xvdf1Partition verfügen, indem Sie folgende Schritte ausführen : lsblk

Sie sollten etwas sehen wie:

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

Fahren Sie nun mit Schritt 11 fort.

  1. Hänge es in dieses Verzeichnis ein:

mount -t ext4 /dev/xvdf1 /target

  1. Dies ist sehr wichtig. Das Dateisystem benötigt ein e2label für Linux, um es zu erkennen und zu booten. Verwenden Sie "e2label / dev / xvda1" auf einer aktiven Instanz, um zu sehen, wie es aussehen soll. In diesem Fall lautet das Label: "/"

e2label /dev/xvdf1 /

  1. VASNAP einbinden auf / Quelle:

mount -t ext4 /dev/xvdg1 /source

  1. Kopieren Sie den Inhalt:

rsync -vaxSHAX /source/ /target

Hinweis: Es gibt kein "/" nach "/ target". Möglicherweise sind auch einige Fehler bei Symlinks und Attributen aufgetreten, die Größenänderung war jedoch weiterhin erfolgreich

  1. Umount VB:

umount /target

  1. Zurück in der AWS-Konsole: Entfernen Sie VB von Instanz C und VA von A.

  2. Hängen Sie das neue Volume (VB) wie folgt an die Instanz an: "/ dev / xvda"

  3. Boot-Instanz A, jetzt ist es Root-Gerät 10 GB :)

  4. Löschen Sie beide Instanzen B und C sowie alle Volumes mit Ausnahme von VB, das jetzt das Stammvolume von Instanz A ist.

Ruben Serrate
quelle
Was ist dein Betriebssystem?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
Ich habe Ubuntu 14.04 ausprobiert und es funktioniert nicht
NineCattoRules
@NineCattoRules Autsch ... Ich kann bestätigen, dass es für Amazon Linux funktioniert, musste es vor kurzem tun.
Ruben Serrate
1
Sollten wir das Volume in Schritt 17 nicht /dev/sda1anstelle von /dev/xvda@RubenSerrate anhängen?
08:37 Uhr
2

Die folgenden Schritte haben bei mir funktioniert

Schritt 1. Erstellen Sie einen Snapshot des Root-EBS-Volumes und erstellen Sie ein neues Volume aus dem Snapshot (nennen wir diese Volume-Kopie).

Schritt 2. Erstellen Sie eine neue Instanz mit dem ebs-Root-Volume mit der gewünschten Größe. (Nennen wir das Volume "Größe ändern".) Dieses EBS-Volume verfügt über die richtige Partition zum Booten. (Das Erstellen eines neuen ebs-Volumes von Grund auf hat bei mir nicht funktioniert.)

Schritt 3. Fügen Sie einer Instanz eine Größenänderung des Volumes und eine Kopie des Volumes hinzu.

Schritt 4. Formatieren Sie die Volume-Größe.

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

Hinweis: Stellen Sie sicher, dass das Partitionsvolumen /dev/xvdf1nicht eingegeben wird/dev/xvdf

Schritt 5. Mounten Sie die Volume-Größenänderung und kopieren Sie mkdir / mnt / copy mkdir / mnt / resize

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

Schritt 6. Kopieren Sie die Dateien

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

Schritt 7. Stellen Sie sicher, dass e2label mit dem Root-Volume identisch ist

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

Schritt 8. Aktualisieren Sie die Datei grub.conf auf der Volume-Kopie, um sie an das neue Volume udid anzupassen

Suchen und ersetzen Sie 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"

Schritt 9. Hängen Sie die Volumes aus

Schritt 10. Hängen Sie ein neues EBS-Volume mit geänderter Größe an instance / dev / sda1 an

DrewJaja
quelle
1
Die Kombination der gezackten @ Ruben-Antwort mit dem Grub-UUID-Update hat bei mir funktioniert.
Jonathan Maim
Kleine Anmerkung, da ich nur einige Zeit verschwendet habe: Laufen blkidohne sudogibt zwischengespeicherte Ergebnisse zurück, ohne sie zu validieren. Es sieht also so aus, als hätte sich die UUID nicht geändert.
Akhil Nair
0

Hier ist ein alternativer Ansatz;

Hängen Sie das alte EBS-Volume an eine laufende EC2-Instanz an und hängen Sie es an. Wenn Sie ein Startvolume kopieren möchten, sollten Sie es auf einer anderen Instanz ausführen, wobei das alte Volume als Daten bereitgestellt und nicht als Live-System verwendet wird.

Erstellen Sie ein neues EBS-Volume mit der gewünschten Größe.

Hängen Sie das neue Volume an die Instanz an und formatieren Sie darauf (vorsichtig) ein neues Dateisystem (z. B. mit mkfs). Montiere es.

Kopieren Sie den alten Dateisysteminhalt vom alten auf das neue Volume:

rsync -vaxSHAX /oldvol/ /newvol/

Hängen Sie das neue Volume aus und trennen Sie es von der Instanz.

Wenn Sie das Root-Dateisystem kopiert haben, dann:

Erstellen Sie einen EBS-Snapshot des neuen Volumes.

Registrieren Sie den Snapshot als neues AMI.

Eric Hammond
quelle