#ljstudy kvm勉強会

27
Linux女子部 KVM勉強会! 1 ver1.0 中井悦司 Twitter @enakai00 オープンクラウド・キャンパス Linux女子部 KVM勉強会!

Upload: etsuji-nakai

Post on 28-May-2015

5.405 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: #ljstudy KVM勉強会

Linux女子部 KVM勉強会!

1

ver1.0 中井悦司Twitter @enakai00

オープンクラウド・キャンパス

Linux女子部 KVM勉強会!

Page 2: #ljstudy KVM勉強会

Open Cloud Campus2

Linux女子部 KVM勉強会!

自己紹介

中井悦司(なかいえつじ)– Twitter @enakai00

日々の仕事– Senior Solution Architect and

Cloud Evangelist at Red Hat K.K.企業システムでオープンソースの活用を希望されるお客様を全力でご支援させていただきます。

昔とった杵柄– 素粒子論の研究(超弦理論とか)– 予備校講師(物理担当)– インフラエンジニア(Unix/Linux専門)

好評発売中

Page 3: #ljstudy KVM勉強会

Open Cloud Campus3

Linux女子部 KVM勉強会!

Contents

Linux KVMの基礎知識 仮想化ハイパーバイザの分類とLinux KVMの特徴 Linuxの仮想ネットワーク機能 iptablesによるパケットフィルタリング

Page 4: #ljstudy KVM勉強会

Linux女子部 KVM勉強会!

4

Linux KVMの基礎知識

Page 5: #ljstudy KVM勉強会

Open Cloud Campus5

Linux女子部 KVM勉強会!

参考書

KVM全般の勉強に 仮想ネットワークとiptablesの勉強に

Page 6: #ljstudy KVM勉強会

Open Cloud Campus6

Linux女子部 KVM勉強会!

Linux KVMとは

Kernel-based Virtual Machine– イスラエルのQumranet (Avi Kivity)が2006年10月に開発をスタート。– 2ヶ月後にメインラインのカーネルにマージ– 2008年12月にRed HatがQumranetを買収– 2009年9月公開のRHEL5.4より正式サポート開始

KVMの特徴– Linuxカーネルにカーネル・モジュールとして仮想化機能を統合

• CPUスケジューリング、メモリ管理などは Linux カーネルの既存機能を拡張• 仮想デバイスのエミュレーションはQEMUを利用

– CPUの仮想化支援機構を利用した完全仮想化を採用• Intel VT/AMD-Vが必要• カーネル開発コミュニティとプロセッサメーカのエンジニアが協力して開発

仮想化, Linux, x86サーバ技術の一体的な進化を促進したことがKVMの功績!

Page 7: #ljstudy KVM勉強会

Open Cloud Campus7

Linux女子部 KVM勉強会!

35%

27%

9%

7%

KVMはLinux Kernelに継ぐコミュティ開発モデルの成功例

$ cd linux-2.6$ git log -p -M virt/kvm arch/x86/kvm | gitdm -d -u

(2011/12/27 の実行結果)

開発者の所属企業別のKVMソースコード変更行数割合

プロセッサメーカの開発者からのコントリビューション

Page 8: #ljstudy KVM勉強会

Linux女子部 KVM勉強会!

8

仮想化ハイパーバイザの分類とLinux KVMの特徴

Page 9: #ljstudy KVM勉強会

Open Cloud Campus9

Linux女子部 KVM勉強会!

物理マシン

基本的には「物理マシン」と同等の「仮想マシン」を複数作り出す技術です。

OS

物理マシン

非仮想化環境

ハイパーバイザ(ソフトウェア)

物理マシン

ソフトウェアによる仮想化(物理マシン上にハイパーバイザを導入)

仮想マシン

ゲストOS

仮想マシン

ゲストOS

仮想マシン

ゲストOS

仮想マシン

ゲストOS

ハイパーバイザ(ファームウェア)

ハードウェアによる仮想化(物理マシンにハイパーバイザを内蔵)

仮想マシン

ゲストOS

仮想マシン

ゲストOS

仮想マシン

ゲストOS

仮想マシン

ゲストOS

ソフトウェアによる仮想化(ホストOSにハイパーバイザ機能を追加)

