如何将 KVM 磁盘映像复制到 LVM

如何将 KVM 磁盘映像复制到 LVM

问题

我得到了一个设备上没有剩余空间执行 dd 命令时出错。我尝试将 KVM qcow2 文件移动到 LVM 分区,并认为 LVM 分区需要与 vmbuilder.partition 文件中分区的总大小相同。这是在这篇 HowToForge 文章。以下是错误输出:

root@bond:/tmp/zing-UZFgZpj1# dd if=disk0.raw of=/dev/vol/zing bs=1M
dd: writing `/dev/vol/zing': No space left on device
3001+0 records in
3000+0 records out
3145728000 bytes (3.1 GB) copied, 32.5236 s, 96.7 MB/s

我可以使用新副本,一切似乎仍然运行良好。不过我想我应该担心。当我使用 dd 将其复制到另一个文件时,文件的大小略大于 LVM 分区!详情见下文。

额外细节

我正在使用 KVM 和 vmbuilder 创建磁盘映像。我的 vmbuilder.partition 文件如下所示(总共 3000MB):

root 2000
swap 1000

因此,我首先创建一个足够大的 LVM 分区来容纳虚拟机。我以为它的大小应该与分区总和相同,但这不正确吗?我应该将其设置为 3001M 吗?

root@bond:~/vmbuilder# lvcreate -L3000M -n zing vol
   Logical volume "zing" created

然后我使用 vmbuilder 创建磁盘映像:

root@bond:~/vmbuilder# vmbuilder kvm ubuntu -o \
    --templates=/root/vmbuilder/templates \
    --ip=192.168.0.225 \
    --hostname=zing \
    --raw=/dev/vol/zing \
    --part=/root/vmbuilder/appliances/jetty/vmbuilder.partition \
    --pass=7dhsLzUp \
    --dest=/tmp/zing-UZFgZpj1 \
    --user=zing \
    --mem=2048 \
    --firstboot=/tmp/boot-UZFgZpj1.sh \
    --copy=/tmp/copyfiles-UZFgZpj1 \
    --addpkg=jetty ;

完成后,我将 qcow2 文件转换为原始文件:

root@bond:/tmp/zing-UZFgZpj1# ls -al
total 447892
drwxr-xr-x 2 root root      4096 2010-03-06 16:51 .
drwxrwxrwt 5 root root      4096 2010-03-06 16:51 ..
-rw-r--r-- 1 root root 458752000 2010-03-06 16:51 disk0.qcow2

root@bond:/tmp/zing-UZFgZpj1# qemu-img convert disk0.qcow2 -O raw disk0.raw
root@bond:/tmp/zing-UZFgZpj1# ls -al
total 891384
drwxr-xr-x 2 root root       4096 2010-03-06 17:32 .
drwxrwxrwt 5 root root       4096 2010-03-06 16:51 ..
-rw-r--r-- 1 root root  458752000 2010-03-06 16:51 disk0.qcow2
-rw-r--r-- 1 root root 3146776576 2010-03-06 17:32 disk0.raw

最后,我将其复制到 LVM 分区:

root@bond:/tmp/zing-UZFgZpj1# dd if=disk0.raw of=/dev/vol/zing bs=1M
dd: writing `/dev/vol/zing': No space left on device
3001+0 records in
3000+0 records out
3145728000 bytes (3.1 GB) copied, 32.5236 s, 96.7 MB/s

因此进行一些额外的测试(复制到另一个文件,而不是 LVM):

root@bond:/tmp/zing-UZFgZpj1# dd if=disk0.raw of=zing.disk bs=1M
3001+0 records in
3001+0 records out
3146776576 bytes (3.1 GB) copied, 4.64961 s, 677 MB/s

root@bond:/tmp/zing-UZFgZpj1# ls -l
total 3964404
-rw-r--r-- 1 root root  458752000 2010-03-06 16:51 disk0.qcow2
-rw-r--r-- 1 root root 3146776576 2010-03-06 17:32 disk0.raw
-rw-r--r-- 1 root root 3146776576 2010-03-06 17:33 zing.disk

再次,我在 KVM 虚拟机中使用 LVM 分区没有任何问题,但我应该担心它吗?它的大小比原始映像文件小 1,048,576 字节(正好是 1MB)。创建 LVM 分区时是否应该向其添加 1MB?

root@bond:~/vmbuilder# lvremove /dev/vol/zing
Do you really want to remove active logical volume "zing"? [y/n]: y
  Logical volume "zing" successfully removed

root@bond:~/vmbuilder# lvcreate -L3001M -n zing vol
  Rounding up size to full physical extent 2.93 GB
  Logical volume "zing" created

root@bond:/tmp/zing-UZFgZpj1# dd if=disk0.raw of=/dev/vol/zing bs=1M
3001+0 records in
3001+0 records out
3146776576 bytes (3.1 GB) copied, 31.0581 s, 101 MB/s

现在我创建了一个分区,其大小已经四舍五入,但副本可以容纳在其中。

将 qcow2 文件复制到 LVM 分区的正确过程是什么?另外,你知道为什么复制到文件比复制到 LVM 设备快得多吗?

答案1

您可能只是犯了一个数学错误:

3146776576 (size, in bytes of your .raw file)  / 1024 (kb) / 1024 (mb) == 3001MB

但是你将你的 LV 设置为正好 3000MB 吗?

将一个分区 DD 到另一个分区上没有任何问题。即使您的 vmbuilder 分区列表加起来有 3000 个,您的 .qcow 文件也是一个硬盘驱动器映像,其中包括一个分区表 + mbr @ 磁盘的前面。

答案2

您没有考虑分区表的空间以及分区起始位置的对齐。在某些情况下,1 MiB 就足够了,但可能需要更多。检查虚拟磁盘的实际大小,并确保新卷至少有这么大。选项:

  • 运行qemu-img info disk0.qcow2并寻找“虚拟尺寸”。
  • 如果您已经将虚拟磁盘转换为原始格式,那么您只需查看报告的大小即可ls -l disk0.raw
  • 将磁盘添加到虚拟机,启动救援系统并检查fdisk -l报告磁盘大小的输出中的第一行。

对齐意味着起始位置必须是某个大小的倍数,通常为 1 MiB。它可能会导致分区前出现间隙,例如,如果对齐为 1 MiB,并且您创建了 4 个分区,每个分区 1002.5 MiB,则您将使用 1 MiB + 3 x 0.5 MiB + 4 x 1002.5 MiB = 4012.5 MiB。要将此磁盘复制到 LVM,您需要一个 4016 MiB 的卷(假设默认扩展大小为 4 MiB)。

相关内容