CentOS 7の仮想化、Docker、リソース管理(前編)

2015年1月22日(木)
古賀 政純

今回は、CentOS 7の仮想化に加え、最近巷で話題のLinuxコンテナであるDocker、そして、仮想化によるサーバー集約時に必要とされる資源管理について紹介します。

CentOS 7におけるKVM

CentOS 7において、仮想化機能のKVMがサポートされています。従来のCentOS 6系に比べ、NUMAアーキテクチャのCPUに対するプロセスの割り当ての自動化機能や仮想CPUのホットアド機能、ライブマイグレーションの高速化など様々な機能拡張が施されています。CentOS 7のKVMの機能拡張については、アップストリームOSにあたるRHEL 7のリリースノートの第9章が参考になります。

RHEL 7のリリースノート

https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/pdf/7.0_Release_Notes/Red_Hat_Enterprise_Linux-7-7.0_Release_Notes-ja-JP.pdf

以下では、CentOS 7に搭載されているKVMの基本的な管理・運用手法を説明します。

CentOS 7における仮想マシンの管理

CentOS 7では、CentOS 6系と同様に、仮想マシン管理ツールの「virt-manager」を使う事が可能です。virt-managerは、X11のデスクトップ上で稼働し、仮想マシンの作成、起動、停止、サスペンドなどをGUIで簡単に操作できます。また、遠隔にあるCentOS 6やCentOS 7のホストマシンの上で稼働するゲストOSをリモート管理することも可能です。KVMを利用するには、必要なパッケージをあらかじめインストールしておく必要があります。 yumコマンドでKVMに関連するパッケージをインストールします。

# yum install -y qemu-kvm libvirt virt-manager virt-install

仮想マシンを管理するには、仮想マシンを作成・稼働させるホストマシン上で事前にlibvirtdが稼働していることが前提です。もし、ホストマシン上で、libvirtdが稼働していない場合は、libvirtdを起動します。CentOS 7の場合は、systemctlコマンドを使用します。

# systemctl start libvirtd

ホストマシン上でlibvirtdが稼働したら、virt-managerを起動します。

# virt-manager
CentOS 7が提供するvirt-managerのGUI画面。ローカルのホストマシン「localhost」上の仮想マシンだけでなく、遠隔のホストマシン(IPアドレスは172.16.1.5)上の仮想マシンも管理が可能である

図1:CentOS 7が提供するvirt-managerのGUI画面。ローカルのホストマシン「localhost」上の仮想マシンだけでなく、遠隔のホストマシン(IPアドレスは172.16.1.5)上の仮想マシンも管理が可能である

以下は、CentOS 7のvirt-managerがサポートする仮想マシンのインストール方法です。

  • ローカルに保管したOSのインストールメディアのISOイメージやCD/DVD-ROMドライブ
  • ネットワークインストール(プロトコルは、HTTP、FTP、NFS)
  • PXEブート
  • 既存のディスクイメージのインポート

ホストOSやファイルサーバーに保管したインストールメディアのISOイメージを使ってインストールすることが一般的です。HTTPやFTP、NFSを使ったインストールもサポートされていますので、従来の物理基盤でのCentOSのインストールと同様にOSを仮想マシンにインストールすることが可能です。

virt-managerのインストール方法は4種類用意されている

図2:virt-managerのインストール方法は4種類用意されている

対応している仮想マシンのOSの種類は様々なものが存在しますが、仮想マシンにCentOS 7をインストールしたい場合は、virt-managerのOS選択画面で、OSの種類に「Linux」を選択し、バージョンに「Red Hat Enterprise Linux 7」を選択します。

仮想マシンにCentOS 7をインストールしたい場合は、「Red Hat Enterprise Linux 7」を選択すればよい。OSの種類としては、Linux以外にもWindowsやFreeBSD、Solarisなどにも対応している

図3:仮想マシンにCentOS 7をインストールしたい場合は、「Red Hat Enterprise Linux 7」を選択すればよい。OSの種類としては、Linux以外にもWindowsやFreeBSD、Solarisなどにも対応している

virt-installとKickstartを使った仮想マシンの自動インストール

