仮想化技術について (LPIC 304対策用メモ)

# 仮想化のメリット

* 物理サーバ及びサーバの設置スペース
* 物理サーバの調達や運用・管理コスト
* 消費電力などのランニングコスト

#### ホストOS型

* ホストOSの上に構築するタイプ

#### ハイパーバイザー型

* ホストOSを介するオーバーヘッドがない
* 準仮想化：ゲストOSのコードに改変が必要、デバイスドライバはゲストOS上にインストール
* 完全仮想化：windowsなども使える、パフォーマンスは劣化する
* ゲストOSが特権CPU命令を出すにはバイナリトランスレーション、CPU仮想化支援機能を使用する
* CPUの仮想化支援機能では仮想化ソフトウェアの処理を一部担うことでパフォーマンスを向上させる
* AMD-V, Intel Vt

#### コンテナ型

* OS上で仮想環境を動かす
* ゲストOSや仮想ハードウェアは含まれない

# Xen

## 特徴
* ハイパーバイザー型仮想化テクノロジー
* 各種デバイスの操作はカーネルへ依存
* SMP(Symmetrical Multi Processing)にも対応
* 準仮想化ゲストと完全仮想化ゲストをサポート
* 完全仮想化ドメインをHVMと呼ぶ
* 管理用OSを実行するドメインをDomain-0
* ゲストOSを実行するドメインをDomain-U
* ブリッジモードがデフォルト
* ネットワークインターフェースはDomain-0側にvif1.0

## 設定ファイル
/etc/xen/domain1

例)完全仮想化ゲストを動かすための設定ファイル例
builder='hvm'

/etc/xen/xl.conf(グローバル設定ファイル)
/etc/xen/xl.cfg(ドメイン個別の設定ファイル)

## コマンド類

##### xl(xmの拡張)

xl <サブコマンド> [引数]
Xenを操作するためのコマンドラインユーティリティ

|サブコマンド|説明|
|:--|:--|
|block-attach|新しい仮想ブロックデバイスの作成|
|block-detach|ドメインの仮想ブロックデバイスの切り離し|
|block-list|ドメインにアタッチされているブロックデバイスを表示|
|cd-eject|ゲストドメインの仮想CDドライブからのCD取り出し|
|cd-insert|CD挿入|
|console|ドメインの仮想コンソールを開く|
|create|ドメイン起動|
|destroy|ドメイン強制終了|
|info|Xenホストの情報を表示|
|list|現在動作しているドメインの基本情報を表示|
|migrate|ドメインを別ホストに以降|
|shutdown|ドメインの正常終了|
|vcpu-set|仮想CPU数の変更|

#### xe

xe <サブコマンド> <引数=値>

XAPIはXenのサブプロジェクトとして開発されており、XenServerのためのデフォルト管理ツールの拡張

|サブコマンド|説明|
|:--|:--|
|cd-list|CDの一覧表示|
|sr-destroy|ストレージリポジトリ削除|
|sr-list|ストレージリポジトリ一覧表示|
|vm-cd-insert|ISOファイルのマウント|
|vm-destroy|ホスト上の仮想マシン削除|
|vm-list|ホスト上の仮想マシン一覧表示|
|vm-start|仮想マシンの起動|

#### xentop

xentop <オプション>
Xenシステム及びドメインにおける利用状況をリアルタイムで表示するためのコマンド

|オプション|説明|
|:--|:--|
|-b, --batch|出力データをコンソールへリダイレクト|
|-d, --delay|更新間隔を秒数で表示|
|-f, --full-name|完全ドメイン名を表示|
|-n, --networks|ネットワーク情報を表示|
|-v, --vcpus|VCPUの情報を表示|
|-x, --bbds|ブロックデバイスを表示|

#### xebstore-ls

xenstore-ls [オプション] [パス|UUID] [引数]
XenStoreに格納されているキーと値を情報を一覧表示するためのコマンド

|オプション|説明|
|:--|:--|
|-f|すべてのキーのフルパスを表示|
|-p|パーミッションを表示|
|-s|ローカルソケットのみを使用してxenstoredに接続|

# KVM (Kernel-based Virtual Machine)

## 特徴

* 完全仮想化をサポート
* CPUの仮想化支援機能を前提に設計/開発
* Intel VT　及びAMD-Vが必要
* ハードウェアデバイスのエミュレータが必要
* QEMUが使用されている
* カーネルの一部として組み込まれている為カーネルのデバイスドライバをそのまま利用できる
* kvm.ko, qemu, libvirt, brige-utilsが必要
* ホストOS上にvirb0という仮想ブリッジとTAPデバイスが作成される
* Libvirtのlibvirtdデーモンによって管理される

