Comment réduire la taille du volume racine AWS EBS?

16

L'agrandissement d'une instance EC2 est facile comme un souffle (par exemple, créer une AMI, lancer une instance à partir de celle-ci, puis modifier la taille de stockage).

Mais la réduire devient plus difficile. Je souhaite réduire la taille du volume racine d'une instance Amazon Web Services (AWS) EC2 Elastic Block Store (EBS). Il y a un couple d'anciennes procédures de haut niveau sur le net. La version plus détaillée que j'ai trouvée est une réponse vieille d'un an à une question StackOverflow: comment puis-je réduire ma capacité de volume ebs , les étapes ont un niveau assez élevé:

Créez un nouveau volume EBS de la taille souhaitée (par exemple / dev / xvdg)

Lancer une instance et y attacher les deux volumes EBS

Vérifiez le système de fichiers (du volume racine d'origine): (par exemple) e2fsck -f / dev / xvda1

Réduire au maximum le volume racine d'origine: (par exemple ext2 / 3/4) resize2fs -M -p / dev / xvda1

Copiez les données avec dd:

  • Choisissez une taille de morceau (j'aime 16 Mo)

  • Calculez le nombre de morceaux (en utilisant le nombre de blocs de la sortie resize2fs): blocs * 4 / (chunk_size_in_mb * 1024) - arrondissez un peu pour la sécurité

  • Copiez les données: (par exemple) dd if = / dev / xvda1 ibs = 16M of = / dev / xvdg obs = 16M count = 80

Redimensionnez le système de fichiers sur le nouveau volume EBS (plus petit): (par exemple) resize2fs -p / dev / xvdg

Vérifiez le système de fichiers (du volume racine d'origine): (par exemple) e2fsck -f / dev / xvdg

Détachez votre nouveau volume racine EBS et attachez-le à votre instance d'origine

Je ne parviens pas à trouver une solution détaillée «comment faire».

Mon volume racine EBS est attaché à une instance HVM Ubuntu.

Toute aide sera grandement appréciée.

herve
la source
Cela ressemble à une assez bonne solution étape par étape.
ceejayoz
dd - copie dd disque à disque si = / dev / xvdf de = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Réponses:

6

Dans la console AWS:

  1. Arrêtez l'instance que vous souhaitez redimensionner

  2. Créez un instantané du volume actif, puis créez un volume "SSD à usage général" à partir de cet instantané.

  3. Créez un autre volume «SSD à usage général» à la taille souhaitée.

  4. Attachez ces 3 volumes à l'instance en tant que:

    • / dev / sda1 pour le volume actif.
    • / dev / xvdf pour le volume qui est la taille cible.
    • / dev / xvdg pour le volume créé à partir de l'instantané du volume actif.
  5. Démarrez l'instance.

  6. Connectez-vous à la nouvelle instance via SSH.

  7. créez ces nouveaux répertoires:

mkdir /source /target

  1. créer un système de fichiers ext4 sur un nouveau volume:

mkfs.ext4 /dev/xvdf

  1. montez-le dans ce répertoire:

mount -t ext4 /dev/xvdf /target

  1. Ceci est très important, le système de fichiers a besoin d'un e2label pour que linux le reconnaisse et le démarre, utilisez "e2label / dev / xvda1" sur une instance active pour voir ce que cela devrait être, dans ce cas, le libellé est: "/"

e2label /dev/xvdf /

  1. monter le volume créé à partir de l'instantané:

mount -t ext4 /dev/xvdg /source

  1. Copiez le contenu:

rsync -ax /source/ /target

Remarque: il n'y a pas de "/" suivant "/ cible". En outre, il peut y avoir quelques erreurs sur les liens symboliques et les attr, mais le redimensionnement a toujours réussi

  1. Démontez les systèmes de fichiers:

umount /target
umount /source

  1. De retour dans AWS Console: arrêtez l'instance et détachez tous les volumes.

  2. Attachez le nouveau volume dimensionné à l'instance comme: "/ dev / sda1"

  3. Démarrez l'instance et elle devrait démarrer.

L'ÉTAPE 10 EST IMPORTANTE : étiquetez le nouveau volume avec "e2label" comme mentionné ci-dessus, ou l'instance semblera démarrer dans aws mais ne passera pas la vérification de la connexion.

facture
la source
9
J'ai effectué plusieurs fois ces étapes (Ubuntu 14.04) et chaque fois que j'attache le nouveau volume, l'instance s'arrête. Quelqu'un d'autre connaît ce problème? Cela me crève le cerveau!
thiesdiggity
2
Tu n'es pas le seul. J'ai essayé cette solution et d'autres et comme votre bon moi, mon instance s'arrête également.
blairmeister
1
@blairmeister J'ai eu le même problème, mais j'ai réussi à le faire fonctionner! Jetez un oeil à ma réponse ci-dessous si vous êtes toujours coincé :)
Ruben Serrate
mon e2label est cloudimg-rootfs ... en suivant toutes ces étapes, je peux confirmer que sur Ubuntu 14.04 ne fonctionne pas
NineCattoRules
1
Je dévalise cette réponse car elle ne couvre pas suffisamment de cas d'utilisation pour un volume (comme un volume de démarrage) pour protéger les utilisateurs contre les dommages accidentels.
Jesse Adelman
6

Aucune des autres solutions ne fonctionnera si le volume est utilisé comme périphérique racine (amorçable).

Le disque nouvellement créé ne contient pas la partition de démarrage, il faudrait donc que GRUB soit installé et que certains indicateurs soient correctement configurés avant qu'une instance puisse l'utiliser comme volume racine.

Mon (à partir d'aujourd'hui, travaillant ) solution pour réduire un volume racine est:

Contexte: Nous avons une instance A, dont nous voulons réduire le volume racine. Appelons ce volume VA. Nous voulons réduire la VA de 30 Go à, disons, 10 Go

  1. Créez une nouvelle instance ec2, B, avec le même système d'exploitation que l'instance A. En tant que stockage, choisissez un volume du même type que VA, mais avec une taille de 10 Go. (ou quelle que soit votre taille cible). Nous avons donc maintenant une instance B qui utilise ce nouveau volume (appelons-le VB) comme volume racine.
  2. Une fois la nouvelle instance (B) en cours d'exécution. Arrêtez-le et détachez son volume racine (VB).

REMARQUE: les étapes suivantes sont principalement tirées de la solution de @bill:

  1. Arrêtez l'instance que vous souhaitez redimensionner (A).

  2. Créez un instantané du volume VA, puis créez un volume "SSD à usage général" à partir de cet instantané. Ce volume, nous l'appellerons VASNAP.

  3. Faites tourner une nouvelle instance avec amazon Linux, nous appellerons cette instance C. Nous allons simplement utiliser cette instance pour copier le contenu de VASNAP vers VB. Nous pourrions probablement également utiliser l'instance A pour effectuer ces étapes, mais je préfère le faire sur une machine indépendante.

  4. Attachez les volumes suivants à l'instance C. / dev / xvdf pour VB. / dev / xvdg pour VASNAP.

  5. Redémarrez l'instance C.

  6. Connectez-vous à l'instance C via SSH.

  7. Créez ces nouveaux répertoires:

mkdir /source /target

  1. Formatez la partition principale de VB avec un système de fichiers ext4:

mkfs.ext4 /dev/xvdf1

Si vous n'obtenez aucune erreur, passez à l'étape 11. Sinon, si vous n'avez pas /dev/xvdf1 , vous devez créer la partition en procédant comme suit: i-vii:

i) Si /dev/xvdf1 n'existe pas pour une raison quelconque, vous devez le créer. Entrez d'abord:

sudo fdisk /dev/xvdf.

ii) Essuyez le disque en entrant: wipefs

