LPIC304 仮想化メモ

# はじめに
Lpic304を受験したので、サーバー仮想化についてメモ。

# サーバー仮想化とは？
https://www.kagoya.jp/howto/rentalserver/virtualization/

物理的な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とは
https://www.atmarkit.co.jp/ait/articles/1011/04/news121.html

* 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

![1920px-Libvirt_support.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/f7613402-fdbc-ecc4-44a0-e0ce356f7b9a.png)


## libvirtdデーモン
libvirtdはローカルだけではなくリモートからのアクセスも可能にします。libvirtdによってリモートからVMを管理することもできるようになっています。





# KVMのいろんなコマンド
https://ping-t.com/

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コマンド
https://manual.geeko.jp/ja/cha.qemu.running.html

イメージを作成した後に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
```