virt-managerを使えば、GUIで簡単に仮想マシンの作成が可能ですが、大量の仮想マシンの作成を自動化しなければならないホスティングシステムや、独自の内製ツールから仮想マシンを作成するようなクラウド環境の場合は、virt-managerではなく、virt-installが有用です。virt-installは、コマンドラインで仮想マシンの作成が可能ですので、バッチスクリプトへの埋め込み等、仮想マシンの作成を自動化できます。以下では、virt-installを使った仮想マシンの作成とCentOS 7の自動インストールの手順を紹介します。まず、仮想マシン上にCentOS 7をインストールするKickstartファイルks.cfgを作成します。KVMの仮想マシンのストレージデバイス名は、/dev/vdXになりますので、Kickstartファイル内で/dev/vdXを指定します。

# vi /root/ks.cfg
cmdline
install
auth --enableshadow --passalgo=sha512
text ←テキストモードでインストール
firstboot --enable
ignoredisk --only-use=vda ←仮想ディスクとしてvdaを指定
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8
network  --bootproto=static --device=eth0 --gateway=172.16.1.1 --ip=172.16.70.1 --nameserver=172.16.1.1 --netmask=255.255.0.0 --ipv6=auto --activate ←ゲストOSのeth0を固定IPで設定。
network  --hostname=centos70vm01.jpn.linux.hp.com ←ゲストOSのホスト名を設定
rootpw password ←rootアカウントのパスワードを設定
skipx
timezone Asia/Tokyo --isUtc
user --name=koga --password=koga ←追加したい一般ユーザーのアカウント名とパスワードを記述
xconfig  --startxonboot
zerombr ←マスターブートレコードの初期化
bootloader --location=mbr --boot-drive=vda ←ブートローダのインストール先を/dev/vdaのMBR領域に設定
clearpart --all --initlabel --drives=vda ← /dev/vdaのラベルと全てのパーティションを初期化
part /boot --fstype=xfs --size=500 --asprimary ←/bootパーティションを500MBで確保し、ファイルシステムとしてXFSを指定
part swap --size=1024 ←スワップ領域のサイズを1024MBで確保
part / --fstype=xfs --size=1 --grow --asprimary ←ルートパーティションにディスクの残りの容量全てを確保し、ファイルシステムとしてXFSを指定
selinux --disabled  ←SELinuxを無効に設定
firewall --disabled ←ファイアウォールを無効に設定
reboot ←OSのインストールが完了したら再起動を行う
%packages
@base
@core
%end

次に、仮想マシンの生成スクリプト「virt-install-centos7.sh」を作成します。ここでは、事前にホストマシンの/var/www/html/centos70ディレクトリに保管したCentOS 7 のISO イメージを使います。

# ls /root/*.iso
CentOS-7.0-1406-x86_64-DVD.iso
 
# vi virt-install-centos7.sh
#!/bin/sh
virt-install \
--connect qemu:///system \
--name centos70vm02 \
--hvm \
--virt-type kvm \
--os-type=linux \
--os-variant=rhel7 \
--ram 1024 \
--vcpu 1 \
--arch x86_64 \
--nographics \
--serial pty \
--console pty \
--noautoconsole \
--disk=/var/lib/libvirt/images/centos70vm02,format=qcow2,size=16 \
--boot=hd \
--network bridge=br0 \
--location=/var/www/html/centos70/CentOS-7.0-1406-x86_64-DVD.iso \
--initrd-inject /root/ks.cfg \ ←ks.cfgファイルをフルパスで指定
--keymap ja \
--extra-args='ks=file:/ks.cfg console=tty0 console=ttyS0,115200'

virt-install-centos7.shスクリプトとks.cfgファイルが用意できたら、virt-install-centos7.shを実行します。ks.cfgが正しく記述できていれば、スクリプトを実行したホストマシン上に仮想マシンが生成され、CentOS 7が自動インストールされます。

# sh ./virt-install-centos7.sh

コマンドラインによる仮想マシンの管理

CentOS 7のコマンドライン上から仮想マシンを管理することが可能です。仮想マシンの管理をコマンドラインで行うには、libvirt-clientパッケージに含まれているvirshコマンドを使用します。libvirt-clientパッケージがインストールされていない場合は、yumコマンドでインストールしてください。

# yum install libvirt-client

以下では、virshコマンドでよく利用される基本的な管理手順をいくつか紹介します。現在の仮想マシンの状態を確認するには、virshコマンドにlistコマンドを付与します。 --allオプションを指定すれば、登録済みの全仮想マシンの状態を表示します。

# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     centos70vm01                   シャットオフ
 -     centos70vm02                   シャットオフ