ホストOS

物理マシン

仮想マシン

ゲストOS

仮想マシン

ゲストOS

仮想マシン

ゲストOS

ハイパーバイザ(カーネルモジュール)

Linux KVMXen

仮想化ハイパーバイザの分類

Page 10: #ljstudy KVM勉強会

Open Cloud Campus10

Linux女子部 KVM勉強会!

仮想化支援機能を持つCPUでは、仮想マシン(ゲストOS)を実行するための特権モードを提供することで、センシティブ命令の制御をHWレベルで行います。

一方、初期のハイパーバイザでは、仮想化支援機能を前提としないソフトウェア技術が必要でした。

– VMwareは「Dynamic Binary Translation」を採用しました。センシティブ命令をメモリ上で動的に書き換える技術です。

– Xenは「準仮想化 (Static Binary Translation)」を提唱しました。センシティブ命令を事前にハイパーバイザコールに書き換えた「準仮想化カーネル」を使用します。

– 現在のバージョンでは、どちらもCPUの仮想化支援機能を利用可能です。

1995 2000 2005 2010

(Virtual PC for Macintosh)

VMware ESX Xen KVM

ハイパーバイザによる仮想化

コンシューマーPC初の仮想化(?)

Intel-VT

準仮想化技術の提唱

HW レベルでの仮想化機能

Linuxカーネルに仮想化機能を統合

2007

2005

20032000

1996

x86サーバ仮想化技術の歴史

Page 11: #ljstudy KVM勉強会

Open Cloud Campus11

Linux女子部 KVM勉強会!

qemu-kvmプロセス

ホストLinuxカーネル

KVMでは、仮想マシンはホストLinux上の1プロセスとして実行されます。

物理CPU仮想ディスクイメージファイル

一般

のプ

ロセ

一般

のプ

ロセ

qem

uデバ

イス

エミ

ュレ

ータ

ゲストカーネル

KVMモジュール

ゲス

トの

ユー

ザプ

ロセ

ゲス

トの

ユー

ザプ

ロセ

– ゲストOSは、VMX non-rootモードで動作して、デバイスアクセスなどのセンシティブ命令が発行されると、KVMモジュールに処理が移行します。

– KVMモジュールの指示により、VMXrootモードで動作する、qemuデバイスエミュレータが物理デバイスにアクセスします。

VMX rootモード

VMX non-rootモード

KVMにおける特権モードの利用方法

Page 12: #ljstudy KVM勉強会

Open Cloud Campus12

Linux女子部 KVM勉強会!

非仮想化環境では、ユーザプロセスが認識する仮想アドレスと物理アドレスの変換はCPUに搭載のMMU(Memory Management Unit)がハードウェアレベルで処理します。

一方、仮想マシン環境では、2 段階のアドレス変換が必要です。– ユーザプロセスの仮想アドレス ⇒ ゲストOSの「仮想」物理アドレス(GPFN) ⇒ 物理アドレ

ス(MPFN)– EPT (Extended Page Tables) を利用すると、2段階のアドレス変換をハードウェアレベルで処理します。

• Xeon 5500番台(Nehalem)以降のCPUがEPTに対応しています。EPT未対応のCPUでは、シャドウページテーブルなどのソフトウェア処理が必要です。

PFN

プロセスA論理アドレス空間

プロセスB論理アドレス空間 MMUが変換

搭載物理メモリ

qemu-kvmプロセス

搭載物理メモリ

PFN

GPFN

ゲストOSのプロセスA論理アドレス空間

EPT対応のMMUが変換

非仮想化環境

Xen/KVM仮想化環境

EPTによるメモリアクセスの高速化

Page 13: #ljstudy KVM勉強会

Open Cloud Campus13

Linux女子部 KVM勉強会!

ホストLinuxホストLinux

virtioは、KVM仮想化環境に最適化されたディスク/NICのエミュレーション形式です。

– QEMUが用意したI/Oバッファ領域にvirtioドライバが直接アクセスするため仮想化のオーバヘッドが削減されます。

トラップ

QEMUプロセスゲストOSのメモリ空間

ゲストドライバのI/O処理をトラップして、QEMU経由でIOを実施

メモリマッピング

物理I/O