iii) Créez une nouvelle partition en entrant: n

iv) Entrée ppour créer la partition principale

v) Continuez à appuyer sur Entrée pour continuer avec les paramètres par défaut.

vi) Lorsqu'il demande à nouveau une commande, entrez wpour écrire les modifications et quittez.

vii) Vérifiez que vous avez la /dev/xvdf1partition en faisant: lsblk

Vous devriez voir quelque chose comme:

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

Passez maintenant à l'étape 11.

  1. Montez-le dans ce répertoire:

mount -t ext4 /dev/xvdf1 /target

  1. Ceci est très important, le système de fichiers a besoin d'un e2label pour Linux pour le reconnaître et le démarrer, utilisez "e2label / dev / xvda1" sur une instance active pour voir ce que cela devrait être, dans ce cas, le label est: "/"

e2label /dev/xvdf1 /

  1. Montez VASNAP sur / source:

mount -t ext4 /dev/xvdg1 /source

  1. Copiez le contenu:

rsync -vaxSHAX /source/ /target

Remarque: il n'y a pas de "/" suivant "/ cible". En outre, il peut y avoir quelques erreurs sur les liens symboliques et les attr, mais le redimensionnement a toujours réussi

  1. Umount VB:

umount /target

  1. De retour dans AWS Console: Dettach VB de l'instance C, et également dettach VA de A.

  2. Attachez le nouveau volume dimensionné (VB) à l'instance comme: "/ dev / xvda"

  3. L'instance de démarrage A, maintenant son périphérique racine fait 10 Go :)

  4. Supprimez les deux instances B et C, ainsi que tous les volumes sauf VB, qui est désormais le volume racine de l'instance A.

