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

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

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

Aber es zu reduzieren wird schwieriger. Ich möchte die Größe des Stammdatenträgers einer Amazon Web Services (AWS) EC2-Instanz von Elastic Block Store (EBS) reduzieren. Im Internet gibt es einige alte High-Level-Prozeduren. Die ausführlichere Version, die ich gefunden habe, ist eine ein Jahr alte Antwort auf eine StackOverflow-Frage:wie kann ich meine EBS-Volumenkapazität reduzieren, 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 daran an

Überprüfen Sie das Dateisystem (des ursprünglichen Stammdatenträgers): (z. B.) e2fsck -f /dev/xvda1

Das ursprüngliche Stammvolume maximal verkleinern: (zB ext2/3/4) resize2fs -M -p /dev/xvda1

Kopieren Sie die Daten mit dd:

  • Wählen Sie eine Blockgröße (mir gefallen 16 MB)

  • Berechnen Sie die Anzahl der Chunks (mithilfe der Anzahl der Blöcke aus der resize2fs-Ausgabe): Blöcke*4/(Chunkgröße in MB*1024) – runden Sie zur Sicherheit etwas auf

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

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

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

Trennen Sie Ihr neues EBS-Stammvolume und hängen Sie es an Ihre ursprüngliche Instance an.

Ich kann keine ausführliche Schritt-für-Schritt-Anleitung finden.

Mein EBS-Stammvolume ist an eine HVM-Ubuntu-Instanz angeschlossen.

Ich wäre für jede Hilfe sehr dankbar.

Antwort1

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

Auf der neu erstellten Festplatte fehlt die Startpartition. Daher muss GRUB installiert und einige Flags müssen korrekt eingerichtet sein, bevor eine Instanz sie als Root-Volume verwenden kann.

Meine (Stand heute,Arbeiten) Lösung zum Verkleinern eines Wurzelvolumens ist:

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

  1. Erstellen Sie eine neue ec2-Instanz, B, mit demselben Betriebssystem wie Instanz A. Auch die Kernel müssen übereinstimmen, also führen Sie bei Bedarf ein Upgrade oder Downgrade durch. Wählen Sie als Speicher ein Volume vom selben Typ wie VA, aber mit einer Größe von 10 GB (oder was auch immer Ihre Zielgröße ist). Jetzt haben wir also eine Instanz B, die dieses neue Volume (nennen wir es VB) als Stammvolume verwendet.
  2. Sobald die neue Instanz (B) ausgeführt wird, stoppen Sie sie und trennen Sie ihr Stammvolume (VB).

HINWEIS: Die folgenden Schritte stammen größtenteils aus der Lösung von @bill:

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

  2. Erstellen Sie einen Snapshot des Volumes VA und erstellen Sie dann aus diesem Snapshot ein „General Purpose SSD“-Volume. Dieses Volume nennen wir VASNAP.

  3. Starten Sie eine neue Instanz mit Amazon Linux, wir nennen diese Instanz C. Wir verwenden diese Instanz nur, um den Inhalt von VASNAP nach VB zu kopieren. Wir könnten diese Schritte wahrscheinlich auch mit Instanz A durchführen, aber ich ziehe es vor, dies auf einer unabhängigen Maschine durchzuführen.

  4. Fügen Sie die folgenden Datenträger an die Instanz C an. /dev/xvdf für VB. /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, wenn Sie nicht über verfügen /dev/xvdf1, müssen Sie die Partition wie folgt erstellen: i-vii:

i) Wenn /dev/xvdf1es aus irgendeinem Grund nicht existiert, müssen Sie es erstellen. Geben Sie zuerst ein:

sudo fdisk /dev/xvdf.

ii) Löschen Sie die Festplatte durch Eingabe von: wipefs

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

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

v) Drücken Sie weiterhin die Eingabetaste, um mit den Standardeinstellungen fortzufahren.

vi) Wenn erneut ein Befehl angefordert wird, drücken Sie die Eingabetaste, wum die Änderungen zu schreiben und zu beenden.

