はじめに
Lpic304を受験したので、サーバー仮想化についてメモ。
サーバー仮想化とは?
物理的な1台のサーバー上で、複数の仮想的なサーバー(仮想サーバー)を運用す
サーバーを仮想化するためのソフトウェアを仮想化ソフトウェア、VMM、仮想マシンモニタなどと呼ぶ
- 仮想化のデメリット
- 性能劣化が発生しやすい。特にネットワーク、ストレージIO
- 仮想環境固有のセキュリティ問題など
仮想化の手法
-
ホストOS型
- VMware Workstation
- VirutalBox
-
ハイパーバイザ型
- Vmware Esxi
- Xen/XenServer
- HyperV
-
コンテナ型
- OpenVZ (RedHat)
- LXC
- Docker
仮想化の種類 -準仮想化と完全仮想化-
- 準仮想化
- ゲストOSに改変必要
-
ハードウェア制御のシステムコールをハイパーバイザコールに書き換える
- 仮想マシン内アプリケーション -> システムコール -> 仮想マシン内の仮想HA -> ハイパーバイザコール ->ハイパーバイザ -> ハードウェアを制御
- よって改変できないWindowsは利用できない
- 完全仮想化
- 仮想ハードウェアによるハードウェアエミュレーション。ソフトウェアでハードウェアを再現
- 仮想マシン-> システムコール(仮想CPU命令)-> QEMU or CPU仮想支援機能 ->実際のCPU命令に変換
- システムコールをハイパーバイザコールに書き換えなくてよいので、ゲストOSの改変が必要ない。
ハイパーバイザ型 XenとKVM
Xenの特徴
- 準仮想化、完全仮想化どっちも対応
- 完全仮想化の場合、CPUの仮想化支援機能を利用する
- ゲストOSをドメインとよぶ
- xlコマンド、virsh、libvirtでLibxenlight(Xenの提供ライブラリ)を使ってXenを利用する
KVM
- 完全仮想化に対応。Windowsも利用できる
- 完全仮想化なのでハードウエアエミュレーションを使用。Qemuが使用される。
- KVMはQEMUに依存。
- 1つの仮想マシンに対して1つのQEMUプロセスが対応。ユーザープロセスとして動作。
- QEMUは/dev/kvmを介してKVMとやり取り
- メモリやディスクIOに関してQEMUを利用。CPUに関しては仮想化支援機能を利用。
- 仮想マシン->仮想CPU命令->QEMU ->実際のCPU命令に変換
- KVM.koのカーネルモジュールが必要
KVMを管理・操作
基本的にlibvirt(後述)がを介したvirshコマンドを利用。ただ、それ以外にも操作できるコマンドがある
-
仮想ディスクの作成や変換、スナップショットなど
- qemu-img
-
スナップショットの作成
- kvm-img
-
KVMを直接 管理・操作
- qemu-kvm
QEMUの操作
- QEMUモニタ。QEMUが提供する仮想コンソール。
- Ctr-Alt-2
KVMのストレージ
- ホストOS側のファイルやブロックデバイスを仮想マシンにストレージデバイスとしてみせることができる
- ゲストOSからのIO要求をKVMでフックしてQEMUプロセスが対応するエミュレータで受けたのち、フォーマットに応じたファイルまたはブロックデバイスへの読み書きに変換する
- ゲストOSからはQEMUを介してIDEやSCSI、virtioそのほか多くの種類のデバイスに見せることができる。
- virtioが最も高速。仮想ディスクをvirtioデバイスとして指定して、virtioドライバをゲストOSにインストールすることで、virtioデバイスをりようできる。
ストレージのバックエンド
ブロックデバイスと通常のファイルの2種類がある。
ブロックデバイスの場合、NFSやLUN上のものを利用したりする
ブロックデバイスとは
https://xtech.nikkei.com/it/article/Keyword/20081023/317625/
- パーティション、論理ボリュームなど
- 具体的には,ハード・ディスクやCD-ROMドライブ,フロッピ・ディスクなどのディスク装置全般がブロック・デバイス
ファイル形式
・raw
- raw(生データの意味)という名称のとおり、単純なデータの列で構成されるファイルであり、
ddコマンドでブロックデバイスをコピーしたものと等価です。 - 実体はスパースファイル(※)として作成されるため、仮想ディスクへの書き込みが発生するたびにブロックを確保することによりフラグメントが発生しやすいという特徴があります。
(※)スパースファイル...ファイルサイズ分のデータをディスクに割り当てるのではなく、メタデータ(ファイルの情報)だけを持つ見かけだけのファイル。よってディスク容量以上のファイルを作成することも可能。
・qcow2
qcow2とは、「QEMU Copy On Write version2」の略で、本来はスパースファイルが利用できない環境(Windowsなど)のためにスパースファイルと同様の機能をもたせたものです。
ファイル内にメタデータを持ち、スナップショットを採取できるという特徴があります。
raw形式はスナップショット機能に対応していません。
しかし、qemu-img convertにより仮想ディスクイメージのファイル形式をqcow2へ変換することで、仮想マシンを作り直すことなくスナップショット機能を使用することができます。
KVMのネットワーキング
- 仮想環境のネットワークはlibvirtのlibvirtdデーモンを使って管理する。
- デフォルトでvirbr0(仮想ブリッジ)とvnet(tapデバイス)が作成されている
tapデバイスと仮想ブリッジ
- tapデバイスは疑似的なEthernetデバイスで、ユーザー空間のプログラムから送受信することができる。Linuxカーネルの機能
- libvirtはこの方式のみサポート
- tapデバイスによる仮想的なethernetデバイスを仮想ブリッジで接続することで、仮想マシンは実デバイスやほかの仮想マシンと通信することができる
方法
https://qiita.com/hot_study_man/items/52af652d7b20a8a998b6
- ホストOSのiptablesを利用したNAT内の仮想ブリッジに仮想マシンを接続する方法(デフォルト)
- 実NICが接続された仮想ブリッジに仮想NICを接続する方法
libvirtとは
- Linux上で動く仮想環境を操作、管理するための共通のインタフェース。安定したC言語のAPIを提供するためのライブラリ
- Redhat社が中心
サポートするVM
Xen Hypervisor http://www.xen.org
Qemu Machine Emulator http://www.qemu.org
KVM(Kernel-based Virtual Machine) http://www.linux-kvm.org
LXC(LinuX Containers) http://lxc.sourceforge.net
UML(User Mode Linux) http://user-mode-linux.sourceforge.net
OpenVZ http://www.openvz.org
VMWare ESX http://www.vmware.com
VirtualBox
wikipedia https://ja.wikipedia.org/wiki/Libvirt
libvirtdデーモン
libvirtdはローカルだけではなくリモートからのアクセスも可能にします。libvirtdによってリモートからVMを管理することもできるようになっています。
KVMのいろんなコマンド
qemu-imgコマンドにより仮想ディスクイメージを作成後、qemu-kvmコマンドを用いて当該ディスクイメージにOSをインストールし仮想マシンを起動します
例)仮想ディスクイメージ「vm1.img」ハードディスクとし、ユーザーモードネットワークを使用して仮想マシンを起動する。
qemu-kvm -hda vm1.img -net nic -net user
※「-net nic」「-net user」はデフォルト値のため省略可
OSインストール
例)仮想ディスクイメージ「vm1.img」をハードディスクとし、ISOファイル「centos.iso」を使用してOSインストールを行う
qemu-kvm -hda vm1.img -cdrom centos.iso
例)仮想ディスクイメージ「vm1.img」をハードディスクとし、直接仮想マシンを起動する
qemu-kvm -hda vm1.img -kernel /boot/bzImage -initrd /boot/initramfs.img -append "root=/dev/hda"
Linuxカーネルから直接起動を行う際は、-appendオプションにrootファイルシステムを指定する必要があります。
qemu-kvmコマンドには、ホストOSの
Linuxカーネルと初期RAMディスクを直接仮想マシンにロードすることにより起動することもできるように、
「-kernel」「-initrd」「-append」の3つのオプションが用意
qemu-img コマンド
qemu-img(kvm-img)
- KVM用の仮想ディスクイメージの作成・変更および仮想マシンのスナップショットの管理を行うコマンド
- 仮想ディスクイメージのファイル形式を変換することもできます。
qemu-img create
qemu-img convert
qemu-img resize
qemu-img info
qemu-img snapshot
1) qemu-imgコマンドで仮想ディスクイメージを作成します
例)フォーマット:qcow2、ディスク容量:2GB、ファイル名「centos.img」でディスクイメージを作成
qemu-img create -f qcow2 centos.img 2G
qemu-img create1 -f raw2 /images/sles11/hda3 8G4
2)qemu-kvmコマンドで、用意した仮想ディスクイメージにゲストOSをインストールします
例)仮想ディスクイメージ「centos.img」をハードディスクとし、メモリ1024MB、OSインストール媒体「centos.iso」を指定して仮想マシンを起動
qemu-kvm -hda centos.img -cdrom centos.iso -boot once=d -m 1024
convert
rawをqcow2に変換
qemu-img convert raw.img -O qcow2 QC2.img
resize
qemu-img resize hdd.img +5G
info
qemu-img info
snapshot
qemu-img snapshot -l hdd.img
qemu-kvmコマンド
イメージを作成した後にqemu-kvm を利用して仮想マシンの設定を行ない、インストールシステムを起動します。
qemu-kvm -name "sles11"1 -M pc-0.122 -m 7683 \
-smp 24 -boot d5 \
-drive file=/images/sles11/hda,if=virtio,index=0,media=disk,format=raw6 \
-drive file=/isos/SLES-11-SP1-DVD-x86_64-GM-DVD1.iso,index=1,media=cdrom7 \
-net nic,model=virtio,macaddr=52:54:00:05:11:118 \
-vga cirrus9 -balloon virtio10
これが終わったあとのシステムの起動
ゲスト側のオペレーティングシステムのインストールが終わったら、 CD-ROM デバイスの 指定を行なう必要はなくなり、簡単にシステムを起動できるようになります:
qemu-kvm -name "sles11" -M pc-0.12 -m 768
-smp 2 -boot c
-drive file=/images/sles11/hda,if=virtio,index=0,media=disk,format=raw
-net nic,model=virtio,macaddr=52:54:00:05:11:11
-vga cirrus -balloon virtio
補足
qemu-kvmコマンドで指定したデバイスは、QEMUによりIDEデバイス「ideN-hdN」または「ideN-cdN」としてエミュレートされます。対応は以下の通りです:
ブロックデバイス : qemu-kvmコマンドのオプション指定
ide0-hd0/ide0-cd0 : -hda,| -drive |index=0
ide0-hd1/ide0-cd1 : -hdb,|-drive| index=1
ide1-hd0/ide1-cd0 : -hdc,|-drive| index=2, | -cdrom
ide1-hd1/ide1-cd1 : -hdd,|-drive| index=3
KVMでスナップショットを取得する方法
- virshコマント
作成
例)仮想マシン「Fedora」のスナップショットを「snapshot1」という名前で作成する
virsh snapshot-create-as Fedora snapshot1
リストア
例)仮想マシン「Fedora」をスナップショット「snapshot1」へ復元する
virsh snapshot-revert Fedora snapshot1
- QEMUモニタコマンド「savevm」を使う方法
・一覧
info snapshots
・スナップショットを作成
例)スナップショットを作成する
(qemu) savevm
・スナップショット復元
例)スナップショットのID3へ復元する
(qemu) loadvm 3
- qemu-imgコマンドを使う方法
・スナップショットを作成
例)仮想ディスクイメージ「cent6.img」のスナップショットを「snapshot2」という名前で作成する
qemu-img snapshot -c snapshot2 cent6.img
・スナップショット復元
例)仮想ディスクイメージ「cent6.img」をスナップショット「snapshot2」へ復元する
qemu-img snapshot -a snapshot2 cent6.img