本文へ移動
vast-cowのブログ
前のページへ戻る

UbuntuでQemu qcow2のイメージをつくりマウントする

この記事を編集

前提

ここでは「QEMU COW イメージ」を、通常使われる qcow2 形式として扱います。QEMU は raw と qcow2 を主要なディスクイメージ形式として扱い、qcow2 は小さなイメージ、圧縮、複数スナップショットなどに対応する形式です。(QEMU)

Ubuntu では qemu-img と qemu-nbd を使うのが基本です。Ubuntu の manpage でも、qemu-img と qemu-nbd は qemu-utils パッケージに含まれるものとして示されています。(Ubuntu Manpages)


0. 注意点

既存 VM のディスクイメージをマウントする場合、その VM は停止しておくのが原則です。QEMU 公式ドキュメントは、実行中の VM や別プロセスが使用中のイメージを qemu-img で変更すると、イメージを破壊する可能性があると警告しています。(GitLab)

また、信頼できない qcow2 イメージをホスト OS に直接マウントするのは避けてください。QEMU の qemu-nbd ドキュメントも、悪意あるゲストイメージがパーティション検出やファイルシステムマウント時のカーネルバグを突く可能性を警告しています。(QEMU)


1. 必要パッケージを入れる

sudo apt update
sudo apt install -y qemu-utils parted e2fsprogs

主な役割は以下です。

コマンド用途
qemu-imgqcow2 イメージの作成、情報表示、変換、リサイズ
qemu-nbdqcow2 を /dev/nbd0 のようなブロックデバイスとして接続
partedパーティション作成
mkfs.ext4ext4 ファイルシステム作成

qemu-nbd は QEMU ディスクイメージを NBD として公開し、Linux では /dev/nbdX ブロックデバイスに接続できます。(Ubuntu Manpages)


方法 A: パーティション付き qcow2 イメージを作成してマウントする

通常の仮想ディスクらしい構成にするなら、この方法が無難です。

2. qcow2 イメージを作成する

例として 20 GB の qcow2 ディスクを作ります。

mkdir -p ~/qemu-images
cd ~/qemu-images

qemu-img create -f qcow2 disk.qcow2 20G
qemu-img info disk.qcow2

QEMU のドキュメントでは、qemu-img create でディスクイメージを作成でき、サイズには M や G のサフィックスを使えると説明されています。(QEMU)


3. NBD カーネルモジュールを読み込む

sudo modprobe nbd max_part=16

max_part=16 は、/dev/nbd0p1、/dev/nbd0p2 のようなパーティションデバイスを扱うための指定です。


4. qcow2 を /dev/nbd0 に接続する

sudo qemu-nbd --connect=/dev/nbd0 --format=qcow2 disk.qcow2

短縮形でも同じです。

sudo qemu-nbd -c /dev/nbd0 -f qcow2 disk.qcow2

QEMU の公式例でも、qcow2 ファイルを /dev/nbd0 として公開し、パーティションがある場合は /dev/nbd0p1 などが作られる場合があると説明されています。(QEMU)

確認します。

lsblk /dev/nbd0

5. パーティションを作る

ここでは GPT パーティションテーブルを作り、全体を ext4 用の 1 パーティションにします。

sudo parted -s /dev/nbd0 mklabel gpt
sudo parted -s -a optimal /dev/nbd0 mkpart primary ext4 1MiB 100%
sudo partprobe /dev/nbd0

確認します。

lsblk /dev/nbd0

期待される表示は概ね以下です。

nbd0      43:0    0   20G  0 disk
└─nbd0p1  43:1    0   20G  0 part

/dev/nbd0p1 が出ない場合は、一度切断して再接続します。

sudo qemu-nbd --disconnect /dev/nbd0
sudo qemu-nbd --connect=/dev/nbd0 --format=qcow2 disk.qcow2
lsblk /dev/nbd0

6. ファイルシステムを作る

sudo mkfs.ext4 -L qemu-data /dev/nbd0p1

既存データがあるデバイスに対して mkfs を実行すると中身は消えます。新規作成時だけ実行してください。


7. マウントする

sudo mkdir -p /mnt/qcow2
sudo mount /dev/nbd0p1 /mnt/qcow2

確認します。

df -h /mnt/qcow2
mount | grep /mnt/qcow2

ファイルを書き込む例です。

echo "hello qcow2" | sudo tee /mnt/qcow2/hello.txt
ls -l /mnt/qcow2

8. アンマウントして切断する

