このエントリーをはてなブックマークに追加

4.1.4. openvz

4.1.4.1. 概要

OpenVZはオープンブイジーと読みます。
Linuxカーネルはホストのものを利用し全てのインスタンスで共有するためWindowsなどは利用できません。
そのかわりコンテナ型のOpenVZはハイパーバイザー型のものと比べてオーバーヘッドがほぼありませんので高速です。
またKVMのネストなどは別にしてLXC同様仮想化上のサーバでも利用可能です。

4.1.4.2. OpenVZのインストール

4.1.4.2.1. OpenVZパッケージのインストール

# yum install wget -y
# wget http://download.openvz.org/openvz.repo -P /etc/yum.repos.d
# rpm --import  http://download.openvz.org/RPM-GPG-Key-OpenVZ
# yum install -y vzkernel.x86_64 vzctl

4.1.4.2.1.1. SELINUXの無効化

# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

4.1.4.2.1.2. カーネルの設定

# sed -i 's/kernel.sysrq = 0/kernel.sysrq = 1/g' /etc/sysctl.conf
# sed -i 's/net.ipv4.conf.default.accept_source_route = 0/net.ipv4.conf.default.accept_source_route = 1/g' /etc/sysctl.conf
# sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
# sed -i 's/net.ipv4.conf.default.rp_filter/net.ipv4.conf.all.rp_filter/g' /etc/sysctl.conf
# echo 'net.ipv6.conf.default.forwarding = 1' >> /etc/sysctl.conf
# echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf
# echo 'net.ipv4.conf.default.proxy_arp = 0' >> /etc/sysctl.conf
# echo 'net.ipv4.conf.default.send_redirects = 1' >> /etc/sysctl.conf
# echo 'net.ipv4.conf.all.send_redirects = 0' >> /etc/sysctl.conf

4.1.4.2.1.3. 再起動

# reboot

4.1.4.3. OpenVZWebパネルのインストール

# wget -O - http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh
インストールが終了すると、接続情報が出力されます。
ホスト名で出てきますが結局IPアドレスで接続することが殆どでしょう。
ユーザ名 admin パスワード admin でログインしてみましょう。
http://stack01:3000
Default credentials: admin/admin
スクリプトを利用して外部からホスト内のVPSへ接続出来るようにします。
SEGMENT="192.168.10.0/24"
THISHOST="192.168.10.60"
OKPORTS="22 53 80 443 3000"
スクリプト中の上記設定は適宜変更してください。
# cat << EOF >> /etc/init.d/firewall
#!/bin/sh
# firewall      Start iptables firewall
# chkconfig: 2345 97 87
# description:  Starts, stops and saves iptables firewall
# This script sets up the firewall for the INPUT chain (which is for
# the HN itself) and then processes the config files under
# /etc/firewall.d to set up additional rules in the FORWARD chain
# to allow access to containers' services.

. /etc/init.d/functions

# the IP block allocated to this server
SEGMENT="192.168.10.0/24"
# the IP used by the hosting server itself
THISHOST="192.168.10.60"
# services that should be allowed to the HN;
# services for containers are configured in /etc/firewall.d/*
OKPORTS="22 53 80 443 3000"
# hosts allowed full access through the firewall,
# to all containers and to this server
DMZS=`vzlist -H -o ip | tr '\012' ' '`

purge() {
  echo -n "Firewall: Purging and allowing all traffic"
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P INPUT ACCEPT
  iptables -F
  success ; echo
}

