Journal Redimensionner un disque qcow2 avec les partitions internes en quelques commandes

Posté par  (site web personnel) .
Étiquettes : aucune
16
6
jan.
2010
qcow2 est le format de prédilection de kvm.
qcow2 est nativement auto-extensible mais parfois on en voit le bout.... Et là, c'est le drâme.

Vos amis pour vous en sortir : qemu-img, dd, losetup, gparted, fdisk, resize2fs

Contexte :
- vous avez créé un fichier qcow2 un peu petit (genre 1Go)
$ qemu-img info vm-img.qcow2
image: vm-img.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 952M
cluster_size: 65536

- vous avez installer une VM avec une seule partition pour /
# fdisk -l /dev/sda

Disque /dev/sda: 1073 Mo, 1073741824 octets
255 têtes, 63 secteurs/piste, 130 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Identifiant de disque : 0x00000000

Périphérique Amorce Début Fin Blocs Id Système
/dev/sda1 * 1 8 64228+ 82 Linux swap / Solaris
/dev/sda2 9 130 979965 5 Etendue
/dev/sda5 9 130 979933+ 83 Linux

- vous avez jouer avec la VM et vous n'avez plus de place de le 1Go du fichier qcow2
- vous voulez ne pas perdre vos données et continuer de jouer avec votre VM

La solution qui marche chez moi :
- éteindre la VM

- convertir votre fichier qcow2 en fichier raw
$qemu-img convert -f qcow2 vm-img.qcow2 -O raw vm-img.raw