上記から、仮想マシンcentos70vm01とcentos70vm02がシャットオフされていることがわかります。登録されている仮想マシンを起動する場合は、virshコマンドにstartコマンドを指定します。

# virsh start centos70vm02
ドメイン centos70vm02 が起動されました

# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 5     centos70vm02                   実行中
 -     centos70vm01                   シャットオフ

仮想マシンのシャットダウンは、virshコマンドにshutdownコマンドを指定します。

# virsh shutdown centos70vm02
ドメイン centos70vm02 はシャットダウン中です

virt-cloneによる仮想マシンのクローニング

virt-installパッケージに含まれているvirt-cloneコマンドを利用すれば、既存の仮想マシンのイメージファイルを使って仮想マシンのクローンを生成することが可能です。以下は、既存の仮想マシン「centos70vm01」から「centos70vm03」という名前の仮想マシンを作成する例です。作成する仮想マシンのイメージファイル名は「centos70vm03.img」としました。

# virt-clone --original centos70vm01 --name centos70vm03  --file /var/lib/libvirt/images/centos70vm03.img
割り当て中 'centos70 11% [=-             ] 158 MB/s | 2.7 GB     02:18 ETA

'centos70vm03'のクローニングに成功しました。

# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     centos70vm01                   シャットオフ
 -     centos70vm02                   シャットオフ
 -     centos70vm03                   シャットオフ

virt-cloneでは仮想マシンの設定ファイルも自動生成します。/etc/libvirt/qemuディレクトリ以下に設定ファイルが生成されているかを確認して下さい。

# ls -l /etc/libvirt/qemu/*.xml
...
-rw-------. 1 root root 2900 11月  6 21:54 /etc/libvirt/qemu/centos70vm03.xml

生成された仮想マシン「centos70vm03」は、centos70vm01と全く同じイメージファイルですので、ホスト名やネットワークの設定ファイルに記述されているMACアドレスの指定、IPアドレスなどの変更が必要になりますので注意してください。

仮想マシンのコンソールへの接続と離脱方法

通常、仮想マシンを操作するには、ssh接続もありますが、IPアドレスが付与されていない場合は、コンソールへのアクセスが一般的です。virt-managerのGUIからコンソールを出力させることも可能ですが、X Windowが用意されていない端末からコンソール出力を行いたい場合があります。そのような場合は、virshコマンドにconsoleコマンドを付与し、コンソール接続を行いたい仮想マシン名を指定します。

# virsh console centos70vm02

virshコマンドで仮想マシンのコンソールにログインした状態から離脱し、ホストマシンのコマンドプロンプトに移行するには、仮想マシンのコンソール上で、キーボードからCTRL+]を入力します。

仮想マシンのスナップショットの作成と適用方法

virshコマンドには、様々な機能が備わっていますが、その中でも、多くのユーザーで重宝されているのがスナップショット機能です。仮想マシンのスナップショットを利用するメリットの一つは、過去のOS状態に戻すことができるという点です。スナップショットは、仮想マシンの「ある時点での状態」を非常に小さいファイルに記録し、その「状態」を記録したファイルを基に、過去のOSの状態に戻すことができます。例えば、LAMPを構築する場合、Linux、Apache、MySQL、PHPの4つのコンポーネントの設定を行いますが、途中で重大な設定ミスを犯してしまった場合でも、定期的にスナップショットを取得しておけば、そのスナップショットを基に、コンポーネントの設定ミスを犯す前の過去の状態に戻すことができます。以下では、CentOS 7におけるKVM仮想マシンのスナップショットの取得と適用方法の手順を述べます。まず、仮想マシンの名前をvirshコマンドで確認します。

# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 5     centos70vm02                   実行中
 -     centos70vm01                   シャットオフ

今回は、centos70vm02のスナップショットを作成します。スナップショット名は、「centos70vm02-snapshot-2014-09-19-001」にします。

# virsh snapshot-create-as centos70vm02 centos70vm02-snapshot-2014-09-19-001
ドメインのスナップショット centos70vm02-snapshot-2014-09-19-001 が作成されました

作成したスナップショットをリストアップします。virshコマンドに「snapshot-list」コマンドに続け仮想マシンの名前を付与すると、作成したスナップショットの名前と作成時間、現在の状態が表示されます。

# virsh snapshot-list centos70vm02
 名前               作成時間              状態
------------------------------------------------------------
 centos70vm02-snapshot-2014-09-19-001 2014-09-19 14:28:54 +0900 running