setup() {
  echo -n "Firewall: Setting default policies to DROP"
  iptables -P INPUT DROP
  iptables -P FORWARD DROP
  iptables -I INPUT   -j ACCEPT -m state --state ESTABLISHED,RELATED
  iptables -I FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
  iptables -I INPUT -j ACCEPT -i lo
  iptables -I FORWARD -j ACCEPT --source $SEGMENT
  success ; echo

  echo "Firewall: Allowing access to HN"
  for port in $OKPORTS ; do
    echo -n "          port $port"
    iptables -I INPUT -j ACCEPT -s $SEGMENT -d $THISHOST --protocol tcp --destination-port $port
    iptables -I INPUT -j ACCEPT -s $SEGMENT -d $THISHOST --protocol udp --destination-port $port
    success ; echo
  done
  for ip in $DMZS ; do
    echo -n "          DMZ $ip"
    iptables -I INPUT   -i eth0 -j ACCEPT -s $ip
    iptables -I FORWARD -i eth0 -j ACCEPT -s $ip
    success ; echo
  done

  CTSETUPS=`echo /etc/firewall.d/*`
  if [ "$CTSETUPS" != "/etc/firewall.d/*" ] ; then
  echo "Firewall: Setting up container firewalls"
  for i in $CTSETUPS ; do
    . $i
    echo -n "          $CTNAME CT$CTID"
    if [ -n "$BANNED" ]; then
      for source in $BANNED ;  do iptables -I FORWARD -j DROP --destination $CTIP --source $source ; done
    fi
    if [ -n "$OPENPORTS" ]; then
      for port in $OPENPORTS ; do iptables -I FORWARD -j ACCEPT --protocol tcp --destination $CTIP --destination-port $port ; done
      for port in $OPENPORTS ; do iptables -I FORWARD -j ACCEPT --protocol udp --destination $CTIP --destination-port $port ; done
    fi
    if [ -n "$DMZS" ]; then
      for source in $DMZS ; do iptables -I FORWARD -j ACCEPT --protocol tcp --destination $CTIP --source $source ; done
      for source in $DMZS ; do iptables -I FORWARD -j ACCEPT --protocol udp --destination $CTIP --source $source ; done
    fi
    [ $? -eq 0 ] && success || failure
    echo
  done
  fi
}

case "$1" in
  start)
    echo "Starting firewall..."
    purge
    setup
    ;;
  stop)
    echo "Stopping firewall..."
    purge
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  status)
    iptables -n -L
    ;;
  *)
    echo "Usage: $0 <start|stop|restart|status>"
    ;;
esac

作成したスクリプトを起動

# chmod 755 /etc/init.d/firewall
# chkconfig iptables off
# chkconfig firewall on
# service firewall start

4.1.4.4. OpenVZの管理

WebUIのほうは利用方法を知らなくても直感的に利用可能なくらい洗練されています。
但し、WebUIはデータベースで管理されているのでCUIでテンプレートを増やしたとしても反映されません。
WebUIで利用するテンプレートはWebUIで追加しましょう。
しかしCUIによる管理も可能ですし必要になることも多いはずです。

4.1.4.4.1. OpenVZのコマンド

CTIDには vzlist -a で表示されるIDを利用してください。

コマンド 概要
vzlist コンテナ一覧の表示 停止中のものも表示するにはオプション-aを利用
vzcalc -v CTID コンテナが利用しているメモリ利用量を表示
vzctl enter CTID コンテナへのログイン
vzctl start CTID コンテナの起動
vzctl stop CTID コンテナの停止
vzctl restart CTID コンテナの再起動
vzctl create CTID –ostemplate TEMPLATE(/vz/template/cache/にあるものを選択) コンテナ作成
vzctl set CTID –ipadd IP –save コンテナへのIPアドレス割り当て
vzctl set CTID –nameserver IP –save コンテナへのDNS設定
vzctl set CTID –hostname NAME –save コンテナのホスト名を設定
vzctl set CTID –onboot yes/no –save コンテナのホストOS起動時の起動設定
vzctl set CTID –vmguarpages 256M –save コンテナのメモリの最低保証サイズを設定
vzctl set CTID –privvmpages 1G –save コンテナの最大メモリ容量を設定
vzctl set CTID –diskspace 4G:6G –save
コンテナのディスククォータを設定

(4Gをソフトリミット、6Gをハードリミット)

vzctl set CTID –cpuunits 12000 –cpulimit 30 –save
コンテナのCPU利用率を設定

(100%の数字はvzcpucheckで確認) (最低利用率を10%、最大30%と設定)

vzctl set CTID –shmpages 512M コンテナの共有メモリとtmpfsへの上限
vzctl set CTID –numproc 192 コンテナのプロセス数上限
vzctl set CTID –numfile 3072 コンテナのファイルオープン数上限
vzctl set CTID –tcpsndbuf 1280000 コンテナのTCP通信送信バッファ
vzctl set CTID –tcprcvdbuf 1280000 コンテナのTCP通信受信バッファ
vzctl set CTID –dcachesize 50M コンテナの/dev/shm/ 割当量
vzctl set CTID –userpasswd user:passwd コンテナ内のユーザを作成
vzctl exec CTID コマンド コンテナ内でコマンドを実行
vzctl destroy CTID コンテナを削除

