Blog
So mounten Sie ein EBS-Volume auf NVMe-basierten Instanztypen

Das Einhängen eines persistenten EBS-Volumes beim Booten ist keine triviale Aufgabe. Seit der Einführung der Nitro-basierten Instanztypen erscheinen EBS-Volumes nicht mehr unter dem Gerätenamen, der während des Attach-Befehls angegeben wurde. Stattdessen wird der Gerätename vom Kernel bestimmt und hängt von der Reihenfolge ab, in der er angehängt wird. Daher kann ein Wechsel des EC2-Instanztyps oder der Volumes dazu führen, dass ein falsches Volume gemountet wird oder gar nicht erst gemountet wird. In diesem Blog stellen wir Ihnen die Details zum Einbinden eines EBS-Volumes auf einem beliebigen EC2-Instance-Typ vor.
ein EBS-Volume mounten
Bei Cloud-Migrationen stoßen wir häufig auf Anwendungen, die ein persistentes Volume zum Speichern des Status benötigen. Zum Beispiel WebsphereMQ.
In diesen Fällen stellen wir die entsprechenden EC2-Instanzen mit abnehmbaren Netzwerkschnittstellen und EBS-Volumes bereit: Auf diese Weise können wir
die Instanz immer noch zerstören und ersetzen, während die IP-Adresse und die Daten erhalten bleiben.
Um ein solches EBS-Volume auf der EC2-Instanz zu mounten, müssen wir:
* Anschließen der Festplatte
* Warten auf die Festplatte
* Formatieren der Festplatte
* Einhängen der Festplatte
Befestigen Sie die Diskette
Das Anhängen der Festplatte ist ganz einfach. In CloudFormation geben wir die Volume-ID und den Gerätenamen als eines der Volumes der ec2-Instanz an:
EC2Instance:
Properties:
Volumes:
- Device: /dev/xvdd
VolumeId: !Ref 'Storage'
Warten Sie auf die Diskette
Obwohl der Datenträger Teil der Definition der ec2-Instanz ist, wird die ec2-Instanz gebootet, bevor
den Anhang fertiggestellt hat. Um zu vermeiden, dass der Bootvorgang abgeschlossen wird, bevor das Volume eingehängt ist, müssen wir
warten, bis das Blockgerät erscheint:
while [[ ! -b $(readlink -f /dev/xvdd) ]]; do
echo "waiting for the disk to appear..">&2;
sleep 5;
done
Auf NVMe-basierten Instanzen wird die Festplatte nicht als der angegebene Gerätename '/dev/xvdd' angezeigt, sondern
als '/dev/nvme[0-9]n1'. Wenn die Festplatte angeschlossen wird, erstellt der Gerätemanager einen symbolischen Link '/dev/xvdd'
, der auf das tatsächliche Gerät zeigt. Leider akzeptiert der Befehl mount keine symbolischen Links als Gerät.
Mit dem Befehl readlink erhalten wir immer den tatsächlichen Gerätenamen, egal ob es sich um eine Nitro-basierte Instanz oder
eine klassische Instanz handelt.
Formatieren Sie die Festplatte
Nachdem das Gerät erschienen ist, formatieren wir die Festplatte nur, wenn sie unformatiert ist:
blkid $(readlink -f /dev/xvdd) || mkfs -t ext4 $(readlink -f /dev/xvdd)
Beschriftung der Diskette
Um sicherzustellen, dass wir eine Mount-Anweisung erstellen können, ohne einen physischen Gerätenamen
anzugeben, beschriften wir die Festplatte:
e2label $(readlink -f /dev/xvdd) wmq-data
Montieren Sie die Festplatte
Nachdem die Festplatte angeschlossen, formatiert und beschriftet ist, erstellen wir den fstab-Eintrag:
grep -q ^LABEL=wmq-data /etc/fstab || echo "LABEL=wmq-data /var/mqm ext4 defaults" >> /etc/fstab
Entfernen Sie alle Mount-Einträge des alten Stils in /etc/fstab:
sed -i -e '/^[/][^ t]*[ t]*/var/mqm[ t]/d' /etc/fstab
Schließlich mounten wir die Festplatte, falls sie noch nicht gemountet war:
grep -q "$(readlink -f /dev/xvdd) /var/mqm " /proc/mounts || mount /var/mqm
Wenn der Rechner neu startet, hat der Eintrag in /etc/fstab die Festplatte bereits für uns eingehängt.
Verwendung
Wenn Sie Ihr eigenes EBS-Volume mounten möchten, können Sie das Skript generate-mount-ebs-volume-bootcmd verwenden, um die erforderlichen Befehle zu erzeugen. Typ:
$ ./generate-mount-ebs-volume-bootcmd /dev/xvdd /var/mqm wmq-data
Der erste Parameter ist Ihr Gerätename, der zweite der Einhängepunkt und der dritte das Label.
Es wird ein bootcmd-Snippet generiert, das Sie der Cloud-Konfiguration Ihres Rechners hinzufügen können.
bootcmd:
- mkdir -p /var/mqm
- while [ ! -b $(readlink -f /dev/xvdd) ]; do echo "waiting for device /dev/xvdd"; sleep 5 ; done
- blkid $(readlink -f /dev/xvdd) || mkfs -t ext4 $(readlink -f /dev/xvdd)
- e2label $(readlink -f /dev/xvdd) wmq-data
- sed -e '/^[/][^ t]*[ t]*/var/mqm[ t]/d' /etc/fstab
- grep -q ^LABEL=wmq-data /etc/fstab || echo 'LABEL=wmq-data /var/mqm ext4 defaults' >> /etc/fstab
- grep -q "^$(readlink -f /dev/xvdd) /var/mqm " /proc/mounts || mount /var/mqm
Es muss hart kodiert werden, da das Modul write-files von cloud-config nach dem bootcmd ausgeführt wird.
Fazit
Das Mounten eines persistenten EBS-Volumes beim Booten ist keine triviale Aufgabe, und mit den Nitro-basierten Images ist es sogar noch schwieriger geworden. Durch die Verwendung des Befehls readlink funktioniert dieses Skript sowohl auf NVMe-basierten Instanzen als auch auf älteren Instanztypen. Ich hoffe, dass AWS in naher Zukunft eine einfachere und robustere Methode zum Einbinden von EBS-Volumes beim Booten bereitstellen wird.
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Unsere Ideen
Weitere Blogs
Contact



