
В этой статье мы поговорим о том, как изменить размер дисков виртуальной машины KVM для популярных типов дисков. Мы покажем, как правильно увеличить размер диска виртуальной машины в гипервизоре KVM на Linux без потери данных, и обсудим варианты уменьшения размера диска.
Как увеличить/расширить размер диска виртуальной машины KVM?
Увеличение виртуального диска на KVM
Рассмотрим пример увеличения размера виртуального диска объемом 20 ГБ. Перед изменением настроек виртуального диска выключите ВМ.
Чтобы просмотреть настройки виртуального диска виртуальной машины KVM, используйте эту команду:
qemu-img info /path_to_disk
Результат будет выглядеть следующим образом:
Мы видим, что есть два поля, которые показывают размер: virtual_size и disk_size:
- виртуальный_размер — размер виртуального диска, задаваемый при создании или расширении диска (в данном примере максимальный размер диска составляет 20 ГБ);
- размер_диска — это текущий размер дискового файла, т. е. сколько места занимает диск на физическом сервере (применимо только к формату диска qcow). В нашем примере виртуальный диск занимает на хранилище всего 1,6 ГБ.
На следующем этапе я увеличу размер виртуальной машины на 5 ГБ (чтобы правильно расширить диск, виртуальная машина не должна иметь никаких снимков!)
# qemu-img resize /path to disk +5G
Image resized.
Если вы проверите настройки виртуального диска, то заметите, что он был расширен:
# qemu-img info /path_to_disk
image: /path_to_disk file format: qcow2 virtual size: 25G (26843535600 bytes) disk size: 1.6G cluster_size: 65536 Format specific information: compat: 0.10 refcount bits: 16
Мы выполнили часть работы, но нам также необходимы некоторые действия в гостевой ОС виртуальной машины. Сейчас мы покажем, как увеличить размер диска в гостевой CentOS 7 и Windows Server 2012 R2.
qemu-img
и virsh
используются инструменты.Как расширить раздел на виртуальной машине под управлением CentOS Linux?
После увеличения размера виртуального диска на стороне KVM-сервера запустите виртуальную машину и подключитесь к ней. Мы будем использовать инструмент управления разделами жесткого диска fdisk для увеличения размера разделов и файловых систем.
Подключитесь к гостевой ОС ВМ по SSH и убедитесь, что появилось дополнительное дисковое пространство размером 5 Гб.
df –h
fdisk -l
На скриншоте видно, что раздел /dev/vda2 имеет размер 20 ГБ, а доступное дисковое пространство составляет 25 ГБ.
Давайте расширим /dev/vda2 до максимально доступного размера:
# fdisk /dev/vda
Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): d Partition number (1,2, default 2): Partition 2 is deleted Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (2-4, default 2): First sector (1050624-52428799, default 1050624): Using default value 1050624 Last sector, +sectors or +size{K,M,G} (1050624-52428799, default 52428799): Using default value 52428799 Partition 2 of type Linux and of size 24.5 GiB is set 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.
Затем перезапустите виртуальную машину и выполните команду, которая применит новый размер диска:
# xfs_growfs /dev/vda2
meta-data=/dev/vda2 isize=512 agcount=4, agsize=1277888 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=5111552, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 5111552 to 6422272
# df -h
Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 6.6M 489M 2% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda2 25G 1.3G 24G 6% / /dev/vda1 488M 100M 353M 23% /boot tmpfs 100M 0 100M 0% /run/user/0
В результате мы получили расширенный раздел /dev/vda2. Вот что именно мы сделали:
- fdisk /dev/vda — мы запустили fdisk и подключились к /dev/vda;
- /d — мы удалили раздел. По умолчанию нам нужен был именно раздел 2, поэтому в следующем пункте мы просто нажали Enter;
- /n — мы создали новый раздел и нажали Enter или p, затем снова нажмите Enter, поскольку раздел, который мы пытаемся создать, по умолчанию будет равен 2;
- При указании первого и последнего сектора мы также просто нажимаем Enter, если хотим расширить раздел до максимума. Если вы хотите задать конкретный размер, введите размер диска в последнем секторе, как показано в меню +size{K,M,G};
- /w — чтобы применить новые настройки.
После перезапуска ВМ проверьте диск с помощью этой команды:
xfs_growfs /dev/vda2
Некоторые источники рекомендуют использовать следующую команду :
resize2fs /dev/vda2
Но она не будет работать для файловой системы XFS!
Таким образом, вы увеличили размер диска на виртуальной машине под управлением CentOS 7.
Как увеличить размер диска в гостевом Windows Server?
Подключитесь к виртуальной машине Windows Server с помощью RDP или VNC и увеличьте размер диска.
- Откройте Server Manager -> Tools -> Computer Management;
- Выберите Хранение -> Управление дисками в левой панели. Появятся все разделы диска и добавленное нераспределенное пространство;
- Выберите раздел, который вы хотите увеличить, и нажмите кнопку Расширить том;
- По умолчанию для увеличения размера диска будет предложено все доступное пространство;
- Нажмите кнопку Далее, чтобы завершить расширение. После этого размер вашего раздела будет увеличен.
Хочу отметить, что перед расширением диска виртуальной машины я рекомендую создать резервную копию виртуального диска. Остановите виртуальную машину и скопируйте образ диска в каталог резервного копирования, где есть свободное место. Если в процессе расширения что-то пойдет не так, вы всегда сможете восстановить образ виртуального диска из резервной копии.
Как уменьшить размер диска виртуальной машины KVM?
В своей работе я часто сталкиваюсь с этим вопросом, но, к сожалению, безопасно уменьшить размер диска виртуальной машины в KVM нельзя. Единственный приемлемый способ уменьшить размер виртуального диска на физическом хранилище — это преобразовать его.
В сети можно найти множество руководств, рассказывающих о том, как уменьшить дисковое пространство виртуальной машины KVM, но это не работает.
Я приведу несколько примеров, с которыми я столкнулся и которые протестировал.
Уменьшение размера диска KVM с помощью Qemu
Некоторые ресурсы описывают действия, которые можно выполнить с помощью инструмента qemu. Они предлагают уменьшить дисковое пространство виртуальной машины с помощью этой команды:
qemu-img resize /path_to_disk -5G
— уменьшить дисковое пространство на 5 Гб
Или следующий вариант, в котором задается конкретный размер виртуального диска:
qemu-img resize /path_to_disk 25G
— установить размер диска в 25 Гб
Что произойдет после выполнения этой команды? После запуска сервера система не загружается:
Unable to verify superblock, continuing... Sorry, could not find valid secondary superblock. Exiting now.
Я попытался сначала уменьшить размер диска в системе с помощью fdisk, но система тоже не загружается, даже если пропустить уменьшение размера диска на физическом сервере. И это вполне логично. Раздел, который мы пытаемся уменьшить, является системным, и ОС не загружается, так как информация на нем явно стирается при попытке уменьшить его размер.
Уменьшение размера виртуального диска с помощью замены образа
Менее популярный вариант в этих руководствах — уменьшение дискового пространства с помощью замены диска. Это означает, что вы создаете новую виртуальную машину с нужным вам размером диска. Затем вы заменяете новый образ диска на старый, и это работает, судя по описаниям в разных источниках. Я проверил этот метод, и файловая система стала неработоспособной, как и в предыдущем варианте. Вот пример команды:
virt-resize /old_disk_image /new_disk_image
Было также несколько методов, использующих конвертацию диска из формата raw в формат qcow2, но я изначально создаю машины в этом формате, и вот объяснение, почему я так делаю.
Форматы дисков KVM и сжатие дисков QCOW2
В начале статьи я упомянул эти два дисковых формата: raw и qcow.
Raw преимуществами являются максимальная производительность и универсальность. Но у него много недостатков, основные из которых:
- Файл виртуального диска занимает все отведенное ему место на физическом сервере;
- Вы не можете делать моментальные снимки.
Qcow2 это собственный формат гипервизора QEMU и QEMU-KVM. Это наиболее удобный формат виртуального диска из всех других форматов, поддерживаемых в KVM. Образ диска увеличивается по мере накопления данных в виртуальной машине, поддерживаются моментальные снимки.
В чем преимущества qcow2? Вам не нужно уменьшать размер виртуального диска, так как он занимает на серверном хранилище только столько места, сколько ему необходимо. Если на вашем сервере данные постоянно перезаписываются, и диск разбух, вы можете легко его сжать. Давайте рассмотрим этот вариант. Я заполню некоторое пространство виртуального диска нулями, а затем удалю файл:
dd if=/dev/zero of=/mytempfile
rm -rf /mytempfile
При проверке с вашего сервера ранее размер образа диска составлял 2,4 Гб, а затем стал 5,9 Гб:
# du -sh /image_path
2.4G *****
# du -sh /image_path
5.9G *****
Это означает, что после удаления информации с виртуальной машины размер виртуального диска не уменьшился. Чтобы файл виртуального диска мог получить свой реальный размер, я использую следующий метод:
Создайте резервную копию файла виртуального диска, остановите виртуальную машину, а затем выполните следующие действия:
qemu-img convert -O qcow2 /old_image /new_image
Затем можно сравнить размеры обоих дисков:
# du -sh /new_disk
1.6G /****
# du -sh /old_disk
5.8G /****
Как видите, размер сжатого диска составляет 1,6 Гб. Переименуйте новый файл образа диска так, как вам нужно, и запустите виртуальную машину:
# df -h
Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 6.6M 489M 2% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda2 25G 1.3G 24G 6% / /dev/vda1 488M 100M 353M 23% /boot tmpfs 100M 0 100M 0% /run/user/0
Этот метод работает. За все время его использования у меня не было ни одной ситуации, когда файловая система виртуальной машины дала бы сбой. Но я настоятельно рекомендую перед этим сделать резервную копию диска, чтобы не потерять данные.
Вот и все, что я хотел рассказать в этой статье. Если кто-то из посетителей этого сайта знает другие действительно действенные методы уменьшения размера диска на KVM (не сжатия), опишите их здесь, и я протестирую их.