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

slm*_*slm 115 virtualization disk-space-utilization kvm-virtualization

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

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

dya*_*sny 141

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

  • `启动VM,正常调整其中的分区和LVM结构`怎么做?请解释一下。 (18认同)
  • 要调整分区和 LVM 的大小,请按照这篇优秀文章中所述的所有步骤操作:https://sandilands.info/sgordon/increasing-kvm-virtual-machine-disk-using-lvm-ext4 (9认同)
  • 你为什么不只使用`1。解决问题`?模糊的部分是“3.”......你在开玩笑吗? (4认同)
  • 用于在 RHEL6.6 上重新调整我的 *.qcow2 img。谢谢! (2认同)
  • @d9ngle 好吧,看,事情就是这样。dyasny的回答并不含糊。它准确地解释了如何增加虚拟机映像的分配空间。步骤 3 涉及调整_文件系统_的大小,无论您是否使用虚拟机,这都是相同的,**但**对于每个操作系统、发行版和版本来说都是不同的。因此,如果您不知道如何调整(来宾)操作系统中的磁盘卷大小,那么_您有两个问题_。其中**一个**现已得到答复。 (2认同)

bil*_*lyw 36

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

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

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

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

    qemu-img resize <my_vm>.img +10G
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过 libvirt shell(drive-virtio-disk0在本例中)获取 virtio 设备的名称:

    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]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通知 virtio 驱动程序检测新大小(指定总新容量):

    virsh qemu-monitor-command <my_vm> block_resize drive-virtio-disk0 20G --hmp
    
    Run Code Online (Sandbox Code Playgroud)

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

  • qemu-img(我的日期为 2016 年 5 月 8 日)的手册页说:“**警告:** 切勿使用 qemu-img 修改正在运行的虚拟机或任何其他进程正在使用的映像;这可能会破坏图像。另外,请注意查询正在被另一个进程修改的图像可能会遇到不一致的状态。” 所以我不确定当虚拟机仍在运行时(第一步)是否安全。 (5认同)

slm*_*slm 22

这些serverfault问题类似但更具体,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
Run Code Online (Sandbox Code Playgroud)

现在有了更大的 mykvm.img 文件,启动gparted并将现有分区扩展到新添加的磁盘空间。最后一步基本上扩展了操作系统分区,以便它可以利用额外的空间。

方法#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.
    %
    
    Run Code Online (Sandbox Code Playgroud)
  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
      ...
    
    Run Code Online (Sandbox Code Playgroud)
  7. 调整 LVM 逻辑卷的大小

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
    Run Code Online (Sandbox Code Playgroud)
  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.
    
    Run Code Online (Sandbox Code Playgroud)

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


hda*_*ave 18

一步调整和扩展内部分区

我有一台带有 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
Run Code Online (Sandbox Code Playgroud)

现在执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

4) 将旧的复制到新的,同时扩展适当的分区(假设步骤 2 中的磁盘分区是 /dev/sda1):

sudo virt-resize --expand /dev/sda1 indisk outdisk
Run Code Online (Sandbox Code Playgroud)

5)将indisk文件重命名为备份,将outdisk重命名为indisk(或修改guest XML)

6) 重新启动guest,仔细测试新磁盘文件,然后删除原文件

7)利润!

  • 它对我很有用。省略 `-o preallocation=metadata` 会创建一个稀疏文件。使用该选项,它会预先分配整个大小。 (2认同)
  • 对我来说效果很好,请记住,您实际上并不需要使用 `-o preallocation=metadata`,如果不需要,也应该跳过 `truncate` 步骤。无论如何,`virt-resize` 将适当地增大文件。 (2认同)

Mir*_*ici 8

可以在不停止 VM 的情况下进行在线调整大小。libvirtd 本身支持这一点:

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

$ virsh domblklist <libvirtd_vm_name>
Run Code Online (Sandbox Code Playgroud)

调整虚拟设备的大小:

$ virsh blockresize --domain <libvirtd_vm_name> --path <block_device_name> --size <new_size>
Run Code Online (Sandbox Code Playgroud)

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