## 設定ファイル

/etc/kvm
/dev/kvm

## コマンド類

#### qemu-img
スナップショットのファイル形式はqcow,qcow2

qemu-img <サブコマンド> [オプション]

|サブコマンド|説明|
|:--|:--|
|check|ディスクイメージにエラーがないかどうかのチェック|
|commit|変更のコミット|
|convert|ディスクイメージの変換|
|create|指定したファイル名で新しいディスクイメージを作成|
|info|ディスクイメージに関する情報の表示|
|snapshot|スナップショットの表示(-l), 適用(-a), 作成(-c)|

#### QEMUモニタ

Ctrl + Alt + 2でモニタ切り替え

|コマンド|説明|
|:--|:--|
|change|メディアの変更|
|commit|ディスクイメージに対する変更を確定|
|delvm|スナップショットの削除|
|eject|メディアの取り出し|
|info <引数>|情報の表示|
|loadvm|スナップショットから仮想マシンを復元|
|savevm|スナップショットの作成|

#### qemu-kvm

KVMを管理/操作するための基本ユーティリティ

qemu-kvm [オプション]

|オプション|説明|
|:--|:--|
|-drive|新しいドライブを定義|
|-boot|ドライブの起動順序を定義|
|-cdrom|指定したファイルをCD-ROMイメージとして使用|
|-snapshot|ディスクイメージファイルの代わりに一時ファイルを書き出し|
|-usb|USBドライバを有効化|
|-uuid UUID|UUIDを設定|

#### brctl

ブリッジを管理するコマンド

|オプション|説明|
|:--|:--|
|addbr|新しいブリッジの作成|
|addif|ブリッジにインターフェースを接続|
|show|ブリッジの状態を確認|

#### tunctlコマンド

TUN/TAPデバイスを作成/管理するためのコマンド

|オプション|説明|
|:--|:--|
|-b|インターフェース名の表示|
|-n|TUNインターフェースの作成|
|-p|TAPインターフェースの作成|
|-d|指定したインターフェースの削除|
|-t|インターフェース名を定義|

# OpebVZ

## 特徴

* Linuxカーネルをベースとしたオープンソースのコンテナ型仮想化ソフト
* Windowsは動かせない

## コマンド類

#### vzpkg

EZテンプレートのインストール等

#### vzctl

OpenVZの操作

vzctl <サブコマンド> <コンテナID>

|オプション|説明|
|:--|:--|
|create|コンテナ作成
|destroy|コンテナ破棄
|exec|OS上の任意のコマンドの実行
|exec2|上記＋exitコードを返す
|restart|コンテナの再起動
|set|各種設定
|start|コンテナ起動
|stop|コンテナ停止
|suspend|コンテナ一時停止

# LXC(Linux Container)

##　特徴

* カーネルの機能(cgroups)を用いてコンテナを実現
* 高性能
* テンプレートファイルを使用してコンテナを作成

## 設定ファイル

テンプレート
/usr/share/lxc/templates

## コマンド類

|コマンド|説明|
|:--|:--|
|lxc-console|コンテナにコンソール接続|
|lxc-create|コンテナ作成|
|lxc-destroy|コンテナ破棄
|lxc-start|コンテナ起動|
|lxc-stop|コンテナ停止

# その他ツール類の説明

* Docker ： コンテナ仮想化ツール
* Chef ：　サーバーの環境構築、運用などを自動化するためのツール
* Puppet　:　構成管理ツール。Rubyで書かれている
* Ansible : 構成管理ツール
* Packer　：　サーバーイメージを作成するためのツール

# Libvirt

## 概要/特徴

* Xenに対応するAPIとして開発がスタート
* 仮想化環境を操作/管理するための共通インターフェス(抽象化ライブラリ)
* libvitrdが内部で動いている
* 起動すると「default」というNATブリッジが作成される
* SASL/Kerberos/SSHのプロトコルをサポート

## 設定ファイル

/etc/libvirt/libvirtd.conf

## 関連ツール

|ツール|説明|
|:--|:--|
|virt-clone|イメージ複製ツール
|virt-image|XMLファイルから仮想マシンを作成するためのツール
|virt-install|メディアから新しい仮想マシンを作成するためのツール
|virt-manager|GUI管理ツール
|virt-viewer|グラフィカルコンソール

## コマンド類

#### virsh <サブコマンド> [引数]

libvirtが提供する標準のコマンドラインツール　

