题 如何增加KVM来宾的磁盘空间?


我在CentOS KVM主机上设置了一个Ubuntu来宾,最初有6GB的磁盘空间。如何从命令行增加Ubuntu guest虚拟机的磁盘空间?

编辑#1:我正在使用磁盘映像文件(qemu)。


84
2017-10-24 14:23




您是在文件中使用LVM还是磁盘映像? - Selivanov Pavel


答案:


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

105
2017-10-24 15:32



啊,你打败了我,我只是注意到手册页中qemu-img的调整大小选项。所以这节省了几个步骤。太好了! - slm
努力在RHEL6.6上重新调整我的* .qcow2 img的大小。谢谢! - Jacob Goulden
start the VM, resize the partitions and LVM structure within it normally 怎么做?请解释一下。 - Waki
你不能把所有东西都放在盘子上。如果您尝试过并且未能调整分区或LV的大小,请打开一个新问题,描述您尝试过的内容和不起作用的内容 - dyasny
要调整分区和LVM的大小,请按照此优秀文章中的说明执行所有步骤: sandilands.info/sgordon/... - skonsoft


在线方法(使用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
    

然后登录VM。运行 dmesg 应该报告virtio磁盘检测到容量变化。此时,根据需要继续调整分区和LVM结构的大小。


23
2017-09-22 23:08



qemu-img(我的日期为2016-05-08)的手册页说:“警告: 切勿使用qemu-img修改正在运行的虚拟机或任何其他进程使用的映像;这可能会破坏图像。另外,请注意查询正由另一个进程修改的映像可能会遇到不一致的状态。“因此,当虚拟机仍在运行时,我不确定(第一步)是否安全。 - user44400
不适用于centos7 + kvm - e-info128
这对我来说非常合适。使用ceph和virtio块设备。我们将应用程序数据/ MySQL数据库存储在单独的分区上。停止访问此分区的应用程序。卸下它。调整大小。 fsck的。然后用新尺寸再次安装它。无需关机。 - nelaaro


这些服务器故障问题类似但更具体, KVM在线磁盘调整大小? & Centos Xen调整DomU分区和卷组的大小。第一个问题是如何在线时增加KVM访客,而第二个是使用LVM特定的XEN。我问如何在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 并将现有分区扩展到新添加的磁盘空间。最后一步基本上扩展了OS分区,以便它可以利用额外的空间。

方法#2: 分区是基于LVM的

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

  1. 关闭VM
  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. 重新启动VM

  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.
    

以上是我的例子,但我按照这个步骤 网站


17
2017-10-24 14:36



这篇文章中的方法#1看起来效果不好 - 红帽子中的虚拟机管理器之后不会报告新的大小。 @dyasny建议的方法似乎在这方面工作得更好。 - Iwan Aucamp
@IwanAucamp - 有趣,我用 virt-manager 在将我们的KVM服务器迁移到更新版本的KVM(CentOS 5 - > CentOS 6)之前,已广泛使用方法#1和#2。我现在用的 qemu-img resize 方法也是如此。 - slm
对于方法#2,您可能会发现lvextend handier为第7步: lvextend /dev/Volgroup/lvname /dev/vda2 (全部在一行,其中/ dev / vda2将是您的物理卷)。没有任何其他选项,它将使用该卷组中的最大大小。 - Mike S
如果分区表中存在逻辑卷,则方法#2,步骤4将不起作用。重新创建扩展类型的分区后,第一个可用扇区将不再与更改之前的扇区匹配。例如。如果您的逻辑分区的第一个扇区是1001472,则在更改之后它将是1003518(假设之前是10G磁盘并且在调整大小之后是50G)。有人知道如何在同一个第一扇区重新创建逻辑卷吗? - ILIV
这是因为默认情况下fdisk将对齐约束(1MB步长)应用于分区。要解决此问题,请接受默认值1003518,输入专家模式(x),然后选择b并将第一个扇区设置为1001472. unix.stackexchange.com/a/320447 详情。 - ILIV


一步调整内部分区的大小和扩展

我有一个带有qcow2来宾文件映像的Ubuntu主机,并希望调整磁盘大小并一步扩展相应的分区。它要求您设置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(或修改guest XML)

6)在删除原始文件之前,重新启动guest虚拟机并仔细测试新磁盘文件

7)利润!


11
2018-06-13 14:02



这几乎完成了我的工作。可悲的是,差不多。当重新启动guest虚拟机(CentOS 7服务器)时,它会发现扩展磁盘无法启动。 - Urhixidur
它对我很有用。省略 -o preallocation=metadata 创建一个稀疏文件。使用该选项,它预先分配整个大小。 - Dennis Williamson
很好,这个答案适合我。非常感谢! libguestfs的“官方”文档(libguestfs.org/virt-resize.1.html),遗憾的是写得不好,最终令人困惑。 - mbello
对我来说工作得很好,记住你实际上并不需要使用 -o preallocation=metadata 如果你不这样做,你也应该跳过 truncate 步。 virt-resize 无论如何都会适当增长文件。 - amoe


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

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

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

如果在VM中使用LV:

  1. 关闭VM
  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已经有一个名为虚拟驱动器 vdb 新的将是别的东西(vdc, 等等)

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

注意: 在调整实时文件系统的大小时 resize2fs 不会提示你跑 fsck 首先,它将作为未安装的文件系统,它将继续。在继续之前,您可能希望运行只读文件系统检查没有问题。


5
2017-10-24 15:10



这也可以通过非常好的GUI来完成 centos.org/docs/5/html/Deployment_Guide-en-US/... - Nux


如果您使用的是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%FREE / dev / vg_name / lv_name
  6. 使用resize2fs / dev / vg_name / lv_name扩展文件系统

你完成了。


3
2017-07-12 10:25



我会补充一点 libguestfs.org/virt-resize.1.html也应该有所帮助。 - FearlessFuture


另一种方法

truncate -s +2G vm1.img 

进入一个磁盘重新扫描,然后你可以做你的lvm调整大小。


2
2018-04-18 17:50





这样您就可以扩展所需的分区:

    # 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
2017-10-01 15:50





如果您的VM中有LVM,那么这很容易且快速。

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

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

  1. 打开“未初始化的实体”并找到您的新驱动器。
  2. 选择新驱动器后,在图像下方,您应找到一个初始化按钮。按下。
  3. 它会问你关于分区 - 你不需要它。
  4. 完成后,将驱动器添加到现有卷组。
  5. 最后,您需要增加逻辑卷 - 这可以通过编辑卷的属性在组的逻辑视图中完成。
  6. 保存并完成。无需重启VM。

注意!至少在CentOS 6上默认情况下不安装LVM GUI,但你可以安装它 yum install system-config-lvm


1
2018-06-07 16:12





  1. 关闭VM
  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 部件也是可选的,只有在您使用分区UUID时才需要 /etc/fstab 或者别的地方。

  5. 使用重新启动或重新读取分区 partx -u $MY_DRIVE 要么 partprobe

  6. 扩展分区,例如 ext2ext3 要么 ext4

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

1
2018-04-05 22:32