こんにちは!クラウドインフラやKubernetesの裏側で、日々飛び交うパケットやストレージの唸り声にロマンを感じているSREの皆さん、そしてこれからインフラの世界へ飛び込もうとしている未来のエンジニアの皆さん。
私たちが普段何気なくクラウド上で立ち上げている仮想マシン。その心臓部である仮想ディスクの裏側で、いったい何が起きているか気になったことはありませんか?
「仮想マシンのスナップショットって、なんであんなに一瞬で作成できるんだろう?」
「数ギガバイトもあるディスクのコピーなのに、ストレージを圧迫しないのはなぜ?」
今回は、KVMやQEMUといったオープンソースの仮想化技術の世界で主役として活躍する、QCOW2フォーマットの内部構造と、その魔法のような仕組みであるコピーオンライト(Copy-on-Write)にスポットを当てます。
小難しい専門用語はちょっと置いておいて、まずは身近な「郵便配達」や「本棚」に例えながら、一歩ずつ優しく紐解いていきましょう!
—
1. 仮想ディスクって、そもそもどうやって保存されているの?
物理的なパソコンであれば、ハードディスクやSSDのプラッタやフラッシュメモリ上に直接データが書き込まれますよね。でも、仮想マシン(VM)にとってのハードディスクは、実際にはホストOS(物理サーバー)から見ると「ただの大きな1個のファイル」にすぎません。
KVM/QEMU環境で最もよく使われる仮想ディスクの形式が、この QCOW2(QEMU Copy On Write v2)です。
このQCOW2ファイルが優れているのは、「最初から巨大なファイルを占有しない(可変長)」ことと、「賢い仕組みでデータの変更点だけを管理できる」という点にあります。この「賢さ」の秘密が、これから解説するL1/L2テーブルとコピーオンライトの仕組みです。
—
2. 巨大な本棚を効率よく管理する!「L1/L2テーブル」の仕組み
QCOW2の内部構造を理解するために、少しイメージを広げてみましょう。
想像してください。あなたは、何百万冊もの本が収められた巨大な図書館の館長さんです。お客さん(仮想マシン)から「34567番の本棚の、上から3段目の左から2冊目の本を読ませて!」とリクエストが来ました。
もし、図書館全体の目録がなく、1冊ずつ端から探していたら日が暮れてしまいますよね。そこでQCOW2は、L1テーブルとL2テーブルという「2段階の索引(インデックス)」を用意しています。
- L1テーブル: 大まかなエリア(フロア)を指し示す大目録
- L2テーブル: そのフロアの中の細かい棚(詳細な番地)を指し示す小目録
QCOW2のファイルの中では、仮想マシンが見ている仮想的なディスクのアドレス(仮想アドレス)が、このL1とL2のテーブルを経由して、ホストOS上の実際の物理的な場所(クラスタ)へと変換されています。
この構造があるおかげで、仮想マシンが「ディスクのここを書き換えて!」と言ったとき、QEMUはファイル全体をあちこち探すことなく、一瞬でピンポイントの場所を特定して書き換えることができるのです。
—
3. コピーオンライト(Copy-on-Write)の魔法:郵便の「付箋システム」
さて、ここからが本題です。QCOW2の真骨頂であるコピーオンライト(Copy-on-Write)について見ていきましょう。
エンジニアの現場では「CoW(コウ)」と略されることも多いこの技術。一言で言うと、「実際に書き換えが発生するまで、元のデータをコピーせず、使い回そう!」という究極の怠け者(=効率主義)な仕組みです。
現実世界で例えてみましょう
ここに、分厚い「社内マニュアル(ベースとなる仮想ディスク)」があるとします。
新入社員のA君が入社してきました。あなたはA君にマニュアルを渡す必要があります。
- 昔ながらのやり方(フルクローン):
A君のために、わざわざコピー機で分厚いマニュアルを丸ごと1冊コピーして渡します。これだとコピーに時間がかかるし、書庫のスペース(ストレージ容量)もあっという間に埋まってしまいますよね。
- コピーオンライトのやり方(QCOW2のスナップショット):
A君には「このマニュアルをそのまま読んでね」と、原本への参照(リンク)だけを渡します。これなら一瞬で渡せますし、スペースも1ミリも消費しません。
そして、A君が実際に仕事を始めて、「ここは我が社のやり方と違うな、書き換えたい!」となった瞬間、その変更するページだけを別のノートにコピーして、そこに書き込みます。
これがコピーオンライトの本質です。「Write(書き込み)」が起きるその瞬間(On)に、必要な分だけ「Copy(複製)」する。だからCoWと呼ばれています。
仮想マシンの世界でも全く同じです。ベースとなる「黄金マスター(親イメージ)」を読み取り専用として置き、そこから派生した差分(子イメージ)には、新しく書き換えたデータだけが記録されていきます。
[親イメージ (Base Image)] <--- 読み取り専用(マスター)
^
| (参照)
[子イメージ (Overlay)] <--- 差分(書き込みはこちらへ!)
この仕組みのおかげで、数秒で新しい仮想マシンのクローンを作ったり、いつでも元のきれいな状態に戻すスナップショット機能が実現できているのです。
—
実務で使ってみよう!QCOW2と差分ディスクの操作
理論が分かったところで、実際にLinux環境(KVM/QEMU)でこのQCOW2の差分ディスクを作るコマンドを見てみましょう。実務の現場でも本当によく使う操作です。
まずは、ベースとなるマスターイメージ(親イメージ)を用意し、そこからコピーオンライトの恩恵を受けた差分ディスク(オーバーレイ)を作成してみます。
# 1. ベースとなるマスターイメージを作成します(容量は最大50GBに設定)
qemu-img create -f qcoq2 base_image.qcow2 50G
# ※ 注釈: ここで作成した base_image.qcow2 が「元となる分厚いマニュアル」になります。
# 実際にはまだ50GBの容量を消費するわけではありません(スパースファイル構造)。
次に、このベースイメージを「読み取り専用の親」として指定し、新しい仮想マシン用の差分ディスク(オーバーレイ)を作成します。
# 2. ベースイメージを親に指定して、差分ディスク(vm01.qcow2)を作成する
qemu-img create -f qcow2 -F qcow2 -b base_image.qcow2 vm01.qcow2 50G
# 注釈パラメータの解説:
# -f qcow2 : 作成するファイルの形式を指定
# -F qcow2 : 親イメージのファイル形式を指定
# -b base_image... : 親となるベースイメージのパスを指定
# vm01.qcow2 : 作成する差分ディスクの名前
たったこれだけのコマンドで、vm01.qcow2 という名前の新しい仮想ディスクが数ミリ秒で作成されました。この vm01.qcow2 は、初期状態では数キロバイト程度のサイズしかありません。なぜなら、まだ親イメージを参照しているだけで、何もデータを書き込んでいないからです!
その後、仮想マシンが起動し、OSのパッチ当てやアプリのインストールでファイルが書き換わると、その変更分だけが vm01.qcow2 に蓄積されていきます。
—
4. コピーオンライトの「光と影」:SREとしての現場の知見
ここまで聞くと「QCOW2とコピーオンライトって最強じゃないか!」と思われるかもしれませんが、現場の第一線でインフラを支えるSREとしては、光があれば影(注意点)もあることをお伝えしなければなりません。
1. パフォーマンスのオーバーヘッド
読み込みの際、もしデータが差分ディスク(子)になければ、システムは親イメージを探しに行きます。さらに親の親……と多段にスナップショットを重ねすぎると(チェーンが長くなると)、ストレージのルックアップ(参照)に時間がかかり、I/Oパフォーマンス(ディスクの読み書き速度)が低下します。
- 対策: 本番環境の仮想マシンでは、スナップショットの多段ネストを避け、定期的にイメージを統合(コミット・ベースへのマージ)する運用が求められます。
2. 断片化(グロースとフラグメンテーション)
書き込みと削除が頻繁に行われる環境では、QCOW2ファイル内部のL1/L2テーブルやクラスタが散らかり、ホストOS側の物理ファイルが断片化を起こします。これにより、見かけ上のファイルサイズが膨らみ続け、使っていないはずの領域が解放されない現象(肥大化)が起きます。
- 対策: 時折、仮想マシン側で
fstrimコマンドを実行して未使用ブロックをホストに通知したり、qemu-imgを使った領域の最適化(リサイズや収縮)を行うメンテナンスが必要になります。
—
まとめ
今回は、仮想化技術の裏側でいぶし銀の働きをする QCOW2の構造 と コピーオンライト の仕組みについて、郵便配達や本棚に例えながら解説しました。
- QCOW2 は、L1/L2テーブルという目録を使って効率的にデータ管理を行っている。
- コピーオンライト は、変更が起きるまで原本を参照し、書き込みの瞬間だけ差分を記録するスマートな仕組み。
- わずか数行の
qemu-imgコマンドで、爆速かつ省スペースな仮想ディスク環境が手に入る。
一見すると難解に思える仮想化ネットワークやストレージの仕組みも、実世界のルールに置き換えてみると、エンジニアリングがいかに人間の知恵の結晶であるかがよく分かりますよね。
「一歩ずつ理解していけば、どんな複雑なインフラも怖くない!」
日々のインフラ運用の片隅で、この記事が皆さんの知的好奇心を刺激するスパイスとなれば幸いです。それではまた、次の技術の深海でお会いしましょう!
コメント