Как увеличить дисковое пространство гостя KVM?


100

Я установил гостевую систему Ubuntu на хосте CentOS KVM с изначально 6 ГБ дискового пространства. Как мне увеличить дисковое пространство гостя Ubuntu из командной строки?

РЕДАКТИРОВАТЬ # 1: я использую файл образа диска (qemu).


Ответы:


116
  1. остановить ВМ
  2. запустить, qemu-img resize vmdisk.img +10Gчтобы увеличить размер изображения на 10 Гб
  3. запустите виртуальную машину, измените размер разделов и структуру LVM внутри нее, как обычно

Ах, вы меня опередили, я только что заметил параметры изменения размера на qemu-img на странице руководства. Так что это сэкономит пару шагов. Приятно!
Slm

1
Работал над изменением размера моего * .qcow2 img на RHEL6.6. Спасибо!
Джейкоб Гулден

8
start the VM, resize the partitions and LVM structure within it normallyКак это сделать? Пожалуйста, объясните это.
Ваки

1
Вы не можете передать все на блюдо. Если вы пытались и не смогли изменить размер разделов или LV, откройте новый вопрос, опишите, что вы пробовали, а что не сработало
dyasny

4
Чтобы изменить размеры разделов и LVM, выполните все шаги, описанные в этой превосходной статье: sandilands.info/sgordon/…
skonsoft

32

Онлайн-метод (с использованием qemu, libvirt и virtio-block)

Что бы там ни было, приведенные ниже команды будут выполняться, даже если целевой виртуальный диск смонтирован. Это может быть полезно в средах, где диск не может быть размонтирован (например, корневой раздел), виртуальная машина должна оставаться включенной, и владелец системы готов принять на себя риск повреждения данных . Чтобы устранить этот риск, вам необходимо войти в виртуальную машину и сначала размонтировать целевой диск, что не всегда возможно.

Выполните следующее из гипервизора KVM.

  1. Увеличьте размер самого файла образа диска (укажите сумму для увеличения):

    qemu-img resize <my_vm>.img +10G
    
  2. Получите имя устройства virtio через оболочку libvirt ( drive-virtio-disk0в этом примере):

    virsh qemu-monitor-command <my_vm> info block --hmp
      drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/<my_vm>.img ro=0 drv=raw encrypted=0
      drive-ide0-1-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
    
  3. Подайте сигнал драйверу virtio для определения нового размера (укажите общую новую емкость):

    virsh qemu-monitor-command <my_vm> block_resize drive-virtio-disk0 20G --hmp
    

Затем войдите в ВМ. Запуск dmesgдолжен сообщить, что диск virtio обнаружил изменение емкости. На этом этапе, измените размер ваших разделов и структуры LVM по мере необходимости.


4
Страница man для qemu-img (моя датирована 2016-05-08) гласит: « Предупреждение. Никогда не используйте qemu-img для изменения образов, используемых на работающей виртуальной машине или любом другом процессе; это может разрушить образ. Имейте в виду, что при запросе изображения, которое изменяется другим процессом, может возникнуть противоречивое состояние. " Поэтому я не уверен, является ли (первый шаг) безопасным, когда виртуальная машина все еще работает.
user44400

Не работает на centos7 + kvm
e-info128

1
Это отлично сработало для меня. Использование блоков ceph и virtio. мы храним данные приложения / MySQL db в отдельном разделе. Остановите приложения, обращающиеся к этому разделу. Размонтируйте это. Измените его размер. Fsck. затем установите его снова с новым размером. Нет необходимости выключения.
nelaaro

То же, что и в этом ответе, но с использованием libvirt вместо консоли монитора: serverfault.com/a/952868/30946
Мирча Вутцовичи

21

Эти вопросы о сбое сервера похожи, но конкретнее, изменение размера диска KVM онлайн? & Centos Xen изменяет размер раздела DomU и группы томов . Первый задает вопрос о том, как увеличить гостевой KVM, пока он находится в сети, а второй - для XEN с использованием LVM. Я спрашиваю, как этого добиться, пока KVM отключен.

