qcow2 是 qemu 模擬器專門為虛擬機所設計的虛擬硬碟格式。 它的概念跟 loopback file system 一樣, 基本上就是在實體硬碟上挖一塊空間來當做虛擬硬碟映象檔。 不同於 loopback FS 之處是: 比方說你指定 8G 的空間給它, 它一開始並不會真的用掉 8G, 而是從幾 MB (甚至更小) 開始, 隨時視需要慢慢長大。 也就是說, 它目前還沒用到 (還沒向底層的檔案系統要來) 的空間, 你暫時還可以拿來做別的事。 它的驅動程式是 nbd 這個 kernel module。 (Loopback FS? 檔案系統的驅動程式? 請複習 Linux 下的特殊檔案系統。)
- 檢查一下是否已載入 nbd 模組:
lsmod | grep nbd
如果沒有的話, 載入 nbd 模組:modprobe nbd max_part=16
後面 max_part=16 的意思是: 允許每一顆 qcow2 硬碟上面最多可以切出 16 個分割。 - 建立一個名為 finnix.qcow2 、 大小為 2G 的 qcow2 類型虛擬硬碟:
qemu-img create -f qcow2 finnix.qcow2 2G
- 查看一下實際大小:
ls -l
我看到的只有 200K 左右。 - 為映像檔指定一個裝置代號, 從此以後要從
/dev/nbd3 這個裝置去讀寫 finnix.qcow2 映像檔:
qemu-nbd -c /dev/nbd3 finnix.qcow2
- 用
fdisk -s /dev/nbd3
查看虛擬硬碟大小 (約 2G)、 用fdisk -l /dev/nbd3
查看虛擬硬碟分割狀況。 (應該是連分割表都還沒有。) 或者也可以用blockdev --getsize64 /dev/nbd3
查看虛擬硬碟的大小。
然後就可以按照 extlinux 多重開機分解動作教學 切割 /dev/nbd3、 把其中一個分割 (例如 /dev/nbd3p1) 設定成可開機並格式化、 把 finnix 安裝上去。
安裝完之後, 記得卸載 /dev/nbd3 的所有分割。
然後讓 /dev/nbd3 跟 finnix.qcow2
斷開連結: qemu-nbd -d /dev/nbd3
再來試著用
qemu-kvm 檢查是否可以成功開機:
kvm -monitor stdio -m 1024 -hda finnix.qcow2
(如果沒有先讓 /dev/nbd3 跟 finnix.qcow2
斷開連結, 可能就無法開機。)
用 libvirt 建立虛擬機時, 經常會同時建立虛擬硬碟, 而且預設格式就是 qcow2。 現在你知道了: 即使不啟動虛擬機, 一樣可以讀寫上面的資料。
[2020/2/16, 在 lubuntu 18.04 上] 如果 「qemu-nbd -c 、 讀寫檔案、 qemu-nbd -d」 跟 「kvm」 交替作用於同一個 qcow2 映像檔, 那麼第二次想要 qemu-nbd -c 的時候可能會出錯。 也許可以 這樣解決; 不過我採取比較簡單的方法: 重開機。 另外, 今天不太順利, 在 mkfs -t ext4 時一直遇到 「輸入輸出錯誤」, 類似 這樣, 害我以為硬碟真的壞了, 差點網購下去。 過程當中重複分割 .qcow2 映像檔, 而 lvm 分割區卻還留著上一回合的殘念, 忘記看到什麼錯誤訊息了, 總之 可以用 pvscan --cache 讓它完全忘記上輩子的事。 最後乾脆忽略「輸入輸出錯誤」, 虛擬機照樣可以開機。
本文介紹的方法也可用於開啟 virtualbox 的 VDI 映象檔。
其他談 qemu-img 的文章:
- qemu-img命令详解
- fedora 簡中文件: 使用 qemu-img
- wiki books: QEMU/Images
解釋 qemu-nbd 的文件:
關於 nbd 的其他文章:
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。