如何将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来创build磁盘映像。 我的vmbuilder.partition文件看起来像这样(总共3000MB):

 root 2000 swap 1000 

所以我首先创build一个足够容纳虚拟机的LVM分区。 我以为它应该是大小相同的分区总和,但这是不正确的? 我应该把它做成3001M吗?

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

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

 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 

所以一些额外的testing(复制到另一个文件,而不是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)比原始图像文件小。 我应该在创build时将1MB添加到LVM分区吗?

 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 

现在我已经创build了一个大小已经被四舍五入的分区,但是该分区适合它。

什么是复制qcow2文件到LVM分区的正确过程? 另外,任何想法为什么复制到文件比LVM设备快得多?

你可能只是有一个错误的math错误:

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

但是,你的LV只有3000MB?

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