ПРИМЕЧАНИЕ. Эта ссылка была полезна для МЕТОДА № 1 и показывает, как добиться увеличения дискового пространства KVM (на основе ext3), HOWTO: Изменение размера образа виртуальной машины KVM .

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

МЕТОД # 1: Разделы основаны на ext2 / ext3 / ext4

Орехами этого метода являются следующие:

# 1. stop the VM
# 2. move the current image
mv mykvm.img mykvm.img.bak

# 3. create a new image
qemu-img create -f raw addon.raw 30G

# 4. concatenate the 2 images
cat mykvm.img.bak addon.raw >> mykvm.img

Теперь, когда файл mykvm.img увеличен, загрузите gparted и расширьте существующий раздел на только что добавленное дисковое пространство. Этот последний шаг в основном расширяет раздел ОС, чтобы он мог использовать дополнительное пространство.

МЕТОД № 2: Разделы на основе LVM

Вот шаги, которые я примерно выполнил, чтобы изменить размер гостевой системы KVM, которая использовала LVM для внутреннего использования.

  1. Отключить ВМ
  2. добавить больше места в "файл изображения" гостя (что-то вроде: cat old.img 10G_addon.raw >> new.img
  3. запустить виртуальную машину (используя только что созданный new.img)
  4. запустить fdisk внутри виртуальной машины и удалить и заново создать раздел LVM

    % fdisk /dev/vda
    ...
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        3263    26105625   8e  Linux LVM
    
    Command (m for help): d
    Partition number (1-4): 2
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    
    Command (m for help): n 
    Command action
      e   extended
      p   primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (14-5874, default 14): 14
    Last cylinder or +size or +sizeM or +sizeK (14-5874, default 5874): 
    Using default value 5874
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        5874    47078482+  83  Linux
    
    Command (m for help): t
    Partition number (1-4): 2
    Hex code (type L to list codes): 8e
    Changed system type of partition 2 to 8e (Linux LVM)
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        5874    47078482+  8e  Linux LVM
    
    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.
    Syncing disks.
    %
    
  5. Перезагрузите ВМ

  6. Изменить размер физического тома LVM

    % pvdisplay 
      --- Physical volume ---
      PV Name               /dev/vda2
      VG Name               VolGroup00
      PV Size               24.90 GB / not usable 21.59 MB
      Allocatable           yes (but full)
      PE Size (KByte)       32768
      Total PE              796
      Free PE               0
      ...
    
    % pvresize /dev/vda2
    
    % pvdisplay
      --- Physical volume ---
      PV Name               /dev/vda2
      VG Name               VolGroup00
      PV Size               44.90 GB / not usable 22.89 MB
      Allocatable           yes 
      PE Size (KByte)       32768
      Total PE              1436
      Free PE               640
      ...
    
  7. Изменить размер логического тома LVM

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
  8. Расти файловую систему

      % resize2fs /dev/VolGroup00/LogVol00 
      resize2fs 1.39 (29-May-2006)
      Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
      Performing an on-line resize of /dev/VolGroup00/LogVol00 to 11501568 (4k) blocks.
      The filesystem on /dev/VolGroup00/LogVol00 is now 11501568 blocks long.
    

Выше приведен мой пример, но я следовал инструкциям на этом сайте


Метод № 1 в этом посте, похоже, не очень хорошо работает - менеджер виртуальных машин в красной шапке не сообщает о новом размере впоследствии. Метод, предложенный @dyasny, кажется, работает лучше, по крайней мере, в этом отношении.
Иван Аукамп

@IwanAucamp - интересно, я использовал virt-managerи широко использовал метод № 1 и № 2, прежде чем перевести наши KVM-серверы на более новую версию KVM (CentOS 5 -> CentOS 6). Я сейчас тоже использую qemu-img resizeметод.
SLM

Для метода # 2 вы можете найти lvextend handier как шаг 7: lvextend /dev/Volgroup/lvname /dev/vda2(все в одной строке, где / dev / vda2 будет вашим физическим томом). Без каких-либо других параметров будет использоваться максимальный размер в этой группе томов.
Майк С

Метод № 2, шаг 4 не будет работать, если в таблице разделов есть логические тома. После воссоздания расширенного типа раздела первый доступный сектор больше не будет соответствовать тому, который был до изменений. Например, если первый сектор вашего логического раздела был 1001472, то после изменений он будет 1003518 (при условии 10 ГБ диска до и 50 ГБ после изменения размера). Кто-нибудь знает, как воссоздать, если это вообще возможно, логические тома в одном и том же первом секторе?
ILIV

1
Это связано с тем, что fdisk по умолчанию применяет ограничения выравнивания (шаг 1 МБ) к разделам. Чтобы обойти это, примите значение по умолчанию 1003518, войдите в экспертный режим (x), затем выберите b и установите первый сектор на 1001472. Подробнее см. Unix.stackexchange.com/a/320447 .
ILIV

11

Изменение размера и расширение внутренних разделов за один шаг

У меня был хост Ubuntu с образом гостевого файла qcow2, и я хотел изменить размер диска и расширить соответствующие разделы за один шаг. Требуется настроить служебные программы гостевой файловой системы libvirt, но в любом случае их полезно иметь.

Вдохновение отсюда: http://libguestfs.org/virt-resize.1.html

Ключевая команда здесь: virt-resize

  • это утилита libvirt
  • он может расширить гостевой диск и расширить разделы внутри за один шаг
  • он копирует диск, он не расширяет его на месте
    • это хорошо, потому что у вас есть нетронутый оригинал в качестве резервной копии

Приготовление:

* Install libvirt file system utilities package 
    * sudo apt-get install libguestfs-tools

* Test to see if it works (it won't) -- you need to see "===== TEST FINISHED OK =====" at the bottom:
    * sudo libguestfs-test-tool

* If you don't see "===== TEST FINISHED OK =====" at the bottom then repair it:
    * sudo update-guestfs-appliance

* Run the test again and verify it works
    * sudo libguestfs-test-tool

Теперь сделайте следующее:

1) отключение гостя:

2) Проверьте текущий размер и просмотрите имя раздела, который вы хотите расширить, используя утилиту libvirt:

