Shrink en environnement KVM / Ext4 qui tourne mal

Hello,

J’ai une VM avec une image disque qcow2 de 20G, tout est dans le /.

J’ai voulu faire un shrink pour diviser passer à 10G la taille de ma VM.

Au final, le résultat est le suivant quand je boot dessus :

Begin: Will now check root file system … fsck from util-linux 2.33.1
[/sbin/fsck.ext4 (1) – /dev/vda1] fsck.ext4 -a -C0 /dev/vda1
/dev/vda1: The filesystem size (according to the superblock) is 2621440 blocks
The physical size of the device is 2621184 blocks
Either the superblock or the partition table is likely to be corrupt!

/dev/vda1: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
(i.e., without -a or -p options)
fsck exited with status code 4
done.
Failure: File system check of the root filesystem failed
The root filesystem on /dev/vda1 requires a manual fsck

BusyBox v1.30.1 (Debian 1:1.30.1-4) built-in shell (ash)
Enter ‹ help › for a list of built-in commands.

Je me suis écris une procédure pour détailler ma démarche, pourriez-vous me dire où est-ce que je me suis planté ?

Nous avons une VM avec un disque de 20G et nous voulons lui affecter un disque de 10G.

Arrêter la VM :

virsh shutdown app3.mavm.org

:!: On fait une sauvegarde du disque ! :!:

cp -arp /stockage/disques_systemes/app3.mavm.org.qcowstockage/disques_systemes/app3.mavm.org.qcow.BAK

Démarrer la VM avec le disque de recue de libvirt, en mode RW :

virt-rescue -d app3.mavm.org –rw

Vérifier l'état de la table des partitions pour bien identifier la cible :

<rescue> fdisk -l

Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8b60bc22

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 41943039 41940992 20G 83 Linux
Démonter la cible (normalement elle n'est pas montée, en mode rescue) :

<rescue> umount /dev/sda1

Faire un check de l'intégrité du fs :

<rescue> e2fsck -f /dev/sda1

e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda1: 52906/655360 files (0.2% non-contiguous), 590221/2621440 blocks
Procéder au resize :

<rescue> resize2fs /dev/sda1 10G

resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/sda1 to 2621440 (4k) blocks.
The filesystem on /dev/sda1 is now 2621440 (4k) blocks long.

Détruire et recréer la partition à la bonne taille :

<rescue> fdisk /dev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8b60bc22

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 41943039 41940992 20G 83 Linux

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): -10G

Created a new partition 1 of type 'Linux' and of size 10 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
On quitte l'environnement de rescue

<rescue> exit

Côté hyperviseur, on recréé l'image à la bonne taille :

qemu-img create -f qcow2 -o preallocation=metadata newimage.qcow2 11G
virt-resize app3.mavm.org.qcow newimage.qcow2
mv newimage.qcow2 app3.mavm.org.qcow

Dans les arrondis. Et plus précisément, ici :

Enlever 10 Gio à la fin du disque pour que la partition ait une taille exacte de 10 Gio, c’est beaucoup trop grossier, et tu as trop réduit.
Relance fdisk et agrandis la partition de ce que tu peux.

Je pense que tu n’aurais pas dû supprimer la signature ext4 de ce système de fichiers.

Si la table des partitions indique toujours qu’il s’agit d’un système de fichiers de type Linux,
la suppression de la signature ext4 du système de fichiers de cette partition
est peut-être la cause du message d’erreur 4 retourné par la commande fsck

@MicP : pourquoi as-tu effacé ta réponse ? Ce n’est peut-être pas la cause du problème, mais c’était une observation pertinente.

Je ne l’avais pas vue passer, celle-là. Pourtant fsck détecte bien un système de fichiers ext4.

Du coup, quelle serait la bonne méthode pour faire cela, sans justement passer par des arrondis grossiers ? Comment obtenir les bonnes valeurs, sans avancer « au hasard » ?

J’avais un doute sur la pertinence de mon message.
Du coup, j’ai remis mon message.

1 J'aime

Définir la taille de la partition ou sa position de fin par rapport à sa position de début et non par rapport à la fin du disque.

Merci à vous deux pour vos explications. Je reprends ma procédure et ferai bien gaffe à cette histoire de signature, effectivement je n’avais pas saisi la portée de ce choix.

Concernant ta réponse Pascal, je ne suis pas sûre de bien comprendre. Si ma partition fait 20G, que je veux en enlever 10G, comment je fais le bon calcul ?
==> Ok j’ai compris, +10G et non -10G

La taille de la partition ne doit pas être inférieure à la taille du système de fichiers. Tu te débrouilles comme tu veux pour respecter cette condition. Soit tu prends de la marge en réduisant d’abord le système de fichiers plus que nécessaire (tu pourras l’agrandir après), soit tu calcules la nouvelle taille au secteur près pour que ça colle.

resize2fs te dit que la nouvelle taille du système de fichiers est de 2621440 blocs de 4 Kio (4096 octets). Tu en déduis le nombre de secteurs de 512 octets minimum de la partition. Si la nouvelle position de fin de la partition est au-delà de ce que tu voulais pour réduire la taille du disque, il faut réduire davantage le système de fichiers. Une granularité de 1 Gio n’est peut-être pas assez précise pour spécifier les tailles ou positions.

1 J'aime

Encore une fois, merci à tous les deux pour la pertinence de vos réponses :slight_smile: C’est tout bon pour moi, ça marche, et j’ai compris comment faire ça proprement.

/edit : pour compléter ma réponse : Après le virt-resize, j’avais comme tu l’as dis taillé avec une granularité trop élevée, virt-resize m’a donc créé une partition supplémentaire de l’espace inutilisé sur le disque.
Ce que j’ai fait pour être au plus juste c’est de retourner dans fdisk, de virer les 2 nouvelles partitions, d’en recréer une seule et laisser fdisk calculer lui-même la bonne taille.

Le mieux restant de taper juste dès le départ, ça demande un petit calcul, mais bon, je suis tout de même à ma cible.

Il y a un caractère espace qui manque dans cette ligne de commande.

Et si le shell que tu utilises est bash
on pourrait la réécrire de cette façon :

cp -arp /stockage/disques_systemes/app3.mavm.org.qcow{,.BAK}
1 J'aime

erreur de typo, oui, mais je vais modifier ma doc pour prendre en compte ta remarque, c’est plus propre.