问题
我得到了一个设备上没有剩余空间执行 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)。