sudo virt-filesystems --long --parts --blkdevs -h -a name-of-guest-disk-file

3) Создайте новый (40G) выходной диск:

qcow: sudo qemu-img create -f qcow2 -o preallocation=metadata outdisk 40G
img:  sudo truncate -s 40G outdisk

4) Скопируйте старый в новый и разверните соответствующий раздел (при условии, что ваш раздел на диске из шага 2 был / dev / sda1)

sudo virt-resize --expand /dev/sda1 indisk outdisk

5) Переименуйте файл indisk в резервную копию, переименуйте outdisk в indisk (или измените гостевой XML)

6) Перезагрузите гость и тщательно протестируйте новый файл на диске перед удалением исходного файла.

7) Прибыль!


Это почти делает работу в моем случае. К сожалению, почти. Когда гость (сервер CentOS 7) перезагружается, он обнаруживает, что расширенный диск не загружается.
Urhixidur

1
Это прекрасно сработало для меня. Опущение -o preallocation=metadataсоздает разреженный файл. С этой опцией он предварительно выделяет весь размер.
Деннис Уильямсон

Отлично, этот ответ прибил для меня. Спасибо! «Официальная» документация для libguestfs ( libguestfs.org/virt-resize.1.html ), к сожалению, не очень хорошо написана и в итоге приводит к путанице.
mbello

1
Для меня это сработало, помните, что вам на самом деле не нужно использовать, -o preallocation=metadataи если вы этого не сделаете, вам также следует пропустить truncateшаг. virt-resizeв любом случае будет увеличивать файл соответствующим образом.
amoe

5

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

Чтобы проверить, используете ли вы запуск LVM sudo pvs; sudo vgs; sudo lvs, вы получите что-то вроде этого:

PV         VG     Fmt  Attr PSize  PFree
/dev/vda1  vgWWW  lvm2 a-   30.00g    0

VG     #PV #LV #SN Attr   VSize  VFree
vgWWW    1   2   0 wz--n- 30.00g    0

LV   VG    Attr   LSize 
root vgWWW -wi-ao 28.80g
swap vgWWW -wi-ao  1.19g

