JezVirt

Ouléé, la virtu à ma manière: KISS et cool :-)

Rajouter de l'espace disque sur une VM

Oué, alors, on a de tout et de rien sur ce sujet. Le premier truc, c'est que ça PEUT se faire à chaud, depuis une version pas trop vieille de QEMU/KVM. La procédure:

  1. Sur l'hyperviseur:
    1. On choppe les infos sur l'image de la VM, ici jezweb :
      virsh qemu-monitor-command jezweb  --hmp "info block"
      On obtient un message du type::
      drive-virtio-disk0: removable=0 io-status=ok file=/srv/vms/vm_jezweb.img ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
      On identifie deux choses:
      • Le périphérique au niveau de la VM: drive-virtio-disk0
      • Le fichier qcow2 associé: drive-virtio-disk0: removable=0 io-status=ok file=/srv/vms/vm_jezweb.img ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
    2. On check la taille de l'image:
      qemu-img info /srv/vms/vm_jezweb.img
      On obtient la taille virtuelle, celle que le guest pourra utiliser, et la taille actuellement utilisée sur le disque:
      image: /srv/vms/vm_jezweb.img
      file format: qcow2
      virtual size: 10G (16106127360 bytes)
      disk size: 7.8G
      cluster_size: 65536
    3. On rajoute l'espace qu'il faut sur l'image disque, ici 10Go:
      qemu-img resize /srv/vms/vm_jezweb.img +10G
    4. On signale à la VM que la taille de son disque dur à changé (c'est le truc tricky):
      virsh qemu-monitor-command jezweb  --hmp "block_resize drive-virtio-disk0 20G"
      
  2. Sur la VM:
    1. Du coté de la VM, on devrait avoir dans le dmesg. Si y'a pas, c'est que c'est pas bon:
      [12253.056172] virtio_blk virtio1: new size: 31457280 512-byte logical blocks (16.1 GB/15.0 GiB)
      [12253.056182] vda: detected capacity change from 10485760000 to 16106127360
      Note: Si vous ne voyez pas votre device, vous pouvez tenter un scan des devices PCI:
      echo "- - -" > /sys/class/scsi_host/host*/scan
      
    2. Une fois qu'on a un disque dur plus gros, on peut jouer avec les partitions. Je n'utilise que du LVM sur mes VMs, alors ça sera avec LVM qu'on continue:
      fdisk /dev/vda
      ## Ou avec cfdisk, mais je crois que c'est moins fiable (sources?)
      cfdisk /dev/vda
    3. De l'espace disque en fin de disque a du apparaître. La méthode consiste à supprimer la partition LVM existante, et à en recréer une qui commence au même endroit (même block) mais qui finit à la fin du disque. Il faut bien noter le block de départ et d'arrivé de la partition que l'on veut resizer, au cas où les valeurs par défaut de fdisk sont erronnées:
      root@jezweb:/var/www/jeznet.org# fdisk /dev/vda
      
      Command (m for help): p
      
      Disk /dev/vda: 16.1 GB, 16106127360 bytes
      16 heads, 63 sectors/track, 31207 cylinders, total 31457280 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk identifier: 0x00000000
      
         Device Boot      Start         End      Blocks   Id  System
      /dev/vda1   *          63      391103      195520+  83  Linux
      /dev/vda2          391104    20479999    10044448   8e  Linux LVM
      
      Command (m for help): d 
      Partition number (1-4): 2
      
      Command (m for help): n
      Partition type:
         p   primary (1 primary, 0 extended, 3 free)
         e   extended
      Select (default p): p
      Partition number (1-4, default 2): 
      Using default value 2
      First sector (391104-31457279, default 391104): 
      Using default value 391104
      Last sector, +sectors or +size{K,M,G} (391104-31457279, default 31457279): 
      Using default value 31457279
      
      Command (m for help): p
      
      Disk /dev/vda: 16.1 GB, 16106127360 bytes
      16 heads, 63 sectors/track, 31207 cylinders, total 31457280 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk identifier: 0x00000000
      
         Device Boot      Start         End      Blocks   Id  System
      /dev/vda1   *          63      391103      195520+  83  Linux
      /dev/vda2          391104    31457279    15533088   83  Linux
      
      Command (m for help): w
      The partition table has been altered!
      
      Calling ioctl() to re-read partition table.
      
      WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
      The kernel still uses the old table. The new table will be used at
      the next reboot or after you run partprobe(8) or kpartx(8)
      Syncing disks.
    4. Une relecture de la table de partition au niveau système sera probablement nécéssaire:
      blockdev --rereadpt /dev/vd
      # Ou avec partprobe, dans le packet de parted
      partprobe /dev/vda
      
    5. On ajuste le PV pour gagner de l'espace:
      pvresize /dev/vda2
      

Rajouter un disque sur une VM

  1. On crée un nouveau disque sur l'hyperviseur:
    cd /srv/vms
    qemu-img create -f qcow2 -o preallocation=metadata vm_<VM>_<NAME>.img <TAILLE>G
    Exemple:
    root@jezhyp:/srv/vms# qemu-img create -f qcow2 -o preallocation=metadata vm_storage_data.img 100G
    
  2. On vérifie que les modules acpiphp et pci_hotplug sont chargés:
    1. modprobe acpiphp pci_hotplugEt on vérifie que c'est bien chargé:
      lsmod | grep -iE '(acpiphp)|(pci_hotplug)' 
    2. Si ça ne marche pas ou qu'il n'y a pas de résultats, c'est que c'est peut être déjà chargé dans le noyau. Pour vérifier, on regarde que les modules soient bien chargés:
      grep -iE '(acpiphp)|(pci_hotplug)' /var/log/messages
      
  3. On attache le disque à la VM, et ce de manière permanente (avec l'option --config):
    virsh attach-disk storage  /srv/vms/vm_storage_data.img vdb --config --driver qemu --subdriver qcow2
    
    Exemple:
    virsh attach-disk example-domain /path/to/another/image vdb --config --driver qemu --subdriver qcow2
  4. Si ça a fonctionné, on peut voir avec un dmsg sur la VM:
    [...]
    [ 5036.337987] virtio-pci 0000:00:06.0: enabling device (0000 -> 0003)
    [ 5036.338905] ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11
    [ 5036.338967] virtio-pci 0000:00:06.0: setting latency timer to 64
    [ 5036.339369] virtio-pci 0000:00:06.0: irq 45 for MSI/MSI-X
    [ 5036.339397] virtio-pci 0000:00:06.0: irq 46 for MSI/MSI-X
    [ 5036.468289]  vdb: unknown partition table
    

Réduire ou agrandir une partition (LVM)

Ça c'est tout simple, mais un peu touchy pour la réduction. Avant de commencer, quelques notes:

  • L'augmentation de la taille d'une parition ext3/4 peut se faire à chaud, c'est à dire sans démonter la partition.
  • La réduction d'une partition quand elle peut corrompre vos données si elle est mal faite, en l'occurence si vous réduisez la partition en deça de la taille du système de fichier.
  • A ma connaissance, la réduction d'une partition nécéssite le démontage de la partition, et donc de couper tous les processus qui accèdent à cette partition.
  • La limitation du fait que ça soit possible à chaud ou non dépends essentiellement du système de fichier de la partition. Ici, ça fonctionne avec ext3 et ext4.

C'est parti!

  1. Ajout d'espace disque:
  2. Réduction d'espace disque
    1. On regarde la taille minimale que la partition peut prendre:
      # df -h | grep /dev/mapper/system-sys_backup_mother
      /dev/mapper/system-sys_backup_mother  493G   57G  412G  12% /backup_mother
      
      La taille minimal est donc de 57G, mais il faut toujours prendre un peu plus, pour ne pas couper les données. On la retailler à 60G.
    2. On démonte la partition (obligatoire):
      umount /dev/mapper/system-sys_backup_mother
    3. On check la partition (obligatoire):
      e2fsck -f /dev/mapper/system-sys_backup_mother
    4. On réduit la taille du système de fichier:
      resize2fs /dev/mapper/system-sys_backup_mother 60G
      
    5. On réduit la taille de la partition, mais obligatoirement un peu moins que ce que l'on a réduit sur le système de fichier. Prendre 5 Go de plus est une sécurité non négociable, 1 Go est le minimum. En dessous de ça, vous risquez de corrompre votre système de fichier, et de perdre des fichiers.
      lvresize -L65G /dev/mapper/system-sys_backup_mother
        WARNING: Reducing active logical volume to 65.00 GiB
        THIS MAY DESTROY YOUR DATA (filesystem etc.)
      Do you really want to reduce sys_backup_mother? [y/n]: y
        Reducing logical volume sys_backup_mother to 65.00 GiB
        Logical volume sys_backup_mother successfully resized
      
      Comme vous le voyez, LVM vous prévient de pas faire de boulettes.
    6. On récupère l'espace disque manquant en retaillant le système de fichier à son maximum (on précise pas la taille cette fois-ci):
      resize2fs /dev/mapper/system-sys_backup_mother 
    7. On remonte la partition:
      mount /dev/mapper/system-sys_backup_mother
    8. C'est fini, je vous invite à voir la taille de votre partition avec un df -h

Récupérer de l'espace disque sur un fichier qcow2

L'idée est d'écrire un fichier avec que des zeros dedans sur toutes les partitions de la VM. On éteint la VM, et au niveau du fichier qcow2:
qemu-img convert -O qcow2 vm.qcow2 vm_shrinked.qcow2

Utiliser le ballooning

Bon, c'est un peu naze, je pensais que c'était automatique de base, mais non, c'est manuel. Dans la conf du guest:
hyp# virsh edit ma_vm
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>131072</currentMemory>
Au niveau du guest:
guest# lsmod  | grep virtio
virtio_balloon         12832  0
virtio_blk             12874  3
virtio_net             17808  0
virtio_pci             13207  0
virtio_ring            13148  4 virtio_pci,virtio_net,virtio_blk,virtio_balloon
virtio                 13093  5 virtio_ring,virtio_pci,virtio_net,virtio_blk,virtio_balloon
Pour jouer avec l'ensemble (depuis l'hyperviseur):
# Defini le guest à 256M
hyp# virsh setmem ma_vm 256M

Plus d'infos: http://earlruby.org/2014/05/increase-a-vms-vcpu-count-with-virsh/

Augmenter le nombre de CPU (sucks :/ )

Super naze, ça ne se fait pas à chaud avec virsh. Infos: http://earlruby.org/2014/05/increase-a-vms-vcpu-count-with-virsh/

Page last modified on January 14, 2015, at 07:03 PM EST