Продолжая тему, описанную здесь habrahabr.ru/post/252973, опять пишу про увеличение дисков виртуальных машин.
Конфигурация следующая:
Гипервизор сервер Supermicro с KVM и libvirt на Ubuntu.
Гости — Ubuntu с LVM2.
Задача:
Увеличить размер системного дисков без выключения/перезагрузки гостевой ОС.

В комментариях к предыдущей статье habrahabr.ru/post/252973/#comment_8330673 farcaller написал:
Системный тоже можно на лету отресайзить. Для этого в libvirt есть команда:
virsh qemu-monitor-command resized-virtual-machine --hmp «block_resize $DRIVENAME $NEWSIZE»

Для HA проектов это очень важный момент, необходимо непрерывное функционирование сервиса.
Я решил попробовать изменить размер диска при помощи virsh.
Ниже результаты этого успешного эксперимента.

Коротко это было так:
На гипервизоре:
  • virsh list
  • virsh qemu-monitor-command vm-db --hmp «info block»
  • virsh qemu-monitor-command vm-db --hmp «block_resize drive-virtio-disk0 1000G»

На госте:
  • df -h
  • parted /dev/vda
  • print
  • resizepart 2
  • 1000GB
  • resizepart 5
  • 1000GB
  • q
  • pvresize /dev/vda5
  • lvscan
  • lvextend /dev/vm-db-vg/root -l +100%FREE
  • resize2fs /dev/vm-db-vg/root
  • df -h

профит!
Лог с гипервизора

root@hyp-0:/local# ls

ca-1-disk-1.qcow2  vm-db-disk-1.qcow2

root@hyp-0:/local# qemu-img info ./vm-db-disk-1.qcow2

image: ./vm-db-disk-1.qcow2
file format: qcow2
virtual size: 800G (858993459200 bytes)
disk size: 717G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

root@hyp-0:/local# virsh list

 Id    Name                           State
----------------------------------------------------
 2      vm-ag-0               		running
 3      vm-db                  		running
 12    vm-ca-1                 		running

root@hyp-0:/local# virsh qemu-monitor-command  vm-db  --hmp "info block"

drive-virtio-disk0: /local/vm-db-disk-1.qcow2 (qcow2)
drive-ide0-1-0: [not inserted]
    Removable device: not locked, tray closed


root@hyp-0:/local# virsh qemu-monitor-command vm-db --hmp "block_resize drive-virtio-disk0 1000G"

root@hyp-0:/local#  qemu-img info  /local/vm-db-disk-1.qcow2

image: /local/vm-db-disk-1.qcow2
file format: qcow2
virtual size: 1.0T (1073741824000 bytes)
disk size: 717G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
root@hyp-0:/local#


Примерно так выглядит лог с гостя

root@vm-db:/var/lib/postgresql/9.1/main# df -h

Filesystem                                    Size  Used Avail Use% Mounted on
/dev/mapper/vm--db--vg-root  	              730G  671G   22G  97% /
none                                          4.0K     0  4.0K   0% /sys/fs/cgro 
udev                                           29G  4.0K   29G   1% /dev
tmpfs                                         5.8G  360K  5.8G   1% /run
none                                          5.0M     0  5.0M   0% /run/lock
none                                           29G     0   29G   0% /run/shm
none                                          100M     0  100M   0% /run/user
/dev/vda1                                     236M   95M  129M  43% /boot

root@vm-db:/sys/block/vda/device# parted /dev/vda

GNU Parted 2.3
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 1074GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End    Size   Type      File system  Flags
 1      1049kB  256MB  255MB  primary   ext2         boot
 2      257MB   859GB  859GB  extended
 5      257MB   859GB  859GB  logical                lvm

(parted) resizepart 2
End?  [859GB]? 1000GB
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 1074GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  256MB   255MB   primary   ext2         boot
 2      257MB   1000GB  1000GB  extended
 5      257MB   859GB   859GB   logical                lvm

(parted) resizepart 5
End?  [859GB]? 1000GB
(parted) q

root@vm-db:/sys/block/vda/device# lvscan