作業後は必ずアンマウントしてから NBD を切断します。

sync
sudo umount /mnt/qcow2
sudo qemu-nbd --disconnect /dev/nbd0

短縮形でも切断できます。

sudo qemu-nbd -d /dev/nbd0

必要なら NBD モジュールを外します。

sudo rmmod nbd

方法 B: パーティションなしで qcow2 全体に ext4 を作る

単純なデータ置き場として使うだけなら、パーティションを作らず、qcow2 全体を ext4 にしても動きます。ただし、通常の VM 用ディスクとしてはパーティション付きの方法 A の方が自然です。

cd ~/qemu-images

qemu-img create -f qcow2 fs.qcow2 10G

sudo modprobe nbd max_part=8
sudo qemu-nbd -c /dev/nbd0 -f qcow2 fs.qcow2

sudo mkfs.ext4 -L qemu-fs /dev/nbd0

sudo mkdir -p /mnt/qcow2
sudo mount /dev/nbd0 /mnt/qcow2

使い終わったら以下です。

sync
sudo umount /mnt/qcow2
sudo qemu-nbd -d /dev/nbd0

既存の qcow2 イメージをマウントする

既存 VM ディスクやクラウドイメージを読む場合は、まず読み取り専用で接続するのが安全です。

sudo modprobe nbd max_part=16
sudo qemu-nbd --read-only --connect=/dev/nbd0 --format=qcow2 existing.qcow2

短縮形です。

sudo qemu-nbd -r -c /dev/nbd0 -f qcow2 existing.qcow2

パーティションを確認します。

lsblk -f /dev/nbd0
sudo fdisk -l /dev/nbd0

例えば /dev/nbd0p1 が ext4 なら、読み取り専用でマウントします。

sudo mkdir -p /mnt/qcow2
sudo mount -o ro /dev/nbd0p1 /mnt/qcow2

作業後です。

sudo umount /mnt/qcow2
sudo qemu-nbd -d /dev/nbd0

書き込みマウントしたい場合は --read-only / -r を外します。ただし、対象 VM が停止していること、同じイメージを他プロセスが使っていないことを確認してください。


COW 差分イメージを作る場合

「COW イメージ」が ベースイメージを変更せず、差分だけ別ファイルに保存するイメージ という意味なら、backing file 付きの qcow2 を作ります。

例:

qemu-img create -f qcow2 -F qcow2 -b base.qcow2 overlay.qcow2

確認します。

qemu-img info --backing-chain overlay.qcow2

この場合、overlay.qcow2 には base.qcow2 との差分が記録されます。QEMU の qemu-img create ドキュメントでは、backing file を指定した場合、新しいイメージは backing file との差分を記録し、通常 backing file 自体は変更されないと説明されています。(GitLab)

差分イメージをマウントする場合は、base ではなく overlay を接続します。

sudo modprobe nbd max_part=16
sudo qemu-nbd -c /dev/nbd0 -f qcow2 overlay.qcow2

lsblk -f /dev/nbd0
sudo mkdir -p /mnt/qcow2
sudo mount /dev/nbd0p1 /mnt/qcow2

作業後です。

sync
sudo umount /mnt/qcow2
sudo qemu-nbd -d /dev/nbd0

ベースイメージの形式が raw の場合は -F raw にします。

qemu-img create -f qcow2 -F raw -b base.raw overlay.qcow2

最小コマンドまとめ

新規 qcow2 を作って ext4 パーティションをマウントする最小例です。

sudo apt update
sudo apt install -y qemu-utils parted e2fsprogs

qemu-img create -f qcow2 disk.qcow2 20G

sudo modprobe nbd max_part=16
sudo qemu-nbd -c /dev/nbd0 -f qcow2 disk.qcow2

sudo parted -s /dev/nbd0 mklabel gpt
sudo parted -s -a optimal /dev/nbd0 mkpart primary ext4 1MiB 100%
sudo partprobe /dev/nbd0

sudo mkfs.ext4 /dev/nbd0p1

sudo mkdir -p /mnt/qcow2
sudo mount /dev/nbd0p1 /mnt/qcow2

# 作業
echo test | sudo tee /mnt/qcow2/test.txt

# 後片付け
sync
sudo umount /mnt/qcow2
sudo qemu-nbd -d /dev/nbd0

この記事を編集
この記事を共有:

コメント


前の記事
GrubbyでELRepoカーネル設定
次の記事
Rocky Linux 9 の rootfs を F2FS に変更する手順