|コマンド|説明|
|:--|:--|
|autostart|libvirtdの起動時にゲストの仮想マシンを自動起動|
|change-media|仮想マシンにアタッチされたCD-ROMイメージファイルを変更|
|console|ゲストの仮想マシンのコンソールに接続|
|create|XMLファイルからゲストの仮想マシンを作成|
|destroy|ゲストの仮想マシンを強制停止|
|dump|ゲストの仮想マシンのコアダンプを出力|
|dumpxml|ゲストの仮想マシン用の設定ファイルをXML形式で出力|
|list|ゲストの仮想マシン一覧を表示|
|migrate|ゲストの仮想マシンを別ホストに移行|
|net-auto|仮想ネットワークの自動起動|
|net-edit|ゲストの仮想ネットワークの一覧を表示|
|net-list|仮想マシンネットワークの一覧を表示|
|net-start|仮想ネットワークを起動|
|reboot|ゲストの仮想マシンを再起動|
|resume|ゲストの仮想マシンを再開|
|save|ゲストの仮想マシンをファイルに保存|
|setmem|ゲストの仮想マシンに割り当てるメモリサイズを設定|
|setvcpus|ゲストの仮想マシンに割り当てる仮想CPU数を設定|
|shutdown|ゲストの仮想マシンを停止|
|suspend|ゲストの仮想マシンを一時停止|
|vcpuinfo|ゲストの仮想CPUを表示|
|vcpuin|CPUアフィニティを設定|
|vol-list|ストレージプール内のストレージボリュームの一覧を表示|

# クラウド管理ツール

### OpenStack

* IaaS用プラットフォーム
* 主要コンポーネント(Cinder,Glance,Keystone,Neutron,Nova,Swift)

### CloudStack

* 現在は Apache CloudStackとして開発
* 管理サーバがさまざまなハイパーバイザーと通信する基盤を提供

# 高可用の概念と理論

### 高可用クラスタとは

* システムに冗長性を持たせSPOFをなくすことで耐障害性を向上させること

### スプリットブレイン
*  ネットワークの不具合等が原因でノード間のハートビート通信が途絶えた場合に複数ノードがマスターとなってしまったりサービスの二重起動が起きてしまう減少。

### フェンシング

* クラスタ内のあるノードで障害が発生した場合そのノードの挙動はシステムにとって何らかの問題を引き起こす可能性がある。速やかに障害ノードと正常ノードの干渉を防ぐ。フェンシングデーモンによって実装される。

|コマンド|説明|
|:--|:--|
|パワーフェンシング|パワーコントローラーを使用して障害ノードの電源をOFFにする
|スイッチフェンシング|障害ノードと他のノードや共有ディスクとの通信をスイッチで遮断する
|GNBDフェンシング|GNBDサーバに対するアクセスを無効にする

### クォーラム

* 議決に必要な定足数
* 一定数以上の正常なノードが存在していればそのクラスタグループを有効なグループとみなす
* 有効では無いグループをフェンシング
* ノードマジョリティとも呼ばれる

### ディザスタ・リカバリ

* 地震や火事などを想定した災害からのシステム復旧を表す言葉
* RPO（Recovery Point Objective） 過去のどの時点まで戻すか
* RTO(Recovery Time Objective) いつまでにデータを復旧すればよいか

# ロードバランスクラスタ(負荷分散クラスタ)

### LVS(Linux Virtual Server)

* クライアントからのリクエストを複数のサーバに振り分ける機能を提供
* サービスを提供するサーバをリアルサーバ
* 割り振るサーバを仮想サーバ
* トランスポート層で動作するためレイヤ4スイッチングともいう
* 中心的なコンポーネントとしてip_vsがある
* lsvdがnannyという子プロセスを生成し1対1で対応する

### LVSのフォワーディング方式

/proc/sys/net/ipv4/ip_forward = 1の必要がある

|方式|説明|
|:--|:--|
|NAT|宛先IPアドレスをリアルサーバのアドレスに変換して転送|
|ダイレクトルーティング|宛先IPアドレスは変えずにMACアドレスのみをリアルサーバのアドレスに変換して転送|
|トンネリング|受け取ったパケットをリアルサーバ宛のIPヘッダでカプセル化して転送|
|ローカルノード|ロードバランサでリアルサーバの処理を兼用することが可能|

### LVSの接続スケジューリングアルゴリズム

|コマンド|説明|
|:--|:--|
|ラウンドロビン|rr
|重み付けラウンドロビン|wrr
|最少コネクション|lc
|重み付け最少コネクション|wls(デフォルト)
|ローカリティベースの最少コネクション|lblc
|宛先ハッシュ|dh
|送信元ハッシュ|sh
|最小遅延予測|sed
|キューなし|nq