если ОС виртуальной машины использует LVM. В приведенном выше примере виртуальная машина имеет 30-гигабайтный виртуальный диск, настроенный с использованием LVM с одной группой томов vgWWW, содержащей два логических тома: один для подкачки и один для всего остального.

Если LV используется в VM:

  1. Выключите ВМ
  2. На хосте создайте новый файл виртуального диска и добавьте его в виртуальную машину
  3. Перезагрузите ВМ и войдите
  4. Отметьте новый диск как физический том для LVM с sudo pvcreate /dev/vdb
  5. Расширьте группу томов, чтобы включить этот новый блок диска с sudo vgextend vgWWW /dev/vdb
  6. Расширьте логический том, чтобы он занимал новое пространство sudo lvextend --extents +100%FREE /dev/vgWWW/root(или что-то вроде того, sudo lvextend --size +8G /dev/vgWWW/rootесли вы не хотите увеличивать его полностью, этот пример добавит 8Gb к тому)
  7. Изменить размер файловой системы с resize2fs /dev/vgWWW/root

Примечание: приведенное выше предполагает, что имена vg / lv совпадают с моими примерами, что маловероятно, измените их соответствующим образом, также, если виртуальная машина уже имела виртуальный диск, называемый vdbновым, будет что-то другое ( vdcи т. Д.)

Примечание: resize2fs будет работать только на файловой системе ext2, ext3 и ext4. Если вы используете что-то другое, это будет ошибка и ничего не делать.

Примечание: так как вы изменяете размер активной файловой системы, resize2fsона не будет предлагать вам запустить fsckсначала, как это было бы для несмонтированной файловой системы, она просто будет идти вперед. Возможно, вы захотите запустить файловую систему только для чтения, чтобы убедиться в отсутствии проблем, прежде чем продолжить.


Это также может быть сделано с графическим интерфейсом, который довольно хороший centos.org/docs/5/html/Deployment_Guide-en-US/…
Nux

5

Возможно сделать онлайн изменение размера. libvirtd поддерживает это изначально:

Найдите имя блочного устройства. Должно быть что-то вроде "Вда"

$ virsh domblklist <libvirtd_vm_name>

Изменить размер виртуального устройства:

$ virsh blockresize --domain <libvirtd_vm_name> --path <block_device_name> --size <new_size>

Вот пример, где я расширяю vdaдиск 50GBдля 51GBдля undercloudвиртуальной машины.

[root@gss-rhos-4 ~]# virsh domblklist undercloud
Target     Source
------------------------------------------------
vda        /home/images/undercloud.qcow2

Теперь взглянем на детали файла изображения .qcow2:

[root@gss-rhos-4 ~]# qemu-img info /home/images/undercloud.qcow2
image: /home/images/undercloud.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 38G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

Теперь давайте изменим размер блочного устройства vda:

[root@gss-rhos-4 ~]# virsh blockresize undercloud vda 51G
Block device 'vda' is resized

И подтвердить:

[root@gss-rhos-4 ~]# qemu-img info /home/images/undercloud.qcow2
image: /home/images/undercloud.qcow2
file format: qcow2
virtual size: 51G (54760833024 bytes)
disk size: 38G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
[root@gss-rhos-4 ~]#

Затем вы можете использовать этот скрипт внутри виртуальной машины, чтобы показать команды для изменения размера блочных устройств и fs: https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh .


3

Существует возможность увеличить размер диска вашей виртуальной машины без перезагрузки виртуальной машины, если вы используете диск virtio и LVM.

  1. Используйте virt-manager или virsh для определения нового пустого диска
  2. Ядро должно увидеть новый / dev / vdb
  3. (Необязательно) Создайте основной раздел с помощью fdisk для получения / dev / vdb1, затем используйте kpartx -a / dev / vdb для перечитывания таблицы разделов

  4. Используйте vgextend vg_name / dev / vdb1 (или / dev / vdb, если вы не создали раздел)

  5. Используйте lvextend -l + 100% БЕСПЛАТНО / dev / vg_name / lv_name
  6. Используйте resize2fs / dev / vg_name / lv_name для расширения вашей файловой системы

Вы сделали