- agrandir le fichier qcow2 avec la commande dd :
$dd if=/dev/zero of=vm-img.raw bs=1M count=0 seek=4096
(attention à la valeur du seek. Ici j'obtiens un nouveau fichier vm-img.raw de 4Go)
$ qemu-img info vm-img.raw
image: vm-img.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 924M

- monter le fichier raw dans un loop device
#losetup /dev/loop0 vm-img.raw

- utiliser gparted pour étendre le conteneur de partitions "étendues" :
#gparted /dev/loop0
sélectionner la partition "étendue" et cliquer sur redimensionner, appliquer la modification et quitter gparted

- on vérifie le boulot :
# fdisk -l /dev/loop0

Disque /dev/loop0: 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Identifiant de disque : 0x000bdeda

Périphérique Amorce Début Fin Blocs Id Système
/dev/loop0p1 * 1 8 64228+ 82 Linux swap / Solaris
/dev/loop0p2 9 522 4128705 5 Etendue
/dev/loop0p5 9 130 979933+ 83 Linux

- passer par fdisk pour supprimer la partition contenant / et recréé-là en utilisant le même numéro de partition
# fdisk -l /dev/loop0

Disque /dev/loop0: 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Identifiant de disque : 0x000bdeda

Périphérique Amorce Début Fin Blocs Id Système
/dev/loop0p1 * 1 8 64228+ 82 Linux swap / Solaris
/dev/loop0p2 9 522 4128705 5 Etendue
/dev/loop0p5 9 130 979933+ 83 Linux
[root@localhost VM]# fdisk /dev/loop0

Commande (m pour l'aide): p

Disque /dev/loop0: 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Identifiant de disque : 0x000bdeda

Périphérique Amorce Début Fin Blocs Id Système
/dev/loop0p1 * 1 8 64228+ 82 Linux swap / Solaris
/dev/loop0p2 9 522 4128705 5 Etendue
/dev/loop0p5 9 130 979933+ 83 Linux

Commande (m pour l'aide): d
Numéro de partition (1-5): 5

Commande (m pour l'aide): n
Commande d'action
l logique (5 ou plus)
p partition primaire (1-4)
l
Premier cylindre (9-522, par défaut 9):
Utilisation de la valeur par défaut 9
Dernier cylindre, +cylindres or +taille{K,M,G} (9-522, par défaut 522):
Utilisation de la valeur par défaut 522

Commande (m pour l'aide): w
La table de partitions a été altérée!

Appel de ioctl() pour relire la table de partitions.

ATTENTION : la table de partitions n'a pas pu être relue : erreur 22 : Argument invalide.
Le noyau continue à utiliser l'ancienne table. La nouvelle sera utilisée
lors du prochain démarrage ou après avoir exécuté partprobe(8) ou kpartx(8).
Synchronisation des disques.

- on vérifie le boulot :
# fdisk -l /dev/loop0

Disque /dev/loop0: 4294 Mo, 4294967296 octets
255 têtes, 63 secteurs/piste, 522 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Identifiant de disque : 0x000bdeda

Périphérique Amorce Début Fin Blocs Id Système
/dev/loop0p1 * 1 8 64228+ 82 Linux swap / Solaris
/dev/loop0p2 9 522 4128705 5 Etendue
/dev/loop0p5 9 522 4128673+ 83 Linux

- convertir le fichier raw en fichier qcow2
$qemu-img convert -f raw vm-img.raw -O qcow2 vm-img.new.qcow2
$ qemu-img info vm-img.new.qcow2
image: vm-img.new.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 950M
cluster_size: 65536

- redémarrer votre VM

- redimensionner à chaud la partition /
resize2fs /dev/sda5

Et voilà, elle est belle la vie.
Vous pouvez continuer de jouer dans votre VM.

(test fait avec une Mandriva 2010.0 comme host et une Mandriva 2010.0 en guest)

--
C01N C01N
  • # P2V

    Posté par  (site web personnel) . Évalué à 1.

    Ce qui serait sympa aussi, c'est d'avoir un outil (ou la suite de commandes) pour faire du P2V, cad de la transformation de physique vers "virtuel".

    Ainsi, les vrais gens peuvent virer l'installation corporate proprio par défaut, installer un OS libre, et faire tourner les outils maison dans un guest... quand le besoin^Wobligation se faire ressentir...
    • [^] # Re: P2V

      Posté par  (site web personnel) . Évalué à 6.

      dd.

      $ dd if=/dev/sdb of=machin.img
      $ qemu machin.img
      • [^] # Re: P2V

        Posté par  . Évalué à 2.

        heu non, le format des images disk des logiciels de virtualisation est rarement le format d'une partition physique.
        par contre, dans la même veine, on peut booter la vm sur un cd virtuel et faire un dd par le réseau (virtuel) entre la machine P et la machine V.
    • [^] # Re: P2V

      Posté par  (site web personnel) . Évalué à 6.

      Pas sûr que ça marche mais

      qemu-img convert -f raw /dev/sda -O qcow2 vm-img.qcow2

      permettrait peut-être de n'utiliser comme place que celle effective des données, alors qu'un dd va créer un fichier de la taille du disque dur, quelle que soit l'utilisation du disque.
  • # gpated

    Posté par  (Mastodon) . Évalué à 3.

    Question bête, pourquoi utiliser gparted alors que tu fais tout le reste dans ton shell ?

    Tu pourrais très bien resizer la partition et le fs avec parted ou utiliser une combinaison de fdisk et resize2fs.

    D'ailleurs je trouve dangereux cette idée qu'ont toujours les pécéistes à vouloir confondre partition/slice et fs...
    • [^] # Re: gpated

      Posté par  (site web personnel) . Évalué à 2.

      pour parted : parce que j'avais gparted sous la main.
      Quand à ton problème de confusion partition / fs, personnellement tout va bien et désolé si l'explication rapide dans mon journal est confuse.
  • # arretes moi si je me trompes

    Posté par  . Évalué à 1.

    La solution qui marche chez moi :
    - éteindre la VM

    - convertir votre fichier qcow2 en fichier raw
    $qemu-img convert -f qcow2 vm-img.qcow2 -O raw vm-img.raw

    - agrandir le fichier qcow2 avec la commande dd :
    $dd if=/dev/zero of=vm-img.raw bs=1M count=0 seek=4096
    (attention à la valeur du seek. Ici j'obtiens un nouveau fichier vm-img.raw de 4Go)


    avec ton dd tu vas effacer le contenu du fichier vm-img.raw non ?
    • [^] # Re: arretes moi si je me trompes

      Posté par  (site web personnel) . Évalué à 6.

      je t'arrête.
    • [^] # Re: arretes moi si je me trompes

      Posté par  (Mastodon) . Évalué à 2.

      man dd

      [...]

      of=file

      writes output data to file. If you don't specify this option, dd writes data to the standard output. dd truncates the output file before writing to it, unless you specified the seek=n operand. If you specify seek=n, but do not specify conv=notrunc, dd preserves only those blocks in the output file over which it seeks. If the size of the seek plus the size of the input file is less than the size of the output file, this can result in a shortened output file.


      Quelle partie ne comprends tu pas ?
    • [^] # Re: arretes moi si je me trompes

      Posté par  . Évalué à 2.

      La commande, c'est plutot ca, non ?

      dd if=/dev/zero of=vm-img.raw bs=1M count=3072 seek=1024

      seek: sauter 1024 fois 1M (soit 1 Go) avant d'ecrire sur le fichier
      count : ecrire 3072 fois 1M (soit 3 Go), ce qui nous fait un total de 4Go

      Le bonjour chez vous,
      Yves
      • [^] # Re: arretes moi si je me trompes

        Posté par  . Évalué à 2.

        effectivement c'est plus clair comme ca, merci a_jr.

        comme je n'utilisais que dd pour creer un fichier et pas pour l'etendre, j'avais pas penser qu'on pouvait "sauter" une partie du fichier et ajouter des zero à la fin pour l'agrandir
      • [^] # Re: arretes moi si je me trompes

        Posté par  (site web personnel) . Évalué à 3.

        Si tu ouvres un fichier et que tu seek au-dela de sa taille, sa taille est agrandie.
        • [^] # Re: arretes moi si je me trompes

          Posté par  . Évalué à 2.

          Oui, et surtout, en ne faisant que le seek avec un count de 0, le nouveau fichier ne prend pas plus de place sur le disque. Le fichier devient un fichier avec des trous.
  • # qcow2

    Posté par  . Évalué à -4.

    Pourquoi utiliser le format qcow2 ?

    Il ne sert à rien (sauf si on a un FS pourri).
    • [^] # Re: qcow2

      Posté par  (site web personnel) . Évalué à 8.

      ItWouldBeGood de préciser pourquoi, selon toi, il ne sert à rien...

      Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

    • [^] # Re: qcow2

      Posté par  (site web personnel) . Évalué à 2.

      Je vais essayer d'être aussi précis que toi : parce que.
  • # lvm

    Posté par  . Évalué à 1.

    hello

    perso j'ajoute un disk à mon lvm. Je trouve ça quand même beaucoup moins complexe. Par contre avec kvm je sais pas ajouter un disk à chaud. Si quelqu'un sait faire je suis preneur.

    - arreter la vm
    - ajouter un nouveau disk à la conf
    - relancer la vm
    - pvcreate
    - vgextend
    - lvextend
    - resize2fs

    enjoy :)

    oau

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.