File descriptor 7 (pipe:[9143432]) leaked on lvscan invocation. Parent PID 5423: bash
  ACTIVE            '/dev/vm-db-vg/root' [741.17 GiB] inherit
  ACTIVE            '/dev/vm-db-vg/swap_1' [58.59 GiB] inherit

root@vm-db:/sys/block/vda/device# lvextend /dev/vm-db-vg/root -l +100%FREE

File descriptor 7 (pipe:[9143432]) leaked on lvextend invocation. Parent PID 5423: bash
  Extending logical volume root to 872.49 GiB
  Logical volume root successfully resized

root@vm-db:/sys/block/vda/device# resize2fs /dev/vm-db-vg/root
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/vm-db-vg/root is mounted on /; on-line resizing required
old_desc_blocks = 47, new_desc_blocks = 55
The filesystem on /dev/vm-db-vg/root is now 228718592 blocks long.

root@vm-db:/sys/block/vda/device# df -h
Filesystem                                    Size  Used Avail Use% Mounted on
/dev/mapper/vm--db--vg-root  	              859G  678G  140G  83% /
none                                          4.0K     0  4.0K   0% /sys/fs/cgroup
udev                                           29G  4.0K   29G   1% /dev
tmpfs                                         5.8G  364K  5.8G   1% /run
none                                          5.0M     0  5.0M   0% /run/lock
none                                           29G     0   29G   0% /run/shm
none                                          100M     0  100M   0% /run/user
/dev/vda1                                     236M   95M  129M  43% /boot


Хочу предупредить, что цифры в логах могут содержать неточности, я их восстанавливал, чистил и лог гостя собран с 2х виртуальных машин, на которых я успешно отресайзил / диски на лету.
В заключение хочу сказать огромное спасибо farcaller за наводку на действительно нужную возможность.
Продолжать тему?

Проголосовало 117 человек. Воздержалось 24 человека.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (7)


  1. amarao
    03.07.2015 19:19
    +5

    Проект, который не может пережить выключение виртуалки, не является HA-проектом. Извините за банальности.


    1. BuriK666
      03.07.2015 19:26

      Выключать/перезагружать виртуалку, когда можно обойтись без этого. тоже как-то не очень.


      1. amarao
        03.07.2015 19:28
        +4

        С тем, что есть ситуации, когда ребутаться не хочется, я не спорю. Меня возмутило называние этой ситуации 'HA'.


  1. digger3d Автор
    03.07.2015 21:34

    Огромное спасибо за комментарии, уважаемый amarao!
    Вы, вероятно, невнимательно читали мои статьи. Я не называл никаких проектов, я лишь описал ситуацию, которая может сильно пригодиться админам, которые работают с поддержкой серверов. Эта технология увеличения отлично подходит для сисадминов в датацентрах. Если обратить внимание на смысл предисловия: «я провел эксперимент», а не «мой HA проект...».
    И да, согласен, проектировать HA нужно так, чтобы падение виртуалки не рубило доступность. Можно в облаке, можно в кластерах.


  1. navion
    04.07.2015 00:33

    На CentOS не работает:

    Скрытый текст
    (parted) print
    Model: VMware, VMware Virtual S (scsi)
    Disk /dev/sda: 42.9GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos

    Number Start End Size Type File system Flags
    1 1049kB 525MB 524MB primary ext4 boot
    2 525MB 21.5GB 20.9GB primary lvm

    (parted) resize 2
    Start? [525MB]?
    End? [21.5GB]?
    Error: Could not detect file system.


    1. navion
      04.07.2015 17:19

      Это с шестой, на седьмой даже команду resize убрали.
      Неужели увеличить раздел можно только в выключенном состоянии через GParted?


    1. navion
      04.07.2015 18:22
      +1

      Тут описан способ работающий в CentOS:
      unix.stackexchange.com/a/67107

      Для LVM будут некоторые нюансы:
      1. В fdisk разделы создаёт команда n, а для LVM идентификатор будет 8e.
      2. Перед расширением lv надо выполнить pvextend.
      3. lvextend можно запустить с ключом -r, который автоматически расширит расширит ФС (вызвав resize2fs или xfs_growfs).