QEMUプロセスゲストOSのメモリ空間

物理I/Ovirtioドライバは、共有メモリ上のバッファを使用(ゲストOSとQEMU間のデータコピーが発生しない)

IOリクエストバッファ

virtioドライバを使用する場合一般のドライバを使用する場合

入出力データ

入出力データ

入出力データ

IOリクエストバッファ

入出力データ

メモリマッピング

virtioドライバによるI/Oの高速化

Page 14: #ljstudy KVM勉強会

Open Cloud Campus14

Linux女子部 KVM勉強会!

libvirtは、複数のハイパーバイザを統一的に操作するAPIライブラリです。– C言語、Pythonから使用するためのライブラリを標準で提供します。現在

は、Xen/KVM/LXC(Linuxコンテナ)などが対応しています。– ゲストOSの起動・停止などの操作以外に、仮想ネットワーク構成、ストレージ管理の

ためのAPIを提供します。–図は、Python用のライブラリを使用して、KVMのすべての仮想マシンをまとめて起動/停止するスクリプトの例です。

#!/usr/bin/python

import libvirt, timeConn = libvirt.open( "qemu:///system" )for name in Conn.listDefinedDomains(): vm = Conn.lookupByName( name ) print "Starting " + vm.name() vm.create() time.sleep( 1 )

#!/usr/bin/python

import libvirt, timeConn = libvirt.open( "qemu:///system" )for id in Conn.listDomainsID(): vm = Conn.lookupByID( id ) print "Stopping " + vm.name() vm.shutdown() time.sleep( 1 )

RHEL6では次のようなツールがlibvirtを利用しています。

– virsh(コマンドライン管理ツール)– virt-manager(GUI管理ツール)– virt-install(コマンドラインのゲストOSイン

ストールツール)

Euclyptus / OpenStackなどのクラウド基盤ソフトウェアが内部的にlibvirt経由で仮想化ハイパーバイザを操作する場合もあります。

すべての仮想マシンを起動するスクリプト

すべての仮想マシンを停止するスクリプト

仮想化APIライブラリ- libvirt

Page 15: #ljstudy KVM勉強会

Open Cloud Campus15

Linux女子部 KVM勉強会!

Virt-managerはRHEL6が標準で提供する仮想化環境の管理ツールです。次のような操作をGUIで行うことができます。

– 仮想マシンの構成、ゲストOSのインストール– 仮想マシンのコンソール表示、起動、停止– 仮想ネットワークの構成、仮想ディスク用ストレージの管理– など

ネットワーク経由で複数の仮想化ホストを管理することもできます。

virt-managerによる仮想化環境の管理

Page 16: #ljstudy KVM勉強会

Linux女子部 KVM勉強会!

16

Linuxの仮想ネットワーク機能

Page 17: #ljstudy KVM勉強会

Open Cloud Campus17

Linux女子部 KVM勉強会!

KVMのホストLinuxは「TAPデバイス」を経由して仮想マシンの仮想NICとパケットを交換します。TAPデバイスを「仮想ブリッジ」に接続することで、仮想マシン間のプライベートネットワークが構成されます。

– TAPデバイスは、ユーザプロセスと仮想的なネットワーク通信を行うLinuxの機能です。– 仮想ブリッジは、Linux上に仮想的なネットワークスイッチを構成する機能です。

ホストLinux

仮想ブリッジ

仮想NIC

vnet0

eth0

仮想マシン

TAPデバイス

仮想NIC

vnet1

eth0

仮想マシン

TAPデバイス

virbr0 / br0

eth0 ① ブリッジ接続

② NAT/マスカレード

外部ネットワーク

KVMの仮想ネットワーク

外部ネットワークに接続する方法は2種類あります。

–ホストLinuxの物理NICを仮想ブリッジに接続します。

– iptablesによるNAT/マスカレードで仮想ブリッジから外部ネットワークにパケット転送します。

Page 18: #ljstudy KVM勉強会

Open Cloud Campus18

Linux女子部 KVM勉強会!

複数の仮想ブリッジを使用することで、複数の仮想ネットワークが構成できます。仮想ネットワークの構成パターンには次のようなものがあります。

