如何增加KVM guest虚拟机的磁盘空间?


Answers:


115
  1. 停止虚拟机
  2. 运行qemu-img resize vmdisk.img +10G以将图像大小增加10Gb
  3. 启动VM,正常调整其内分区和LVM结构的大小

啊,您击败了我,我只是注意到手册页中qemu-img的调整大小选项。因此,这节省了几个步骤。真好!
slm

1
用于在RHEL6.6上重新调整我的* .qcow2 img的大小。谢谢!
Jacob Goulden

8
start the VM, resize the partitions and LVM structure within it normally怎么做?请解释一下。
Waki 2015年

1
您不可能将所有东西都放在盘子上。如果您尝试过调整分区或LV的大小而失败,请打开一个新问题,描述您尝试过的内容以及不起作用的内容
dyasny

4
:要调整partions和LVM,请按照所有步骤这个优秀的文章中解释 sandilands.info/sgordon/...
skonsoft

32

在线方法(使用qemu,libvirt和virtio-block)

不管是好是坏,即使安装了目标虚拟磁盘,下面的命令也会运行。在无法卸载磁盘(例如根分区),VM必须保留且系统所有者愿意承担数据损坏风险的环境中,这很有用。要消除这种风险,您需要先登录VM并卸载目标磁盘,但这并非总是可能的。

从KVM管理程序执行以下操作。

  1. 增加磁盘映像文件本身的大小(指定要增加的数量):

    qemu-img resize <my_vm>.img +10G
    
  2. 通过libvirt shell获取virtio设备的名称(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
qemu-img的手册页(日期为2016-05-08)说:“ 警告:切勿使用qemu-img来修改正在运行的虚拟机或任何其他进程正在使用的映像;这可能会损坏映像。此外,请注意,查询被另一个进程修改的图像可能会遇到不一致的状态。” 因此,我不确定在虚拟机仍在运行时(第一步)是否安全。
user44400

在centos7 + kvm上不起作用
e-info128

1
这对我来说非常有效。使用ceph和virtio块设备。我们将应用程序数据/ MySQL db存储在单独的分区上。停止应用程序访问该分区。卸下它。调整大小。fsck。然后重新安装新的尺寸。无需关机。
nelaaro '18

与此答案相同,但使用libvirt而不是监视器控制台:serverfault.com/a/952868/30946
Mircea Vutcovici

21

这些serverfault问题类似,但更具体,KVM在线磁盘大小是否调整?Centos Xen调整DomU分区和卷组的大小。第一个询问如何在线增加KVM guest虚拟机的问题,第二个询问使用LVM的XEN专用。我问KVM离线时如何完成此操作。

注意:此链接对方法#1有用,并且显示了如何完成增加KVM的磁盘空间(基于ext3),方法:调整KVM虚拟机映像的大小

KVM guest虚拟机要注意的一件事是,它们在内部使用的分区会影响您可以使用哪种方法来增加其磁盘空间。

方法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并将现有分区扩展到新添加的磁盘空间中。最后一步基本上扩展了OS分区,以便可以利用额外的空间。

方法2:分区基于LVM

这是我大致遵循的步骤,以调整内部使用LVM的KVM来宾的大小。

  1. 关闭虚拟机
  2. 在访客的“图像文件”中添加更多空间(例如:cat old.img 10G_addon.raw >> new.img
  3. 启动VM(使用新创建的new.img)
  4. 在VM内运行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在将我们的KVM服务器迁移到KVM的较新版本(CentOS 5-> CentOS 6)之前,我广泛使用并使用了方法#1和#2。我现在也使用该qemu-img resize方法。
slm 2014年

对于方法2,您可能会在步骤7中找到lvextend lvextend /dev/Volgroup/lvname /dev/vda2handier :(全部位于一行中,其中/ dev / vda2将是您的物理卷)。如果没有其他选择,它将使用该卷组中的最大大小。
Mike S

如果分区表中有逻辑卷,则方法2,步骤4将无效。重新分区的扩展类型后,第一个可用扇区将不再与更改前的扇区匹配。例如,如果逻辑分区的第一个扇区为1001472,则更改后为1003518(假设大小调整前为10G磁盘,调整后为50G)。有人知道如何在同一第一扇区上尽可能重建逻辑卷吗?
ILIV '16

1
这是由于fdisk默认情况下将对齐约束(1MB步骤)应用于分区。要解决此问题,请接受默认值1003518,进入专家模式(x),然后选择b并将第一个扇区设置为1001472。有关详细信息,请参见unix.stackexchange.com/a/320447
ILIV '16

11

一步调整和扩展内部分区

我有一台带有qcow2 guest虚拟机文件映像的Ubuntu主机,想要一步调整磁盘大小并扩展适当的分区。它要求您设置libvirt guest虚拟机文件系统实用程序,但是无论如何都具有实用性。

来自这里的启示: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

如果要在VM内使用LVM,最简单的方法是将新的虚拟磁盘添加到VM并在其上扩展卷组和逻辑卷。

要检查您是否正在使用LVM run 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

如果VM的操作系统正在使用LVM。在上面的示例中,VM具有一个30GB的虚拟磁盘,该虚拟磁盘使用LVM配置,其中一个名为vgWWW的卷组包含两个逻辑卷,一个逻辑卷用于交换,另一个逻辑卷用于其他所有。

如果VM中使用了LV:

  1. 关闭虚拟机
  2. 在主机上创建一个新的虚拟磁盘文件并将其添加到VM
  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名称与我的示例相同,这不太可能,请适当更改,如果VM已经有一个名为vdbnew 的虚拟驱动器,它将是其他名称(vdc,依此类推)

注意: resize2fs仅适用于ext2,ext3和ext4文件系统。如果您使用其他东西,它将出错并且什么也不做。

注意:由于您要调整活动文件系统的大小,resize2fs因此不会像提示fsck已卸载文件系统那样提示您首先运行,它将继续进行。您可能要运行只读文件系统检查,然后再进行操作。



5

可以在线调整大小。libvirtd本机支持:

查找块设备名称。应该是“ vda”之类的东西

$ virsh domblklist <libvirtd_vm_name>

调整虚拟设备的大小:

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

这里是被我展开一个例子vda,从磁盘50GB51GBundercloud虚拟机。

[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 ~]#

然后,您可以在VM中使用此脚本来显示用于调整块设备和fs大小的命令:https : //github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh


3

如果您使用virtio驱动器和LVM,则可以在不重新引导VM的情况下增加VM磁盘的大小。

  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 

进入使磁盘重新扫描,然后可以调整LVM大小。


1

如果您的VM中有LVM,那么这非常容易且快捷。

  1. 关闭VM(来宾计算机)。
  2. 在您的主机中添加新的存储设备。
  3. 开启访客。
  4. 打开系统->管理-> 逻辑卷管理(或键入sudo system-config-lvm终端)*。

我发现GU​​I非常直观,但是如果遇到问题,请按照以下步骤操作。

  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 GB。

  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部件也是可选的,并且仅当您在/etc/fstab其他地方或其他地方使用分区UUID时才需要。

  5. 重新启动或重新读取分区partx -u $MY_DRIVEpartprobe

  6. 延伸分区,例如用于ext2ext3ext4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.