取得したスナップショットを適用して、過去の状態に戻すことができるかテストしてみます。仮想マシンcentos70vm02にログインし、/root/に適当な名前のファイルを生成します。1つ目のスナップショットと2つ目のスナップショットを適用した環境に戻るかどうかをテストする際に、それらの区別がつくように、仮想マシン上で何らかの作業を行って下さい。その後、2つ目のスナップショットを作成します。

# virsh snapshot-create-as centos70vm02 centos70vm02-snapshot-2014-09-19-002
ドメインのスナップショット centos70vm02-snapshot-2014-09-19-002 が作成されました

再び、スナップショットをリストアップします。スナップショット「centos70vm02-snapshot-2014-09-19-001」と「centos70vm02-snapshot-2014-09-19-002」の2つが作成されていることがわかります。

# virsh snapshot-list centos70vm02
 名前               作成時間              状態
------------------------------------------------------------
 centos70vm02-snapshot-2014-09-19-001 2014-09-19 14:28:54 +0900 running
 centos70vm02-snapshot-2014-09-19-002 2014-09-19 14:32:03 +0900 running

スナップショットに関する情報の表示は、virshコマンドに「snapshot-info」コマンドを付与し、仮想マシン名とスナップショット名を指定します。

# virsh snapshot-info centos70vm02 centos70vm02-snapshot-2014-09-19-001
名前:         centos70vm02-snapshot-2014-09-19-001
ドメイン:   centos70vm02
カレント:   いいえ (no)
状態:         running
場所:         内部
親:            -
子:            1
子孫:         1
メタデータ: はい (yes)

# virsh snapshot-info centos70vm02 centos70vm02-snapshot-2014-09-19-002
名前:         centos70vm02-snapshot-2014-09-19-002
ドメイン:   centos70vm02
カレント:   はい (yes)
状態:         running
場所:         内部
親:            centos70vm02-snapshot-2014-09-19-001
子:            0
子孫:         0
メタデータ: はい (yes)

作成したスナップショットを適用し、仮想マシンを過去の状態に戻してみます。まずは、スナップショット「centos70vm02-snapshot-2014-09-19-001」を適用し、スナップショットを作成した時点のOSの状態に復元します。スナップショットの適用は、virshコマンドに「snapshot-revert」コマンドを付与し、仮想マシン名と適用したいスナップショット名を指定します。

# virsh snapshot-revert centos70vm02 centos70vm02-snapshot-2014-09-19-001

仮想マシン「centos70vm02」にログインし、状態が復元されているかを確認します。アプリケーションのインストールやアップグレード、システムの設定変更前にスナップショットを作成しておくと、アプリケーションや設定でトラブルが発生しても、スナップショットから元の状態に復元できますので、非常に便利です。

操作しているOS環境が物理マシンなのか仮想マシンなのかを判断する

仮想化環境において、管理者は、物理サーバー上で直接稼働しているOS環境と仮想マシンを区別して管理する必要があります。ユーザーが利用する環境が物理マシンの場合と仮想マシンの場合の両方が考えられる場合、物理マシンと仮想マシンが混在するため、どのような仮想化基盤で稼働しているかを事前にチェックしてから、アプリケーションや管理ツールの実行を行うといった運用も見られます。現在自分が操作しているOS環境が、物理マシンで直接稼働しているものなのか、仮想マシンなのかを判断するには、その操作しているマシン上で、virt-whatコマンドを実行します。virt-whatコマンドはvirt-whatパッケージに含まれています。

KVM仮想マシン上での実行の様子

# virt-what
kvm

物理マシン上での実行の様子

# virt-what

もし操作しているマシン上で、virt-whatコマンドの出力結果が「kvm」と表示される場合は、そのマシンは仮想マシンであることを意味します。何も出力されない場合は、物理マシンで稼働していることを意味します。virt-whatコマンド以外にも、systemd-detect-virtコマンドを使うことでも同様の確認が可能です。

KVM仮想マシン上での実行の様子

# systemd-detect-virt
kvm

物理マシン上での実行の様子

# systemd-detect-virt
none

KVM仮想化環境におけるブリッジインタフェースの作成