– 物理NICをブリッジ接続して外部ネットワークに同一サブネットとして接続– NAT/マスカレードを利用して、外部ネットワークとは独立したサブネットとして接続

• マスカレードを利用する場合、外部ネットワークから仮想ネットワークに向けた接続はできません。

• 外部ネットワークと相互通信する場合は、外部のIPアドレスと内部のIPアドレスをDNAT/SNATで1対1にひも付ける必要があります。

–外部ネットワークには接続しないホストマシン内部のプライベートネットワークを構成• 仮想ブリッジにIPアドレスを設定することで、ホストLinuxと仮想マシンの通信は可能になりま

す。

vnet0

eth0

仮想マシン

vnet1

eth0

仮想マシン

仮想ブリッジ

vnet0

eth0

仮想マシン

仮想ブリッジ

eth0

仮想マシンと外部ネットワークは同じサブネットに属する。

仮想マシンは外部とは通信しない

vnet0

eth0

仮想マシン

仮想ブリッジ

eth0

仮想マシンと外部ネットワークは異なるサブネットに属する。

パケット転送 仮想ブリッジにIPアドレスを設定するとホストLinuxと仮想マシンは通信可能

ホストLinux

ホストLinux

ホストLinux

仮想ネットワークの構成パターン

Page 19: #ljstudy KVM勉強会

Open Cloud Campus19

Linux女子部 KVM勉強会!

物理NICをブリッジ接続しないタイプの仮想ネットワークは、libvirt API (virsh/virt-managerなど)で構成することができます。

– 物理NICのブリッジ接続を行う場合は、手動で設定ファイルを構成します。– 仮想ブリッジには任意の名称を設定できます。通常は「br0」などを使用します。

libvirtで構成する仮想ネットワークは、簡易的なDHCP/DNS機能を提供します。– これらの機能は、ホストLinuxの「dnsmasqデーモン」が提供します。不要な場合は無効

化もできます。DNSサーバは、ホストLinuxの「/etc/hosts」の内容と「/etc/resolv.conf」で指定された外部DNSを参照します。

– libvirtで構成した仮想ブリッジの名称は「virbrX」になります。

vnet0

eth0

仮想マシン

vnet1

eth0

仮想マシン

eth0

パケット転送

ホストLinux

DHCPサーバDNSサーバ

仮想ブリッジ (virbr0)

dnsmasqによるDHCP/DNS機能の提供

Page 20: #ljstudy KVM勉強会

Open Cloud Campus20

Linux女子部 KVM勉強会!

仮想NIC

仮想マシン

仮想NIC

仮想マシン

ホストLinux

仮想ブリッジ

TAPデバイス

eth0

VLAN100 VLAN200

タグVLAN

vnet0

TAPデバイス

br100 br200

eth0.100 eth0.200

eth0 eth0

vnet1

VLANデバイスタ

グ無

しパ

ケッ

トタ

グ付

きパ

ケッ

(参考)Bonding / VLANデバイスの組み合わせ

vnet0 TAPデバイス

br0 仮想ブリッジ

bond0

ネットワーク・スイッチ

ホストLinux

bondingデバイス

eth1eth0

仮想NIC

仮想マシン

eth0

Page 21: #ljstudy KVM勉強会

Linux女子部 KVM勉強会!

21

iptablesによるパケットフィルタリング

Page 22: #ljstudy KVM勉強会

Open Cloud Campus22

Linux女子部 KVM勉強会!

iptablesの機能は、大きくは「パケットフィルタリング」と「NAT (Network Address Translation)」に分かれます。

– パケットフィルタリングは、Linux上にファイアウォール機能を提供するもので、IPパケットの送信、受信、転送のそれぞれについて、許可条件を設定します。

– NATは、Linuxサーバをルータとして使用する際に利用する機能で、パケットの転送時に、パケットに含まれる送信元、もしくは宛先IPアドレスを変換します。

• 正確には、DNAT(宛先アドレス変換)、SNAT(送信元アドレス変換)、マスカレード(SNATの特別版)の3種類があります。

インターネット

192.168.100.10

プライベートネットワーク192.168.100.0/24

192.168.100.1

グローバルIPアドレス

XX.XX.XX.XX

インターネットからの接続パケットをフィルタリング プライベートネットワークから

