Linux
CentOS

Linuxセットアップ時に整理したKVM/libvirtなどの基本用語

More than 1 year has passed since last update.


Glossary of Terms

自分用メモ。


KVM


KVM = Kernel-based Virtual Machine


KVMは、Kernel-based Virtual Machineと呼ばれる、Linux自体をハイパーバイザ(hyporvisor: 仮想化モニタ、仮想化OS)とする仮想マシンソフトウェア。

元々Qumranet(2008年にRed Hat社に買収されたスタートアップ)が2006年に開発を始めたOSSが、2007年にLinux Kernel自体にモジュールとして実装されたもの。ちなみに、RHEV(Red Hat Enterprise Virtualization)やRHEL6(Red Had Enterprise Linux 6)はQumranet買収後にRed Hatからリリースされた製品。

Linux KVMは以下のソフトウェア群から構成されている。

以下の2つを合わせて、コンピュータの三大構成要素である「CPU, I/O, メモリ」が構成されるイメージ。


  • Linux KVM Kernel Module


    • CPU的役割

    • 仮想マシンの作成

    • 仮想マシンへのメモリ割り当て、実行



  • qemu-kvm


    • I/O + システムメモリ的役割

    • 仮想マシン上で使われる一通りのI/O デバイスエミュレータ

    • 仮想マシンが必要とする容量のメモリ確保




QEMU


QEMU = Quick Emulator


QEMUはLinux KVMが開発される前からOSで開発されている仮想マシンソフトウェア。

QEMU由来の仮想マシンソフトウェアには、XenやVirtualBoxなどがある。

原則としてCPUをソフトウェアレイヤーで実現した仮想マシンソフトウェアなのだが、CPUの処理を全てソフトウェアレイヤーで再現すると性能が劇的に低下する(理由:実際のCPU上では1つの命令として実行できるが、ソフトウェアレイヤーで同じことを実現しようとすると何十もの命令が必要となるため)。


libvirt


libvirt = library + virtualization


仮想マシンの制御を抽象化した、Red Hatを中心としたOSSで開発されているライブラリ。XenやKVMからQEMU, VirtualBox, VMwareなど多くの仮想化をサポートしている。

libvirt APIは、VMそのものの管理だけでなく、VMに提供するリソース(仮想ネットワークやストレージ)の管理もできる機能を公開している。


libvirtd


libvirtd = libvird + daemon


libvirtdは、libvirt APIを介してVMを制御するシステムデーモン。


virsh


virsh = virtualization + shell


libvirt APIを利用する、VMの管理操作用のCUI(シェル)。

基本的に、virt-managerでできることはvirshでもできる上、GUIツールではできないことも含めてvirshでは操作できる。

基本的な起動/停止/再起動の他、仮想CPUやメモリー数の変更、NICの設定ができる。

以下は、インストール作業で使う可能性のあるコマンド一覧。

# show help

$ virsh help

# list all guest OS including shutting off
$ virsh list --all
Id Name State
----------------------------------------------------
- kvm_centos7 shut off

# start up a guest OS
$ virsh start kvm_centos7

# shut down a guest OS
$ virsh shutdown kvm_centos7

# suspend a guest OS
$ virsh suspend kvm_centos7

# reboot a guest OS
$ virsh reboot kvm_centos7

# connect to a guest OS
$ virsh console kvm_centos7

# autostart on
$ virsh autostart kvm_centos7
$ ls /etc/libvirt/qemu/autostart/
kvm_centos7 # successfully registered as an autostart guest OS

# autostart off
$ virsh autostart --disable kvm_centos7

参考


virt-manager

libvirt APIを利用する、VMの管理操作用のGUI。


virtio


virtio = virtualization + io


virtioは、ネットワークやディスクといったデバイスの仮想化を実現する、libvirtのモジュールの一つ。準仮想化ハイパーバイザー内のデバイスを抽象化するレイヤー。

ハイパーバイザー側でネットワークやディスクといったデバイス・ハードウェアをエミュレートしなければいけない完全仮想化方式より、guest OSとハイパーバイザ間で実在のハードウェアの振る舞いをエミュレートするインターフェースを提供する準仮想化の方が、両者間で共有できるバッファが増えるため、より効率的に機能する。

