如何將 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 分區來容納 VM。我認為它應該與分區的總和大小相同,但這不正確嗎?我應該把它設為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 設備要快得多嗎?
你可能只是有一個不相上下的數學錯誤:
3146776576 (size, in bytes of your .raw file) / 1024 (kb) / 1024 (mb) == 3001MB
但是你的 LV 正好是 3000MB?
將一個分區DD’ing到另一個分區並沒有錯。即使你的 vmbuilder 分區列表加起來多達 3000 個,你的 .qcow 文件也是一個硬碟映像,其中包括一個分區表 + mbr @ 磁碟的前面。
您沒有考慮分區表的空間和分區起始位置的對齊方式。在某些情況下 1 MiB 就足夠了,但可能需要更多。檢查虛擬磁碟的實際大小並確保您的新卷至少有這麼大。選項:
- 執行
qemu-img info disk0.qcow2
並查找“虛擬大小”。- 如果您已經將虛擬磁碟轉換為原始格式,您只需查看 . 報告的大小即可
ls -l disk0.raw
。- 將磁碟添加到 VM,啟動救援系統並檢查輸出中
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。