Linux

如何將 KVM 磁碟映像複製到 LVM

  • February 24, 2022

問題

執行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。

引用自:https://serverfault.com/questions/119949