参考


qcow


qcow = QEMU Copy On Write


qcowは、QEMUで利用されるディスクイメージの形式の一つ。指定された通りのファイルサイズではなく、実際に使用している領域分のみ確保して使う点が特長。これによって、ディスク容量を最小限に抑えることができる。

qcow2はqcowの進化版。qcowと異なる、複数のスナップショットを柔軟に扱う仕組みなどに優れている。

以下は、基本的なraw→qcow2への形式変更手順。guest OSを停止した状態で作業すること。変更後は、qcow2で正しく起動することを確認してから、.imgを削除すること。

# change directory

$ cd /var/lib/libvirt/images

# convert
$ qemu-img convert -c -O qcow2 bdig-hdbdev.img bdig-hdbdev.qcow2

# check images
$ qemu-img info ldap01rcg.img
$ qemu-img info ldap01rcg.qcow2

# edit the guest OS config to use the qcow2 image instead of the raw image
$ virsh edit ldap01rcg
<driver name='qemu' type='raw' cache='none'/>
<source file='/var/lib/libvirt/images/ldap01rcg.img'/>
   ↓
<driver name='qemu' type='qcow2' cache='writethrough'/>
<source file='/var/lib/libvirt/images/ldap01rcg.qcow2'/>


COW


COW = Copy-On-Write


COWとは、コンピュータプログラミングにおける最適化戦略の一種。

複製を要求された時、実際にリソースが書き換えられるなどして更新されるまではオリジナルを参照させるようにする(つまり、Write処理が命令された時に初めてCopyするといこと)


inittab

Linuxの動作モードには、0~6の7種類のランレベルがある。

level
description

0
シャットダウン(システムの停止)

1
シングルユーザーモード(rootのみ)

2
ネットワークなしのマルチユーザーモード

3
通常のマルチユーザーモード(テキストログイン)

4
未使用

5
グラフィカルログインによるマルチユーザーモード

6
システムの再起動

必要のない場合、メモリ,CPU節約のためにCUI起動に変更することが推奨される。

$ vi /etc/inittab

id:3:initdefault:


SNMP


SNMP = Simple Network Management Protocol


TCP/IPネットワークのプロトコルの一つ。ルータやコンピュータ、端末などの機器をネットワーク経由で監視・制御するためのプロトコル。

目的としては、ネットワークに障害が発生した場合に、どの機器に障害が発生したのかなどを監視するために設定される。

管理側のSNMPマネージャ、監視・制御下のSNMPエージェントをそれぞれ設定し、両者間で通信を行い監視・制御の運用を行う。

SNMPエージェントがUDP(ポート番号161)を使用して、SNMPマネージャがUDP(ポート番号162)を

使用する。基本的な通信方法は、SNMPマネージャがSNMPパケットをSNMPエージェントに送信し、パケット破棄などを監視する。

SNMP v1で定義された最初の5つのPDU(Protocol Data Unit)を含め、以下の様なPDUが定義されている。以下のPDUにもとづいてエージェント/マネージャ間でやり取りが行われる。


  • GET REQUEST: 一部の管理情報を取得するときに使用する

  • GETNEXT REQUEST: 連続する管理情報を取得するときに使用する

  • GET RESPONSE

  • SET REQUEST: 管理するサブシステムに対して変更を加えるときに使用する

  • TRAP (トラップ): 管理するサブシステムに関する警告や非同期イベントの通知に使用する

  • GETBULK REQUEST: 高速に複数の管理情報を取得するときに使用する

  • INFORM: マネージャからマネージャへの通信するときに使用する


MIB


MIB = Management Information Base


SNMPでは、MIB(Management Information Base)と呼ばれる木構造のデータモデルで定義されている。RFC 1156として規定されているMIB1と、RFC 1213で規定されているMIB2があり、現在では後者を使うのが一般的。


net-snmp

SNMPエージェント側にインストールするOSS。

# install via yum

$ yum install --net-snmp

# show config
$ cat /etc/snmp/snmp.conf