インターネットにマスカレード接続

ルータ用Linuxサーバ

192.168.100.11

外部からの接続パケットをフィルタリング

iptablesの利用例

iptablesの機能

Page 23: #ljstudy KVM勉強会

Open Cloud Campus23

Linux女子部 KVM勉強会!

iptablesの有効化/無効化は、iptablesサービスの起動・停止で行います。– # service iptables start : 設定ファイル「/etc/sysconfig/iptables」をアクティブ化し

ます。– # service iptables stop : アクティブな設定がすべて無効になります。

iptablesの設定は、設定ファイルを編集して再アクティブ化する方法と、iptablesコマンドでアクティブな設定を直接変更する方法があります。

– アクティブな設定を直接変更した場合は、別途、設定ファイルに内容を書き出しておかないと、再起動後に変更が失われます。

iptablesコマンドで設定

アクティブな設定

設定ファイルに書き出し# service iptables save

設定ファイルを再アクティブ化# service iptables restart

/etc/sysconfig/iptables

設定ファイルを編集iptablesの2種類の設定方法

iptablesの設定方法

Page 24: #ljstudy KVM勉強会

Open Cloud Campus24

Linux女子部 KVM勉強会!

Linuxサーバを通過するパケットは、いくつかの「チェーン」を通過します。– INPUTチェーン : 受信パケットが通過します。– OUTPUTチェーン : 送信パケットが通過します。– PREROUTING、FORWARD、POSTROUTINGチェーン : 転送パケットが通過します。

それぞれのチェーンでは、次のテーブルの設定に従ってパケットの処理が行われます。

– filterテーブル : パケットフィルタリングの処理を定義します。– natテーブル : NATの処理を定義します。

ネットワーク

アプリケーションプログラム

filterテーブルfilterテーブル

INPUTチェーンOUTPUTチェーン

ネットワーク#2

natテーブルnatテーブル

PREROUTINGチェーンPOSTROUTINGチェーン

ネットワーク#1

filterテーブル

FORWARDチェーンDNAT処理SNAT処理

受信パケット

INPUTチェーン

送信パケット

転送パケット

iptablesにおける処理の流れ

Page 25: #ljstudy KVM勉強会

Open Cloud Campus25

Linux女子部 KVM勉強会!

パケットフィルタリング設定の基本コマンドは次の通りです。– 指定条件にマッチするパケットに対するターゲットの定義

• iptables -A <チェーン> <パケット条件> -j <ターゲット>

– デフォルトターゲットの定義• iptables -P <チェーン> <ターゲット>

– -Aオプションで設定した順にパケット条件の評価が行われて、最初にマッチした条件に対するターゲットが実行されます。LOGアクション以外はそこで評価が終了します。

– どの条件にもマッチしなかった場合は、-Pオプションで指定した、デフォルトアクションが実行されます。

– 現在のアクティブな設定は次のコマンドで表示します。• iptables [-v][-n] -L <チェーン>• -vオプションは詳細情報を表示します。-nオプションはIPアドレスやTCP/UDPポート番号を数値で表示

します。(指定しない場合は名前解決を行います。)

# service iptables stop# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT# iptables -A INPUT -i lo -j ACCEPT# iptables -A INPUT -d 192.168.100.10 -p tcp -m tcp --dport 22 -j ACCEPT# iptables -A INPUT -j LOG -m limit --log-prefix "[INPUT Dropped] "# iptables -P INPUT DROP# service iptables save# service iptables start

192.168.100.10

外部からの接続パケットをフィルタリング

ターゲット 説明

ACCEPT パケットの送受信を許可

DROP パケットを破棄する

REJECT パケットの拒否をICMPで通知

LOG パケット情報をSyslogに出力

受信パケットに対するフィルタリング設定手順の例

パケットフィルタリングの設定例

Page 26: #ljstudy KVM勉強会

Open Cloud Campus26

Linux女子部 KVM勉強会!

QA

Page 27: #ljstudy KVM勉強会

Linux女子部 KVM勉強会!

27

中井悦司Twitter @enakai00

オープンクラウド・キャンパス

日経Linux「クラウド時代のサーバ構築・運用の基礎」もよろしくね!