问题描述
有没有办法调整虚拟机磁盘的大小?假设将磁盘大小从 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