[root@localhost ~]# virsh domblklist undercloud
Target     Source
------------------------------------------------
vda        /home/images/undercloud.qcow2
Run Code Online (Sandbox Code Playgroud)

现在看看 .qcow2 图像文件的详细信息:

[root@localhost ~]# 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
Run Code Online (Sandbox Code Playgroud)

现在让我们调整 vda 块设备的大小:

[root@localhost ~]# virsh blockresize undercloud vda 51G
Block device 'vda' is resized
Run Code Online (Sandbox Code Playgroud)

并确认:

[root@localhost ~]# 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@localhost ~]#
Run Code Online (Sandbox Code Playgroud)

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

mvutcovi@ubuntu1904:~$ wget -q https://raw.githubusercontent.com/mircea-vutcovici/scripts/master/vol_resize.sh

mvutcovi@ubuntu1904:~$ df /
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/vda1       15414216 7928904   6682600  55% /

mvutcovi@ubuntu1904:~$ sudo bash vol_resize.sh --block-device /dev/vda1
sfdisk -d /dev/vda > dev_vda-partition-table-$(date +%F_%H%M%S).txt   # Backup MS-DOS partition table for /dev/vda block device.
parted -s /dev/vda resizepart 1   # Resize MS-DOS partition /dev/vda1
# Update kernel with new partition table from disk
partx -u /dev/vda
partprobe /dev/vda
blockdev --rereadpt /dev/vda
kpartx -u /dev/vda
resize2fs /dev/vda1    # Resize ext3 or ext4 filesystem
mvutcovi@ubuntu1904:~$ 
Run Code Online (Sandbox Code Playgroud)


Dav*_*ett 6

如果您在 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
Run Code Online (Sandbox Code Playgroud)

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

如果 LV 正在 VM 中使用:

  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 已经有一个名为vdb新的虚拟驱动器,则会是其他内容(vdc等等)

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

注意:当您调整实时文件系统的大小resize2fs时,不会fsck像卸载文件系统那样提示您先运行,它会继续运行。在继续之前,您可能希望运行只读文件系统检查是否有问题。


dtm*_*and 6

您一直想要的“跟进”

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

所有功劳都归功于 Josphat Mutai。请注意,下面提到的大小、磁盘编号和名称与问题不同,您的也会不同

\n

乌班图 / 德班

\n
$ sudo apt -y install cloud-guest-utils gdisk\n
Run Code Online (Sandbox Code Playgroud)\n

CentOS/RHEL/Fedora

\n
$ sudo yum -y install cloud-utils-growpart gdisk\n
Run Code Online (Sandbox Code Playgroud)\n

检查是否使用 LVM(LVM 的指示符类似/dev/mapper/xyz):

\n
cat /etc/fstab\n
Run Code Online (Sandbox Code Playgroud)\n

长话短说

\n

对于“非 lvm”、设备vda、rootfs 位于分区1

\n
$ sudo growpart /dev/vda 1\n# Uncomment and run one of these (ext or xfs)\n#sudo resize2fs /dev/vda1\n#sudo xfs_growfs /\n
Run Code Online (Sandbox Code Playgroud)\n

对于“lvm”、设备vda、分区2、物理卷vda2、逻辑卷组rhel-root

\n
$ sudo growpart /dev/vda 2\n$ sudo pvresize /dev/vda2\n$ sudo lvextend -r -l +100%FREE /dev/mapper/rhel-root\n
Run Code Online (Sandbox Code Playgroud)\n

对于每个的较长版本,请参见下文!

\n
\n

非LVM

\n
\n

\n

使用lsblk(在本例中1为“” vda1)查找分区号

\n\n
\n     $ lsblk\n     NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT\n     sr0     11:0    1 1024M  0 rom
\n vda 253:0 0 10G 0 disk\n \xe2\x94\x94\xe2\x94\x80vda1 253:1 0 10G 0 part /\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用以下命令增长 \'vda\' 的分区 \'1\'growpart

