KVMで仮想マシンのクローンを作成する方法 ― virt-cloneに頼らない手動クローン術
注:このチュートリアルは、virt-sysprepがインストールされていない環境を前提としています。このツールについては記事の後半で詳しく説明します。
ご安心ください。これはvirt-cloneの基本的な使い方を説明した、どこにでもあるようなハウツー記事ではありません。確かにvirt-cloneは仮想マシンの複製を作るうえで便利なツールですが、現状の仕様では、クローンに対して新しいUUIDとMACアドレスを割り当てるだけです。つまり、クローンが起動した後に追加の調整やカスタマイズを自分で行う必要があり、かなり面倒な作業を強いられることになります。これは望むところではありませんよね。
そこで本記事では、KVM上で仮想マシンの同一コピーを作成しつつ、ホストごとに一意の情報を付与する別の方法をご紹介します。これにより、複製したゲストOSがそれぞれ独立したホストとしてネットワーク上で認識されるようになります。言い換えれば、一度OSをインストールすれば、あとは必要な数だけゲストのインスタンスを生成でき、それぞれに個別のホスト名、MACアドレス、IPアドレスなどを設定できるのです。しかも、この手順は完全にスクリプト化可能です。それでは始めましょう。
効率の低い方法:virt-cloneの課題
まずvirt-cloneについて簡単に触れておきましょう。決して悪いツールではありませんが、ディストリビューションによって提供状況が異なるのが難点です。Virtual Machine Managerの一部としてGUIコンポーネントのみを同梱しているものもあれば、コマンドラインツールも併せて提供しているものもあります。いずれの場合も、クローンには新しいUUIDとMACアドレスが割り当てられるだけで、それ以外の情報は何も変更されません。設定ファイルは/etc/libvirt/qemu以下に保存されます。
つまり、この方法だけでは完璧とは言えず、追加の手作業が必要になるわけです。
クローニングに必要な道具
ここからが本題となる「正しいやり方」です。必要なツールは実質ひとつだけ。kpartxという、パーティションテーブルからデバイスマップを作成できるユーティリティです。具体的には、仮想ディスクを照会することで、ゲストマシンのパーティションマッピングを作成できます。ここではLinuxでの使用例を示しますが、ほとんどのUNIX系システムでも同様に動作します。
まず、仮想ディスクからパーティションテーブルを読み取る必要があります。その前に、各マシンが独自のディスクを持つことになるため、仮想ディスクのコピーを作成します。これがクローン作業全体で唯一時間のかかるステップで、所要時間はファイルサイズとディスク速度に依存します。一般的な20GBのディスクファイルなら、コピーに数分かかるでしょう。
cp <旧ディスクファイル> <新ディスクファイル>
続いてパーティションテーブルを扱います。
kpartx -a <仮想ディスクファイル>
このコマンドを実行すると出力が表示され、仮想マシン内のパーティションごとに個別のマッパーが生成されます。たとえば/と/homeの2つのパーティションがある場合は、2つのマッパーが作られます。
kpartx -av /kvm/disk.raw
add map loop0p1 (253:0): 0 4206592 linear /dev/loop0 2048
add map loop0p2 (253:1): 0 79677440 linear /dev/loop0 4208640
あとは該当するデバイスをマウントして、ホスト固有の変更を加えるだけです。
mount /dev/mapper/<対象パーティションのループバック> /マウントポイント
具体例は次のとおりです。
mount /dev/mapper/loop0p1 /mnt
ホスト固有の変更箇所
マウントできたら、仮想マシンに対して以下のような変更が必要になるでしょう。
/etc/hosts
/etc/HOSTNAME
さらに、Debian系かRed Hat/SUSE系かによってネットワーク設定ファイルも編集します。DHCPを使用していれば不要な場合もありますが、静的IPアドレスを使っているなら必須の作業です。
/etc/sysconfig/network/ifcfg-<デバイス名>
または
/etc/network/interfaces
その他にも変更が必要な場合がありますが、まずは以上が基本となります。変更を保存したらアンマウントしましょう。次のステップは、新しいクローン用のKVM設定ファイルの編集です。XMLファイルは通常、Virtual Machine Managerで自動作成された場合、/etc/kvm/vmまたは/etc/libvirt/qemuディレクトリに格納されています。
XMLファイルの変更
まず、テンプレートとなる設定ファイルのコピーを作成します。
続いて、ドメインの一意のID(UUID)、名前、MACアドレスを編集します。先ほどと同様、ある種の一意性を保証するロジックを実装する必要があります。grepやawk、sedによるインライン検索・置換、そして必要に応じて正規表現を組み合わせれば、手順全体を完全にスクリプト化できます。もちろん、ハードディスクの指定も正しいファイルを指すように変更してください。
参考までに、必要になるコマンドの例を示します。
sed -i -e 's/<uuid>.*/<uuid>dedoimedo<\/uuid>/' file.xml
grepを組み合わせて、正しく置換されたことを確認できます。
sed -i -e 's/<uuid>.*/<uuid>dedoimedo<\/uuid>/' file.xml | grep dedoimedo
<uuid>dedoimedo</uuid>
すべてをまとめる:完全なクローンスクリプト
以上を踏まえると、完全なクローンスクリプトは次のようになります。ここでは典型的なRed Hat系の例を挙げますが、ご自身の環境に合わせて調整してください。また、スクリプトの一部には独自のロジックが必要です。たとえば、パーティション出力の解析方法の決定や、XMLファイルの出力から括弧や引用符などの文字を取り除く処理などが該当します。
#!/bin/bash
# クローン中はテンプレートOSをサスペンド
virsh suspend <ドメイン>
cp <旧ディスク> <新ディスク>
virsh resume <ドメイン>
kpartx -a <新ディスク>
# 対象パーティションを読み取るロジック
mount <目的のパーティション> <マウントポイント>
# ホスト固有ファイルの内容を解析するロジック
sed -i -e 's/旧ホスト名行/新ホスト名行/' /etc/HOSTNAME
sed -i -e 's/旧ホスト名行/新ホスト名行/' /etc/hosts
sed -i -e 's/旧IP設定/新IP設定/' /etc/sysconfig/network/ifcfg-eth0
umount <マウントポイント>
cp /etc/kvm/vm/old.xml /etc/kvm/vm/new.xml
# 新しいuuid、name、macなどを生成するロジック
# XMLファイルを正しく解析するロジック
sed -i -e 's/旧uuid/新uuid/' /etc/kvm/vm/new.xml
sed -i -e 's/旧name/新name/' /etc/kvm/vm/new.xml
sed -i -e 's/旧mac/新mac/' /etc/kvm/vm/new.xml
sed -i -e 's/旧disk/新disk/' /etc/kvm/vm/new.xml
virsh create /etc/kvm/vm/new.xml
exit 0
これで完成です。起動して楽しんでください!
将来の主流はvirt-sysprep
実は、virt-sysprepが利用可能な環境であれば、このチュートリアルの手順自体が不要になります。これは比較的新しいバージョンのOSを使用している場合に当てはまります。しかし、ビジネス環境ではそうとは限らず、多くのシステム管理者にとってこのツールは使えないのが現状です。もし機会があればぜひ試してみてください。基本的なクローンツールに対して、非常に便利な改善をもたらしてくれます。公式ドキュメントからの引用です。
Virt-sysprepは仮想マシンをリセットまたは未構成状態に戻し、そこからクローンを作成できるようにします。このプロセスには、SSHホストキーの削除、永続的なネットワークMAC設定の削除、ユーザーアカウントの削除などのステップが含まれます。各ステップは必要に応じて有効化・無効化できます。Virt-sysprepはゲストまたはディスクイメージをその場で変更します。ゲストはシャットダウンされている必要があります。既存のゲストの内容を保持したい場合は、事前にディスクをコピーまたはクローンしてください。
この便利なツールについては、別のチュートリアルで改めて詳しく解説する予定です。
関連記事
KVMに関するその他の記事もぜひご覧ください。
- KVM + VirtualBox の共存ガイド
- KVM ブリッジネットワークのチュートリアル
- KVM ストレージとネットワーク管理
- ESXiマシンのクローン方法(概念はほぼ同じ)
- 仮想マシンのディスクイメージ操作に便利な libguestfs
まとめ
これは非常にシンプルでエレガントなチュートリアルです。他のツールによる主に手作業のクローン手順を補完するものとして、きっと役立つはずです。紹介したコマンド群は、ひとつのBASHスクリプトにまとめるだけで簡単に自動化できます。
真面目な話をすると、この記事を通じて、KVMの設定とファイルの場所、virt-cloneのごく初歩的な使い方、仮想マシンのディスクのマウント方法、partxを使ったパーティション内データ(ネットワーク設定やホスト設定を含む)の編集方法、そして仮想ドメインへの一意フィールドの割り当て方を学べました。さらにlibguestfsの存在や、その他の有用なガイドも紹介しました。5分の作業としては悪くない成果だと思います。
最後に一言。virt-sysprepを使えばクローン作業は格段に楽になりますが、手動の方法は少し複雑である反面、確実に機能します。既存のコマンドラインオプションの制約を受けず、何でも思い通りに行えます。常に動作し、常に完全にスクリプト化できる。素晴らしいことです。
それでは、今回はこの辺で。
-
仮想マシンでの3Dアクセラレーション パート2:VirtualBoxとOpenGLの設定方法チュートリアル
本記事は、仮想マシンにおける3D仮想化の設定と活用方法を解説する全3回シリーズの第2回です。今回は、WindowsまたはLinuxホスト上にインストールしたVirtualBoxで動作するWindows仮想マシンに対して、OpenGLアプリケーション(およびゲーム)向けの3Dアクセラレーションを有効にする方法を学びます。前回の第1回では、VMware製品を使ってWindows上のDirectXプログラムに3Dアクセラレーションを有効化する手順をご紹介しました。このときはホストOSがWindowsでもLinuxでも問題なく動作しました。そして最終回となる第3回では、LinuxホストとLinux仮想
-
仮想マシンで3Dアクセラレーションを実現する方法 パート1:VMwareとDirectXの設定チュートリアル
既存のホストマシンの上で仮想化されたOSを動かすのは、とても魅力的なアイデアです。楽しく、クールで、実際のプラットフォームに導入する前にソフトウェアを試せるだけでなく、通常はためらってしまうような操作にも挑戦できます。さらに大きな柔軟性を得られ、展開コストも大幅に削減できます。しかし、ほとんどの仮想化ソフトウェアに欠けていたのが、ゲストOS向けの3Dアクセラレーションでした。あるいは「欠けていた」と言うべきでしょう……今や、仮想マシンでの3Dアクセラレーションは現実のものとなっています。はじめにこの連載記事では、ゲストOSで3Dアクセラレーションを有効にするために必要な簡単な設定テクニックを紹