vii) Überprüfen Sie, ob Sie die /dev/xvdf1Partition haben, indem Sie Folgendes tun: lsblk

Sie sollten etwa Folgendes sehen:

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ängen Sie es in dieses Verzeichnis ein:

mount -t ext4 /dev/xvdf1 /target

  1. Dies ist sehr wichtig, das Dateisystem benötigt ein e2label, damit Linux es erkennt und booten kann. Verwenden Sie „e2label /dev/xvda1“ auf einer aktiven Instanz, um zu sehen, was es sein sollte. In diesem Fall lautet das Label: „/“

e2label /dev/xvdf1 /

  1. Mounten Sie VASNAP auf /source:

mount -t ext4 /dev/xvdg1 /source

  1. Kopieren Sie den Inhalt:

rsync -vaxSHAX /source/ /target

Hinweis: Nach "/target" folgt kein "/". Außerdem können einige Fehler bei Symlinks und Attributen auftreten, aber die Größenänderung war trotzdem erfolgreich

  1. Umount VB:

umount /target

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

  2. Hängen Sie das Volume (VB) mit der neuen Größe an die Instanz an, und zwar als: „/dev/xvda“

  3. Booten Sie Instanz A, jetzt ist ihr Root-Gerät 10 GB groß :)

  4. Löschen Sie beide Instanzen B und C sowie alle Volumes außer VB, das jetzt das Stammvolume der Instanz A ist.

Antwort2

In der AWS-Konsole:

  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 weiteres „General Purpose SSD“-Volume in der gewünschten Größe.

  4. Fügen Sie diese 3 Volumes wie folgt an die Instanz an:

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

  6. Melden Sie sich per SSH bei der neuen Instanz an.

  7. Erstellen Sie diese neuen Verzeichnisse:

mkdir /source /target

  1. Erstellen Sie ein ext4-Dateisystem auf dem neuen Datenträger:

mkfs.ext4 /dev/xvdf

  1. mounten Sie es in dieses Verzeichnis:

mount -t ext4 /dev/xvdf /target

  1. Dies ist sehr wichtig, das Dateisystem benötigt ein e2label, damit Linux es erkennt und booten kann. Verwenden Sie „e2label /dev/xvda1“ auf einer aktiven Instanz, um zu sehen, was es sein sollte. In diesem Fall lautet das Label: „/“

e2label /dev/xvdf /

  1. Mounten Sie das aus dem Snapshot erstellte Volume:

mount -t ext4 /dev/xvdg /source

  1. Kopieren Sie den Inhalt:

rsync -ax /source/ /target

Hinweis: Nach "/target" folgt kein "/". Außerdem können einige Fehler bei Symlinks und Attributen auftreten, aber die Größenänderung war trotzdem erfolgreich

  1. Umounten Sie die Dateisysteme:

umount /target
umount /source

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

  2. Hängen Sie das Volume mit der neuen Größe an die Instanz an, und zwar als: „/dev/sda1“

  3. Starten Sie die Instanz und sie sollte hochfahren.

SCHRITT 10 IST WICHTIG: Kennzeichnen Sie das neue Volume wie oben beschrieben mit „e2label“, sonst scheint die Instanz zwar in AWS zu booten, besteht die Verbindungsprüfung jedoch nicht.

Antwort3

1. Erstellen Sie ein neues EBS-Volume und hängen Sie es an die Instanz an.

Erstellen Sie ein neues EBS-Volume. Wenn Sie beispielsweise ursprünglich 20 G hatten und diese auf 8 G verkleinern möchten, erstellen Sie ein neues 8G-EBS-Volume. Achten Sie darauf, dass es sich in derselben Verfügbarkeitszone befindet. Hängen Sie es an die Instanz an, deren Stammpartition Sie verkleinern müssen.

2. Partitionieren, formatieren und synchronisieren Sie Dateien auf dem neu erstellten EBS-Volume.

