当前位置: 首页>>技术教程>>正文


virtualization – 如何调整虚拟机磁盘的大小?

, ,

问题描述

有没有办法调整虚拟机磁盘的大小?假设将磁盘大小从 32GB 增加到 64GB。我在 Ubuntu 服务器 11.10 64 位上运行 KVM/Qemu。谢谢。

最佳答案

在基于 Debian 的发行版上,您应该改用 virt-resize。这现在处理引擎盖下的几乎所有事情。假设您的图像名为 Win7(为什么不呢?)。首先确保您的 VM 已关闭:

安装工具:

# apt-get install libguestfs-tools

获取 VM 磁盘的位置:

# virsh dumpxml Win7 | xpath -e /domain/devices/disk/source
Found 2 nodes in stdin:
-- NODE --
<source file="/var/lib/libvirt/images/Win7.img" />
-- NODE --
<source file="/var/lib/libvirt/images/Win7.iso" />

您可能需要在以下内容中调整 /var/lib/libvirt/images/Win7.img

# virt-filesystems --long --parts --blkdevs -h -a /var/lib/libvirt/images/Win7.img
Name       Type       MBR  Size  Parent
/dev/sda1  partition  07   100M  /dev/sda
/dev/sda2  partition  07   32G   /dev/sda
/dev/sda   device     -    32G   -

创建您的 64G 磁盘:

# truncate -s 64G /var/lib/libvirt/images/outdisk

您需要扩展 /dev/sda2(不是引导分区):

# virt-resize --expand /dev/sda2 /var/lib/libvirt/images/Win7.img /var/lib/libvirt/images/outdisk
Examining /var/lib/libvirt/images/Win7.img ...
 100% [progress bar] --:--
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 32G to 64G.  The 
    filesystem ntfs on /dev/sda2 will be expanded using the 
    'ntfsresize' method.

**********
Setting up initial partition table on outdisk ...
Copying /dev/sda1 ...
Copying /dev/sda2 ...
 100% [progress bar] 00:00
 100% [progress bar] 00:00
Expanding /dev/sda2 using the 'ntfsresize' method ...

Resize operation completed with no errors.  Before deleting the old 
disk, carefully check that the resized disk boots and works correctly.

进行备份以防万一(如果您不想要备份,请使用 mv):

# cp /var/lib/libvirt/images/Win7.img /var/lib/libvirt/images/Win7.img.old
# mv /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/Win7.img

现在启动!

更多信息:man virt-resize

次佳答案

我建议在执行任何这些操作之前,您按原样获取磁盘映像的完整副本,然后当它全部中断时,您可以将其复制回来重新开始。

你需要做3件事:

1)使磁盘映像更大。在您的主机中:

qemu-img resize foo.qcow2 +32G

现在您的来宾可以看到更大的磁盘,但仍然有旧的分区和文件系统。

2) 把磁盘镜像里面的分区做大。为此,您需要在来宾中启动 LiveCD,因为您将无法弄乱已安装的分区。这是相当复杂的,可能是最危险的部分。这里复制的东西很多,所以我现在只做链接。你想做这样的事情:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

或 2b) 如果您只想要更多存储空间,则创建新分区会更简单(也更安全)。使用 fdisk 或 cfdisk,或者任何你觉得舒服的东西——你现在应该在你的来宾磁盘上看到一大堆未分配的空间。

3)最后,如果您调整现有分区的大小,请使新的更大分区内的文件系统更大(这实际上在上面链接的指南中)。在你的客人里面:

resize2fs /dev/sda1

第三种答案

我认为 Caesium 的答案很好,我只想写下一些其他命令来实现相同的目的。

假设您有一个带有磁盘映像的文件 disk.img,即它有一个分区表和一个或多个分区,并假设您想让最后一个分区更大。你需要做的是

1)使整个文件更大,比如4GiB。一个快速的方法是使用 dd

dd if=/dev/zero of=disk.img bs=1c seek=4G count=0

2)使用 fdisk 使分区更大(我希望我可以在 parted 或一些更好的工具中做到这一点……有人吗?)

fdisk disk.img

键入 p 打印出分区表并查找分区的起始扇区,例如分区 2 从扇区 106496 开始。

您要做的是从分区表中删除该分区,并创建一个从完全相同的扇区开始但在稍后的扇区结束的新分区。然后该分区将包含一个有效的文件系统。

键入 d 并给出要删除的分区号。 (吞咽!)

键入 n 并提供所需的分区号,然后是起始扇区。您必须使用与以前使用的相同的起始扇区。最后给出结束扇区或让 fdisk 选择您可以使用的最高扇区。

键入 w 将更改写回磁盘映像文件,然后退出 fdisk。

3) 现在您需要调整文件系统的大小。为此,您需要磁盘映像内文件系统的偏移量(= 文件系统的位置)。如果您知道扇区大小(通常为 512),您可以从扇区号计算它,或者您可以使用 parted

parted disk.img u b p

(parted 可以将命令作为命令行参数,所以这意味着 ‘unit bytes’ 和 ‘print’,所以它打印分区表并使用字节作为大小 uint。)

这将打印出分区的开始和结束。假设您的分区从 54525952 开始,然后您使用 losetup 创建一个环回块设备。

losetup -f --show -o 54525952 disk.img 

losetup 告诉你它选择了哪个开发者,例如 /dev/loop0 。现在您可以使用 resize2fs

resize2fs /dev/loop0

最后取下循环装置

losetup -d /dev/loop0

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11997.html,未经允许,请勿转载。