\n\n
\n $ sudo Growthpart /dev/vda 1\n 已更改:分区=1 开始=2048 旧:大小=20969472 结束=20971520 新:大小=62912479,结束=62914527\n
\n\n

要扩展文件系统,首先使用以下命令检查是否为 ext2/3/4 或 XFS df

\n\n
\n $ df -hT | df -hT | grep /dev/vda\n /dev/vda1 ext4 30G 1.2G 7G 5% /\n
\n

对于 ext4 文件系统,请使用resize2fs

\n\n
\n $ sudo resize2fs /dev/vda1\n resize2fs 1.42.9 (2013 年 12 月 28 日)\n /dev/vda1 处的文件系统安装在 / 上;需要在线调整大小\n old_desc_blocks = 2,new_desc_blocks = 4\n /dev/vda1 上的文件系统现在的长度为 7864059 块。\n
\n\n

对于 XFS,它可以在使用“xfs_growfs”挂载时增长:

\n
\n $ sudo xfs_growfs /\n

\n

\n

左心室容量

\n
\n

\n

查找分区号:

\n
\n $ lsblk\n 名称主要:最小 RM 大小 RO 类型安装点\n sr0 11:0 1 1024M 0 rom 
\n vda 252:0 0 40G 0 磁盘\n \xe2\x94\x9c\xe2\x94\x80vda1 252 :1 0 1G 0 部分 /boot\n \xe2\x94\x94\xe2\x94\x80vda2 252:2 0 29G 0 部分\n \xe2\x94\x9c\xe2\x94\x80rhel-root 253:0 0 26.9 G 0 lvm /\n \xe2\x94\x94\xe2\x94\x80rhel-swap 253:1 0 2.1G 0 lvm [交换]\n
\n

使用以下命令增长“vda”的分区“2” growpart

\n
\n $ sudo Growthpart /dev/vda 2\n 更改:partition=2 start=2099200 旧:size=18872320 end=20971520 新:size=60815327,end=62914527\n
\n

使用以下命令调整物理卷大小pvresize

\n
\n $ sudo pvresize /dev/vda2\n 物理卷“/dev/vda2”已更改\n 1 个物理卷调整大小或更新/0 个物理卷未调整大小\n
\n\n

使用以下命令查找卷组的名称df(您的卷组可能与下面的不同)并使用扩展卷组调整根文件系统使用的逻辑卷的大小lvextend

\n
\n $ df -hT | df -hT | grep mapper\n /dev/mapper/rhel-root xfs 27G 1.9G 26G 8% /\n \ 
n $ sudo lvextend -r -l +100%FREE /dev/mapper/rhel-root\n 逻辑卷 rhel 的大小/root 从 <26.93 GiB (6893 个范围) 更改为 <36.93 GiB (9453 个范围)。\n 逻辑卷 rhel/root 已成功调整大小。\n
\n

如果您在上一步中没有使用\xe2\x80\x99-r选项,文件系统仍将显示旧大小。要使文件系统报告实际大小(包括扩展大小),请执行以下操作。

\n\n

对于 ext4 文件系统,请使用resize2fs

\n
\n $ sudo resize2fs /dev/卷组名称/root\n
\n

对于 xfs 文件系统使用xfs_growfs

\n
\n $ sudo xfs_growfs /\n 元数据=/dev/mapper/rhel-root isize=512 agcount=4,agsize=1764608 blks\n = sectsz=512 attr=2,projid32bit=1\n = crc=1 finobt=1,稀疏=1,rmapbt=0\n = reflink=1\n 数据 = bsize=4096 块=7058432,imaxpct=25\n = sunit=0 swidth=0 blks\n 命名=版本 2 bsize=4096 ascii-ci=0,ftype=1\n log =内部日志 bsize=4096 块=3446,版本=2\n = sectsz=512 sunit=0 blks,lazy-count=1\n realtime =无 extsz=4096 块=0, rtextents=0\n 数据块从 7058432 更改为 9679872\n

\n

\n


小智 5

这样你就可以扩展你想要的分区:

    # 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
Run Code Online (Sandbox Code Playgroud)

请参阅此处的更多示例。