2
Я добавлю, что libguestfs.org/virt-resize.1.html также должен помочь.
FearlessFuture

3

Таким образом, вы можете расширить нужный раздел:

    # see what partitions you have? 
    virt-filesystems --long -h --all -a olddisk

    truncate -r olddisk newdisk
    truncate -s +5G newdisk

    # Note "/dev/sda2" is a partition inside the "olddisk" file.
    virt-resize --expand /dev/sda2 olddisk newdisk

Смотрите больше примеров здесь .


2

Еще один способ сделать это

truncate -s +2G vm1.img 

Зайдите в make rescan диска и после того, как вы сможете сделать lvm resize.


1

Если в вашей виртуальной машине есть LVM, то это просто и быстро.

  1. Выключите ВМ (гостевая машина).
  2. На хост-машине добавьте новое устройство хранения.
  3. Включите гостя.
  4. Откройте Система -> Администрирование -> Управление логическими томами (или введите sudo system-config-lvmв терминале) *.

Я нашел графический интерфейс довольно интуитивно понятным, но если у вас есть проблемы, выполните следующие шаги.

  1. Откройте «Неинициализированные сущности» и найдите свой новый диск.
  2. После выбора нового диска, под изображением вы должны найти кнопку инициализации. Нажми.
  3. Он спросит вас о разбиении - вам это не нужно.
  4. Когда закончите, добавьте диск в существующую группу томов.
  5. Наконец, вам нужно увеличить свой логический том (ы) - это делается в логическом представлении группы путем редактирования свойств вашего тома.
  6. Сохранить и все готово. Не нужно перезагружать ВМ.

Запись! По крайней мере, в CentOS 6 LVM GUI не установлен по умолчанию, но вы можете установить его с помощью yum install system-config-lvm.


1
  1. Отключить ВМ
  2. Изменить размер изображения:

    qemu-img resize vmdisk.img +16G
    

    увеличивает размер изображения на 16 ГБ.

  3. Если у вашего образа есть GPT (таблица разделов GUID), то размер диска, используемого в GPT, будет отличаться от нового размера, вам нужно исправить это gdisk:

    MY_DRIVE=/dev/vda
    gdisk $MY_DRIVE <<EOF
    w
    Y
    Y
    EOF
    

    или с parted:

    parted $MY_DRIVE print Fix
    

    По какой-то причине partedисправление не работает, когда tty не представлен (например, при подготовке с помощью Vagrant), поэтому я использую gdisk.

  4. Увеличьте размер раздела, чтобы заполнить все доступное пространство:

    MY_PARTITION_GUID=$(
    gdisk $MY_DRIVE <<EOF | sed -n -e 's/^Partition unique GUID: //p'
    i
    EOF
    )
    
    MY_PARTITION_FIRST_SECTOR=$(
    gdisk $MY_DRIVE <<EOF | sed -n -e 's/^First sector: \([0-9]\+\).*/\1/p'
    i
    EOF
    )
    
    gdisk $MY_DRIVE <<EOF
    d
    n
    
    $MY_PARTITION_FIRST_SECTOR
    
    
    x
    a
    2
    
    c
    $MY_PARTITION_GUID
    w
    Y
    EOF
    

    Эта x a 2 <Enter>часть является необязательной и необходима, если вы используете устаревшую версию BIOS. MY_PARTITION_GUID=...и c $MY_PARTITION_GUIDчасти также являются необязательными и необходимы, только если вы используете UUID раздела внутри /etc/fstabили где-то еще.

  5. Перезагрузите или перечитайте разделы с помощью partx -u $MY_DRIVEили partprobe.

  6. Расширить раздел, например ext2, ext3или ext4:

    MY_PARTITION="${MY_DRIVE}1"
    resize2fs $MY_PARTITION
    

0

Вы можете использовать solus vm с gparted mount. После использования с gparted вы можете легко загрузить систему и настроить пространство. Убедитесь, что у вас установлен правильный приоритет загрузки. В качестве ссылки, пожалуйста, обратитесь к приведенному ниже URL, который может пригодиться. https://greencloudvps.com/knowledgebase/11/How-to-Extend-the-Hard-drive-on-KVM-after-upgrading-VPS.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.