Ruben Serrate
la source
Quel est votre OS?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
J'ai essayé sur Ubuntu 14.04 et cela ne fonctionne pas
NineCattoRules
@NineCattoRules Ouch ... Je peux confirmer que cela fonctionne pour Amazon Linux, a dû le faire récemment.
Ruben Serrate
1
Ne devrions-nous pas attacher le volume de l'étape 17 au /dev/sda1lieu de /dev/xvda@RubenSerrate?
alper
2

Les étapes suivantes ont fonctionné pour moi

Étape 1. Créez un instantané du volume racine ebs et créez un nouveau volume à partir d'un instantané (appelons cette copie de volume)

Étape 2. Créez une nouvelle instance avec le volume racine ebs avec la taille souhaitée. (appelons ce volume redimensionné) Ce volume ebs aura la partition correcte pour le démarrage. (La création d'un nouveau volume ebs à partir de zéro n'a pas fonctionné pour moi)

Étape 3. Attachez volume-resize et volume-copy à une instance.

Étape 4. Formatez le redimensionnement du volume.

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

Remarque: assurez-vous que le volume de la partition n'est /dev/xvdf1pas entré/dev/xvdf

Étape 5. Montez volume-resize et volume-copy mkdir / mnt / copy mkdir / mnt / resize

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

Étape 6. Copiez les fichiers

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

Étape 7. Assurez-vous que e2label est identique au volume racine

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

Étape 8. Mettez à jour grub.conf sur la copie de volume pour correspondre au nouveau volume udid

Recherchez et remplacez uudid dans /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"

Étape 9. Démonter les volumes

Étape 10. Attachez un nouveau volume ebs redimensionné à l'instance / dev / sda1

DrewJaja
la source
1
Combiner la réponse @ruben serrate avec la mise à jour grub UUID est ce qui a fonctionné pour moi.
Jonathan Maim
Petite note car je viens de perdre du temps: courir blkidsans sudoretourne les résultats mis en cache sans les valider. Il semblera donc que l'UUID n'a pas changé.
Akhil Nair
0

Voici une approche alternative;

Attachez et montez l'ancien volume EBS sur une instance EC2 en cours d'exécution. Si vous souhaitez copier un volume de démarrage, il est préférable de le faire sur une autre instance, avec l'ancien volume monté en tant que données, et non avec le volume utilisé comme système actif.

Créez un nouveau volume EBS de la taille souhaitée.

Attachez le nouveau volume à l'instance et formatez (soigneusement) un nouveau système de fichiers dessus (par exemple, en utilisant mkfs). Montez-le.

Copiez l'ancien contenu du système de fichiers de l'ancien volume vers le nouveau volume:

rsync -vaxSHAX /oldvol/ /newvol/

Démontez le nouveau volume et détachez-le de l'instance.

Si vous copiez le système de fichiers racine, alors:

Créez un instantané EBS du nouveau volume.

Enregistrez l'instantané en tant que nouvelle AMI.

Eric Hammond
la source