はじめまして、7月に入社いたしましたsatoshiと申します。
会社でも自宅でもPCをMacにして、Linuxと同じ操作感で使用できて快適な今日この頃ですが、皆様いかがお過ごしでしょうか?
今回、KVM(Kernel-based Virtual Machine)とLVM(Logical Volume Manager)を使用して、サーバ構築すると便利なケースを紹介したいと思います。
新しくサーバを構築する場合、OSインストールイメージをDVDに焼いて、DVDをドライブに挿入して、手順の通り選択して...となると思います。 (中には、Cobblerを使用しているという先進的な方もいらっしゃるかもしれませんが)
仮想マシンでは新たにサーバ環境を構築する場合、既存の仮想ディスクをコピーして使い回せるのでインストールの手間を簡略化できます。 さらに、一歩進んでLVMで作成したスナップショットLVを使用すると消費するディスク領域を大幅に節約できます。
今すぐにデモ環境を用意したいとか、Webサーバは共通のものを使いたいが、アプリケーションがPHPとPythonって環境が異なるとか OSをアップグレードしたらどうなるかチェックしたいとか...等々いろいろ利用ケースを考えてみました。
前提環境
作成する仮想マシンは、ベース環境となる仮想マシンを必要としますのであらかじめ作成しておく必要があります。 さらに、スナップショットLVを利用した仮想マシン使用時は、元の仮想マシン(ベース環境)を停止しておきます。 また、インストール時のパラメータを変更すれば、XenやほかのLinuxディストリビューションでも流用可能だと思います。
物理マシン(ホスト環境)
物理マシン(サーバ機)にインストールした環境をホスト環境と呼ぶことにします。
KVMを仮想マシンに使用する場合は、ほぼ強制的にCPU仮想化支援機能が有効化されていることが必要です。
- CPU仮想化支援機能
- IntelVT-x OR AMD-V
- OS
- CentOS5.5
- 仮想マシンソフトウェア
- KVM
- 仮想マシン管理ライブラリ
- Libvirt
- ボリューム管理
- LVM2
仮想マシン(ベース環境,クローン環境)
複製元となる環境をベース環境と呼ぶことにします。
複製元からデータをコピーして作成した環境をクローン環境と呼ぶことにします。
- OS
- CentOS5.5
- 仮想ディスク
- LVM2のLV(Logical Volume)
仮想マシン(オンデマンド環境)
ベース環境のLVから作成したスナップショットLVを利用した環境をオンデマンド環境を呼ぶことにします。
- OS
- CentOS5.5
- 仮想ディスク
- LVM2のスナップショットLV
手順
事前準備
まずは、ベース環境の仮想マシンを作成します。 diskオプションに指定しているpoolは、VG(Volume Group)です。このように指定するとVGからLVが自動的に作成されます。 (LV名は、nameオプションで指定した名称+.img)
ベース環境作成:
# VGをlibvirtで管理 $ sudo virsh pool-create-as ServiceVG00 --type=lvm2 --target=/dev/ServiceVG00 # ベース環境の仮想マシンを作成 $ sudo virt-install \ --location http://ftp.riken.jp/Linux/centos/5/os/x86_64/ \ --accelerate \ --name basevm \ --ram 1024 \ --vcpus 2 \ --noacpi \ --os-variant rhel5.4 \ --network bridge:br0 \ --extra-args console=ttyS0,115200n8 \ --disk pool=ServiceVG00,bus=virtio,size=48,cache=writethrough \ --noreboot \ --keymap=ja #インストーラが起動するので、OSのインストールを行います。 インストールを開始しています... (...) Guest installation complete... you can restart your domain by running 'virsh start basevm'
インストールが完了したら、ホストOSにて仮想マシンの時刻設定を行います。
仮想マシンの時刻設定:
# 仮想マシンの時刻設定変更 $ sudo virsh edit basevm <domain type='kvm'> <name>basevm</name> <uuid>bd55f202-cfd4-3d8b-ef23-d9e4d37c4711</uuid> (...) </features> <clock offset='localtime'/> # <= 'utc'を'localtime'に変更 <on_poweroff>destroy</on_poweroff> (...) </domain>
後は、いつも通りOSの初期設定を行います。 (時刻設定、ネットワーク設定、パッケージインストール・更新等)
ベース環境初期設定:
# 仮想マシンの起動 $ sudo virsh start basevm # ゲストOSにログインして初期設定 $ sudo virsh console basevm connect to domain basevm Escape character is ^] (...) CentOS release 5.5 (Final) Kernel 2.6.18-194.8.1.el5 on an x86_64 basevm login:~root Password: Last login: Sun Aug 1 19:34:34 2010 from 192.168.100.8 [root@basevm ~]#
ケース1: 開発環境を複製する
個人ごとの開発環境を複製して、個別に環境をカスタマイズしたいという場合、ベース環境に必要なパッケージをインストールし、そのベース環境のLVを元にスナップショットLVを作成し、オンデマンド仮想マシンを作成すれば簡単に作成できます。 また、スナップショットLVに割り当てるディスク容量はデータが変更される分のみ見積もればよいので、ディスク容量を大幅に節約できます。
手順
ベース環境のゲストOSで必要なパッケージをインストール
仮想マシン(ベース環境)をシャットダウン
ベース環境用LVのスナップショットLVを作成
スナップショットLVの作成:
# ベース環境LVのパスを確認 $ sudo virsh dumpxml basevm | grep -A5 '<disk' <disk type='block' device='disk'> <driver name='qemu' cache='writethrough'/> <source dev='/dev/ServiceVG00/basevm.img'/> #<= LVのパス <target dev='vda' bus='virtio'/> </disk> <interface type='bridge'> # スナップショットLVの作成(ベース環境に対してディスク容量を1/48で設定) $ sudo lvcreate -s -L 1G -n snapvm.img /dev/ServiceVG00/basevm.img
作成したスナップショットLVを使用し、オンデマンド仮想マシンを作成
OSのインストールはスキップできるので一瞬で仮想マシンの作成は完了します。 diskオプションに指定しているvolはスナップショットLVを指定しますが、指定方法は"Pool名/Volume名"となります。 (Libvirtで管理されているPoolからLVを作成すると自動的にLibvirtの管理下に入ります)
オンデマンド仮想マシンの作成:
$ sudo virt-install \ --import \ --accelerate \ --name snapvm \ --ram 1024 \ --vcpus 2 \ --noacpi \ --os-variant rhel5.4 \ --network bridge:br0 \ --extra-args console=ttyS0,115200n8 \ --disk vol=ServiceVG00/snapvm.img,bus=virtio,cache=writethrough \ --noreboot \ --keymap=ja インストールを開始しています... Guest installation complete... you can restart your domain by running 'virsh start snapvm'
オンデマンド環境の仮想マシンに展開されたOSの各種調整(主にネットワーク設定)
オンデマンド環境の仮想マシンで動作するOSは、元のベース環境とほぼ同じですが、MACアドレスの書換等ネットワーク周りの設定が自動的に変更されています。 環境依存の部分(ホスト名、ユーザパスワード)の変更を行えば、ベース環境のデータを共有しつつも、それぞれ別の開発環境として使用することが可能になります。
個別の環境作成
後は、アプリケーションのデプロイをするだけで専用の開発環境が作成できます。
必要な分だけ以下の操作を繰り返す
必要がなくなれば、仮想マシンを停止しスナップショットLVを削除するだけです。
Tip
- スナップショットLVの拡張方法
- スナップショットLVは通常のLVと同じく拡張が可能ですので、当初の見積もりよりデータの変更量が大きかった場合、下記のコマンドによりディスク容量の拡張できます。
LVのディスク容量の拡張:
# さらに+1G拡張する $ sudo lvextend -L +1G /dev/ServiceVG00/snapvm.img
ケース2: オンデマンド環境の構成を実稼働環境として使用
オンデマンド環境のスナップショットLVをバックアップすると、ベース環境のデータとスナップショットに書き込まれたデータが取得できるので、それを新たに作成したLVに書き込みます。 これにより、ベース環境ともオンデマンド環境とも独立したサーバ環境を構築することができます。 オンデマンド環境の場合、大半のデータをベース環境と共存していましたが、この環境の場合は、すべてのデータをコピーしたクローン環境ですので、全く別の環境として構築することが可能です。
手順
仮想マシンを停止
新規仮想マシンを稼働させるLVを作成
作成するLVのサイズはベース環境のLVと同等以上にします。
LVの作成:
$ sudo lvcreate -L 48G -n prod01.img ServiceVG00
スナップショットLVを利用して仮想イメージを新規LVにコピー
ベース環境のデータとスナップショットに書き込まれたデータを新たに作成したLVにコピーします。 (ディスク容量が大きければそれだけ時間がかかります。)
仮想イメージをLVにコピー:
$ sudo dd if=/dev/ServiceVG00/snapvm.img of=/dev/ServiceVG00/prod01.img bs=8192
仮想マシンを起動し、ゲストOSの設定を修正
手順は、ケース1の4.以降と同様です。
ケース3: 仮想サーバのOSパッケージを実際にインストール・アップグレードした場合の影響が知りたい
yumコマンド等を使用すればいろいろそのパッケージの依存関係とか教えてくれますが、実際にアップグレードしてみないとわからないことも多々あります。 同じ環境の仮想サーバを複数台用意していたとして、そのスペアをアップグレードを試す環境として使うことが多いと思いますが、もし失敗した場合、スペアを破棄しなければならず再インストールということになってしまいます。 実際に試す環境として、スペアから作成したスナップショットLVを使用したオンデマンド仮想マシンを利用することもできます。 これなら失敗したとしてもスペアの環境には影響せず、かつ何度もアップグレードを試すことができます。
手順
仮想マシンの一時停止(virsh suspend)
仮想マシンの一時停止:
$ sudo virsh suspend basevm
仮想マシンLVのスナップショットLVを取得
スナップショットLVを使用して、新規オンデマンド仮想マシンを作成
オンデマンド環境のOSにログインし、実際にパッケージのアップグレード
問題なかったら、オンデマンド環境を停止し削除
一時停止状態の既存仮想マシンを再開し、パッケージのアップグレード
仮想マシンの再開:
$ sudo virsh resume basevm
インストール・アップグレードで失敗しても、2-5の手順を何度でもやり直すことができます。
最後に
今回使用したKVMは、Kernel-based...と名前の通りKernelに組み込まれ、標準のOSをそのままに動作させることが可能になっています。 KernelがバージョンアップするごとにKVMも機能強化されていくのでさらに使いやすくなっていくことでしょう。
コマンドラインが扱いづらいという方は、GUIデスクトップベース・Webベースのツールがリリースされていますのでそちらを使えばよいでしょう。
GUIデスクトップクライアント
- virt-manager( Virtual Machine Manager )
Note
今回使用したコマンド virt-install も上記と同一プロジェクトの成果物です。
Webアプリケーション
大規模VM管理プラットフォーム
参考
仮想化およびLVMについては下記が参考になります。
Virtualization
KVM
LVM
エンタープライズ:特集:LVMによるディスクパーティションの動的化(前編) (1/7)
IBM Linux at IBM | Linux LVM Survival Guide (LVM2)
Libvirt