(1. Überprüfen Sie die Partitionssituation

Wir verwenden zunächst den Befehl sudo parted -l, um die Partitionsinformationen des ursprünglichen Datenträgers zu überprüfen:

[root@ip-172-31-16-92 conf.d]# sudo parted -l
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 20G
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB               bbp   bios_grub
 2      2097kB  20480MB  24G  xfs          root

Es ist ersichtlich, dass dieses 20G-Root-Gerätevolume in zwei Partitionen aufgeteilt ist, eine heißt bbp und die andere root. In der bbp-Partition gibt es kein Dateisystem, aber es gibt ein Flag namens bios_grub, das zeigt, dass dieses System von grub gebootet wird. Außerdem zeigt es, dass das Root-Volume mit gpt partitioniert ist. Was bios_grub ist, ist eigentlich die BIOS-Bootpartition. Die Referenz lautet wie folgt:

https://en.wikipedia.org/wiki/BIOS_Bootpartition https://www.cnblogs.com/f-ck-need-u/p/7084627.html

Dies ist etwa 1 MB groß, und es gibt eine Partition namens Root, auf die wir uns konzentrieren müssen. Diese Partition speichert alle Dateien des ursprünglichen Systems. Die Idee des Backups besteht also darin, Dateien von dieser Partition auf eine andere, kleinere Partition auf dem neuen EBS-Volume zu übertragen.

(2 Verwenden Sie partedes, um das neue EBS-Volume zu partitionieren und zu formatieren.

lsblkZum Auflisten des Blocks verwenden :

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0   20G  0 disk 
├─nvme0n1p1 259:1    0   1M  0 part 
└─nvme0n1p2 259:2    0   20G  0 part /
nvme1n1     270:0    0   8G  0 disk 

Das neue EBS-Volume ist das Gerät nvme1n1 und wir müssen es partitionieren.

~# parted /dev/nvme1n1
GNU Parted 3.2 
Using /dev/xvdg 
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt  #Using the gpt layout would take up the first 1024 sectors 
(parted) mkpart bbp 1MB 2MB # Since the first 1024 sectors are used, the start address here is 1024kb or 1MB, and bbp is the partition name, that is, BIOS boot partition, which needs to take up 1MB, so the end address is 2MB
(parted) set 1 bios_grub on #Set partition 1 as BIOS boot partition

(parted) mkpart root xfs 2MB 100% #allocate the remaining space (2MB to 100%) to the root partition.


Nach der Partitionierung und lsblkerneuter Verwendung können wir sehen

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0   20G  0 disk 
├─nvme0n1p1 259:1    0   1M  0 part 
└─nvme0n1p2 259:2    0   20G  0 part /
nvme1n1     270:0    0   8G  0 disk 
├─nvme1n1p1 270:1    0   1M  0 part 
└─nvme1n1p2 270:2    0   8G  0 part /

Sie können sehen, dass es zwei weitere Partitionen gibt, nvme1n1p1 und nvme1n1p2, wobei nvme1n1p2 unsere neue Root-Partition ist. Verwenden Sie den folgenden Befehl, um die Partition zu formatieren:

mkfs.xfs /dev/nvme1n1p2

Nach dem Formatieren müssen wir die Partition mounten, zum Beispiel mounten wir sie in /mnt/myroot.

mkdir -p /mnt/myroot
mount /dev/nvme1n1p2 /mnt/myroot
(3 Verwenden Sie rsync, um den gesamten Inhalt auf die entsprechende Stammpartition des neuen Volumes zu übertragen.
sudo rsync -axv / /mnt/myroot/ 

Beachten Sie, dass der obige -xParameter sehr wichtig ist, da er das Stammverzeichnis der aktuellen Instanz sichert. Wenn Sie diesen Parameter also nicht hinzufügen, wird /mnt/myroot selbst nach /mnt/myroot gesichert und es kommt zu einer Endlosschleife. (Der Parameter –exclude ist auch in Ordnung.) Der Befehl rsync unterscheidet sich vom Befehl cp. Der Befehl cp überschreibt, während rsync eine synchrone inkrementelle Sicherung ist. Das würde viel Zeit sparen. Nehmen Sie sich einen Kaffee und warten Sie, bis die Synchronisierung abgeschlossen ist.

3. Ersetzen Sie die UUID in der entsprechenden Datei.

Da sich das Volume geändert hat, wird auch die UUID des Volumes geändert. Wir müssen die UUID in den Startdateien ersetzen. Die folgenden beiden Dateien müssen geändert werden:

/boot/grub2/grub.cfg #or /boot/grub/grub.cfg
/etc/fstab

Was muss also geändert werden? Zunächst muss die UUID des betreffenden Volumes über blkid aufgelistet werden:

[root@ip-172-31-16-92 boot]# sudo blkid
/dev/nvme0n1p2: LABEL="/" UUID="add39d87-732e-4e76-9ad7-40a00dbb04e5" TYPE="xfs" PARTLABEL="Linux" PARTUUID="47de1259-f7c2-470b-b49b-5e054f378a95"
/dev/nvme1n1p2: UUID="566a022f-4cda-4a8a-8319-29344c538da9" TYPE="xfs" PARTLABEL="root" PARTUUID="581a7135-b164-4e9a-8ac4-a8a17db65bef"
/dev/nvme0n1: PTUUID="33e98a7e-ccdf-4af7-8a35-da18e704cdd4" PTTYPE="gpt"
/dev/nvme0n1p1: PARTLABEL="BIOS Boot Partition" PARTUUID="430fb5f4-e6d9-4c53-b89f-117c8989b982"
/dev/nvme1n1: PTUUID="0dc70bf8-b8a8-405c-93e1-71c3b8a887c7" PTTYPE="gpt"
/dev/nvme1n1p1: PARTLABEL="bbp" PARTUUID="82075e65-ae7c-4a90-90a1-ea1a82a52f93"

Sie können sehen, dass die UUID der Root-Partition des alten großen EBS-Volumens lautet add39d87-732e-4e76-9ad7-40a00dbb04e5und die UUID des neuen kleinen EBS-Volumens lautet 566a022f-4cda-4a8a-8319-29344c538da9. Verwenden Sie den Befehl sed, um sie zu ersetzen:

sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /boot/grub2/grub.cfg
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /etc/fstab

Natürlich können Sie auch versuchen, der Einfachheit halber manuell Grub-Dateien zu generieren grub-install(auf manchen Systemen sind dies ).grub2-install

4. Trennen Sie zwei Volumes und schließen Sie dann das neue kleine Volume wieder an.

Verwenden Sie dann umountzum Unmounten des neuen EBS-Volumes:

umount /mnt/myroot/ 

Wenn angezeigt wird, dass das Ziel beschäftigt ist, können Sie mit fuser -mv /mnt/myrootsehen, welcher Prozess darin arbeitet. Ich habe Bash gefunden, was bedeutet, dass Sie dieses Verzeichnis in Bash verlassen müssen. Verwenden Sie , cdum zum Home-Verzeichnis zurückzukehren, und geben Sie den obigen Befehl erneut ein, um die Bereitstellung aufzuheben.

Trennen Sie dann die beiden Volumes (stoppen Sie natürlich zuerst die Instanz) und schließen Sie das neue Volume erneut als Root-Gerät an, indem Sie hier den Gerätenamen eingeben, /dev/xvdawie unten gezeigt .

Starten Sie dann die Instanz. Wenn SSH fehlschlägt, können Sie zum Debuggen die folgenden Methoden verwenden:

1. Systemprotokoll abrufen

2. Screenshot machen

Referenz:

1.https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#InitialSteps

2.https://www.daniloaz.com/en/partitionieren-und-größenanpassung-des-ebs-root-volumes-einer-aws-ec2-instanz/

3.https://medium.com/@m.yunan.helmy/verringern-sie-die-größe-des-ebs-volume-in-ihrer-ec2-instance-ea326e951bce

Antwort4

Der folgende Artikel ist ein gutes und unkompliziertes Tutorial zum Verringern der Größe des EBS-Volumens. Er enthält eine leicht verständliche Schritt-für-Schritt-Anleitung und Screenshots.

Reduzieren Sie die Größe des EBS-Volumes in Ihrer EC2-Instanz

verwandte Informationen