### ipvsadm

LVSの管理ユーティ里程コマンド

ipvsadm <サブコマンド> [オプション]

|コマンド|説明|
|:--|:--|
|-A|仮想サーバの追加|
|-a|仮想サーバにリアルサーバを追加|
|-D|関連づいているすべてのリアルサーバと仮想サーバを削除|
|-d|仮想サーバからリアルサーバを削除|
|-E|仮想サーバの編集|
|-e|仮想サーバに関連づいているリアルサーバを編集|
|--start-daemon|接続同期デーモン開始|
|--stop-daemon|停止|

### keepalived

* リアルサーバの稼働状況を監視
* ロードバランサ自体の冗長化をサポート
* LVSとの併用で運用
* 設定ファイルは「/etc/keepalived/keepalived.conf」
* ロードバランサの設定はvirtual_serverで行う。

### VRRP

* ルータの冗長化をするための標準プロトコル
* パスワードによる認証と、IPSecAHによる認証をサポートしている

### ldirectord (Linux Director Daemon)

* LVSクラスタにおいてHeartbeatと連携して動作する負荷分散システムの監視/管理するツール
* LVSの複雑な構成における設定/管理が可能
* 設定ファイルは「/etc/ha.d/ldirectord.cf」

|コマンド|説明|
|:--|:--|
|autoreload|設定ファイルが変更された場合の自動読み込み|
|checkinterval|リアルサーバへの接続テストの間隔|
|checktimeout|異常と判断するまでの待ち時間。デフォ5秒|
|checktype|リアルサービスの死活監視のチェック方法|
|fallback|リアルサーバが停止した場合のリクエスト転送先|
|logfile|ログファイルの保存先|
|quiescent|
|real|リアルサーバとサービスの指定|

### HAProxy

* レイヤ7をサポート
* 設定ファイルは「/etc/haproxy/haproxy.cfg」

# フェイルオーバクラスタ

#### Pacemaker

* クラスタエンジン : HeartBeat3, Corosync
* リソースマネージャ : PaceMaker,  OpenAIS

主要コンポーネント

|コマンド|説明|
|:--|:--|
|CIB|Cluster Information Base cib.xmlに設定は保存|
|CRMｄ|クラスタにおけるリソース管理の中心となるデーモン|
|PEngine|Policy Engineの略でありCIBの情報に基づいてクラスタの最適な状態を算出する|
|LRMd|ローカルノードのリソース管理デーモン|
|STONITHd|スプリットブレインを防ぐフェンシングデーモン|

管理ユーティリティ

|コマンド|説明|
|:--|:--|
|crm_attribute|ノードの属性とクラスタのオプションを管理|
|crm_mon|クラスタの現在の動作状態をモニタリング|
|crm_node|クラスタのノード情報を一覧表示|
|crm_resource|クラスタリソースに関するタスクを実行|
|crm_shadow|設定変更を実際のクラスタで実行する前にサンドボックスで実行|
|crm_simulate|イベントに対するクラスタの応答をシミュレート|
|crm_standy|crm_attributeのラッパー|
|crm_verify|設定の構文チェック|

# エンタープライズLinux

#### RHELの高可用性アドオン

* RHELがHigh Availability Add-Onというソフトウェアコンポーネントのセットを提供
* CMAN,DLM,フェンシング機能
* RGManager
* Conga,Luci,Ricci

#### SUSE Linux

* PaceMaker,Corosync,OpenAIS,Geo Clustering,HAProxy
* OCFS2,GFS2,cLVM2
* DRBR,Relax-and-Recover
* 統合コマンドラインインターフェース,Hawk

# DRBD及びcLVM

＜主要な知識範囲＞
・DRBD のリソース、状態、レプリケーションモードの理解
・DRBD のリソース、ネットワーク、ディスク、デバイスの理解
・DRBDの自動復旧とエラー処理。
・drbdadmを使用したDRBDの管理
・drbdsetup と drbdmetaの基本知識
・DRBD と Pacemakerの統合
・cLVM
・cLVM とPacemakerの統合

＜重要なファイル、用語、ユーティリティ＞
・プロトコル A, B および C
・プライマリ、セカンダリ
・3ノードレプリケーション
・drbd カーネルモジュール
・drbdadm
・drbdsetup
・drbdmeta
・/etc/drbd.conf
・/proc/drbd
・LVM2
・clvmd
・vgchange, vgs

Protocol A. 非同期レプリケーションプロトコル。
Protocol B. メモリ同期(半非同期)
Protocol C. 同期レプリケーションプロトコル。

# クラスタファイルシステム