4.1.4.5. vzdumpのインストール

バックアップツールである vzdump というツールを利用します。
外部リポジトリの追加でRPMForgeを追加しておきます。
# rpm -Uvh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
# yum install cstream perl perl-LockFile-Simple -y
# rpm -ivh http://download.openvz.org/contrib/utils/vzdump/vzdump-1.2-4.noarch.rpm

4.1.4.5.1. vzdumpの使用方法

4.1.4.5.1.1. バックアップ

バックアップは、/vz/dump/に作成されます。
世代バックアップではないので必要な場合は他に移しておきます。
4.1.4.5.1.1.1. 停止中のものをバックアップ
# vzdump 100
4.1.4.5.1.1.2. サスペンドしてバックアップ
起動中のコンテナを一時停止してバックアップします。
# vzdump -suspend 100

4.1.4.5.1.2. リストア

# vzrestore /vz/dump/vzdump-openvz-100-2012_01_07-13_36_53.tar 100

4.1.4.5.1.3. クローン

他のコンテナIDでリストアすればクローンになります。

# vzrestore /vz/dump/vzdump-openvz-100-2012_01_07-13_36_53.tar 101

4.1.4.6. OpenVZのテンプレートについて

4.1.4.6.1. OpenVZのテンプレート更新

現在利用しているコンテナを再利用する場合はvzdumpでバックアップしておき、別のCTIDでリストアするだけです。
ここでは初期テンプレートを更新して利用する場合です。

4.1.4.6.1.1. テンプレートのダウンロード

更新を行いたいテンプレートが無ければ以下から好きなものをダウンロードします。
# cd /vz/template/cache
# wget http://download.openvz.org/template/precreated/ubuntu-12.04-x86_64.tar.gz

4.1.4.6.1.2. コンテナの作成

ダウンロードした圧縮ファイルのtar.gzが無いものを指定します。
開いているコンテナIDを利用するため先に確認しておきます。
# vzlist -a
# vzctl create 100 --ostemplate ubuntu-12.04-x86_64

4.1.4.6.1.3. コンテナへIPアドレスとDNSサーバを設定

ホスト名は設定しません。

# vzctl set 100 --ipadd 192.168.10.203 --nameserver 8.8.8.8 --save

4.1.4.6.1.4. コンテナのアップデート

4.1.4.6.1.4.1. CentOSの場合
# vzctl start 100
# vzctl enter 100
# yum update
# sed -i "s/en_US.UTF-8/ja_JP.UTF-8/" /etc/sysconfig/i18n
# mv /etc/localtime /etc/localtime.org
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
4.1.4.6.1.4.2. Ubuntuの場合
# vzctl start 100
# vzctl enter 100
# apt-get update
# apt-get upgrade
# apt-get install language-pack-ja -y
# update-locale LANG=ja_JP.UTF-8
# dpkg-reconfigure tzdata

4.1.4.6.1.5. コンテナの掃除

4.1.4.6.1.5.1. centosの場合
# yum clean all
# echo > /etc/resolv.conf
# exit
# vzctl stop 100
# vzctl set 100 --ipdel all --save
4.1.4.6.1.5.2. centosの場合
# apt-get clean
# echo > /etc/resolv.conf
# exit

4.1.4.6.1.6. コンテナを停止

# vzctl stop 100
# vzctl set 100 --ipdel all --save

4.1.4.6.1.7. テンプレートの作成

# cd /vz/private/100
# mv /vz/template/cache/ubuntu-12.04-x86_64.tar.gz /vz/template/cache/ubuntu-12.04-x86_64.tar.gz.old
# tar --numeric-owner -czvf /vz/template/cache/ubuntu-12.04-x86_64.tar.gz .

4.1.4.6.1.8. テンプレートの削除

# cd
# vzctl destroy 100
# rm -f /etc/vz/conf/555.conf.destroyed

4.1.4.6.1.9. 新しいテンプレートでコンテナを起動

# vzctl create 100 --ostemplate ubuntu-12.04-x86_64
# vzctl set 100 --ipadd 192.168.10.203 --nameserver 8.8.8.8 --save
# vzctl start 100
# vzctl enter 100