CentOS 7において、KVMの仮想マシンを作成する事前準備にネットワークの設定があります。KVMの仮想化環境で、よく利用されるネットワーク設定は、仮想マシンとホストマシンが同一ネットワークに所属するようにホストマシンにブリッジインタフェースを設ける構成と、NATを使って仮想マシンにプライベートIPアドレスを割り振る構成です。CentOS 7において、ホストマシンにブリッジインタフェースを作成するには、nmtuiを使用します。nmcliコマンドによる設定でも構いませんが、初心者は、nmtuiで設定するのがよいでしょう。

ネットワークの設定を行うGUIツールnmtuiでブリッジインタフェースbr0を設定している様子

図4:ネットワークの設定を行うGUIツールnmtuiでブリッジインタフェースbr0を設定している様子

【参考情報】 virt-manager vs. 商用の仮想化基盤管理ツール

Red Hat社が提供している仮想化ソフトウェアRed Hat Enterprise Virtualization(通称RHEV)では、RHEL7が搭載するKVM仮想化の機能に加え、以下のような企業向けの基盤に必要な機能を搭載しています。

  • 仮想ディスクのホットプラグ対応
  • ライブスナップショットの対応
  • スナップショットのクローン機能
  • VDSMを介在しないダイレクトLUNの対応
  • クォータ機能
  • ストレージマイグレーション
  • ライブスナップショットの統合
  • OpenvSwitchに代表されるソフトウェア定義ネットワークへの対応

上記のようなエンタープライズレベルの仮想化の機能を利用し、ベンダーの保守サポートが必要とされる場合は、CentOSが提供するKVMではなく、RHEVの採用を検討すべきです。CentOS 7での仮想化機能は、主にKVMのvirt-manager及びvirshによる比較的簡単な操作に限定されます。エンタープライズレベルの高度な要求に対応する仮想化統合基盤の実現を目的とする場合、virt-managerやvirshのみの環境では、多くの作り込みが発生してしまいます。仮想マシンだけを遠隔から管理する簡素で小規模なシステムの場合は、CentOS 7やRHEL 7のvirt-managerやvirshで事足りるかもしれませんが、サーバーの物理コンポーネントと仮想マシンの一元管理や変更管理等を考慮にいれた高度な仮想化基盤においては、ハードウェアベンダーの管理ツールとRHEVの統合を検討する必要があります。具体的には、KVMによる仮想マシン管理と、仮想化基盤でよく利用されているブレードサーバーやNICのポートの分割、帯域設定、FCストレージ、バーチャルコネクト等の仮想化を意識したハードウェアコンポーネントの設定の自動化や運用管理を高度に統合することが求められます。ハードウェアベンダーの管理ツールとRHEVを統合させたものとしては、HP OneView for RHEVなどが存在しますが、CentOS 7において、このような物理基盤と仮想環境の高度な統合管理ツールは、現時点で存在しません。サーバー、ストレージ、ネットワークの各種コンポーネントと仮想マシンの設定変更や運用管理に関する仮想化基盤全体の要件を定義し、仮想化による統合管理でどのように効率化するのかを十分検討するようにして下さい。

CentOS 7に標準添付されているvirt-managerとRed Hat社が提供する商用のRHEVマネージャの棲み分け。virt-managerは小規模な仮想化基盤での利用が想定される。一方、RHEVは、ハードウェアベンダーが提供する管理ツールを組み合わせることが可能であり、物理基盤と仮想化基盤の高度な統合管理を実現する

図5:CentOS 7に標準添付されているvirt-managerとRed Hat社が提供する商用のRHEVマネージャの棲み分け。virt-managerは小規模な仮想化基盤での利用が想定される。一方、RHEVは、ハードウェアベンダーが提供する管理ツールを組み合わせることが可能であり、物理基盤と仮想化基盤の高度な統合管理を実現する

(後編に続く)

この連載が書籍になりました!
CentOS 7実践ガイド

古賀 政純 著
価格:3,000円+税
発売日:2015年2月25日発売
ISBN:978-4-8443-3753-9
発行:インプレスジャパン

CentOS 7実践ガイド

本書は、CentOS 7を取り巻く市場動向、CentOS 7が利用されるサーバーシステムの選定、CentOS 7の基礎、システム設計、OS管理やCentOS 7に対応したアプリケーションサーバーの構築手順などの勘所をご紹介します。連載では書ききれなかった本の内容、見どころが満載!

  • セキュリティ管理
  • チューニング
  • 自動インストール
  • Hadoop構築
  • GlusterFS
  • Ceph

Amazon詳細ページへImpress詳細ページへ

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています