2015年3月8日 星期日

用 qemu-img 與 qemu-nbd 管理 qcow2 虛擬硬碟

qcow2 是 qemu 模擬器專門為虛擬機所設計的虛擬硬碟格式。 它的概念跟 loopback file system 一樣, 基本上就是在實體硬碟上挖一塊空間來當做虛擬硬碟映象檔。 不同於 loopback FS 之處是: 比方說你指定 8G 的空間給它, 它一開始並不會真的用掉 8G, 而是從幾 MB (甚至更小) 開始, 隨時視需要慢慢長大。 也就是說, 它目前還沒用到 (還沒向底層的檔案系統要來) 的空間, 你暫時還可以拿來做別的事。 它的驅動程式是 nbd 這個 kernel module。 (Loopback FS? 檔案系統的驅動程式? 請複習 Linux 下的特殊檔案系統。)

  1. 檢查一下是否已載入 nbd 模組: lsmod | grep nbd 如果沒有的話, 載入 nbd 模組: modprobe nbd max_part=16 後面 max_part=16 的意思是: 允許每一顆 qcow2 硬碟上面最多可以切出 16 個分割。
  2. 建立一個名為 finnix.qcow2 、 大小為 2G 的 qcow2 類型虛擬硬碟: qemu-img create -f qcow2 finnix.qcow2 2G
  3. 查看一下實際大小: ls -l 我看到的只有 200K 左右。
  4. 為映像檔指定一個裝置代號, 從此以後要從 /dev/nbd3 這個裝置去讀寫 finnix.qcow2 映像檔: qemu-nbd -c /dev/nbd3 finnix.qcow2
  5. 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 的文章:

  1. qemu-img命令详解
  2. fedora 簡中文件: 使​用​ qemu-img
  3. wiki books: QEMU/Images

解釋 qemu-nbd 的文件:

  1. How to mount a VirtualBox VDI image

關於 nbd 的其他文章:

  1. Connect to a remote block device using NBD

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。