VirtualBoxでのネットワーク設定(NAT+ホストオンリーアダプタによるホストOSとゲストOS間の通信)

2010 年 4 月 11 日 oinume コメントはありません

CassandraやMogileFS、KumoFSなど、複数のサーバで構成されるサーバソフトウェアをテストしたいことが多々あるので、VirtualBoxを使って分散環境を作ってみました。ネットワーク関連の設定でややコツが必要だったので、ちょっとまとめてみました。

要件

ホストOS上で複数のゲストOS(Linux)を立ち上げる。

  • ホストOSからゲストOSにSSHでアクセスしたいので、ホストOSからゲストOS間にアクセスできること
  • 分散コンピューティングのテストがしたいので、ゲストOS間でもアクセスできること
  • ゲストOSからインターネットに出れること
  • ネットワーク上にある他のマシンからはゲストOSにはアクセスできなくてもOK

やり方

今回はネットワーク上の他のマシンからはアクセスできなくてもよいので、ネットワークの設定ではブリッジアダプタを使わずに、ネットワークアダプタを2つ使い、NAT+ホストオンリーアダプタという構成にします。NATというのはゲストOSから外部ネットワークに接続できる構成で、ホストオンリーアダプタというのはホストOSとゲストOS間のみでやり取りできるアダプタです。

具体的なやり方を書いておくと

  1. VirtualBoxをSunのサイトからダウンロードします。(自分は3.1.6 を使用しています)
  2. 仮想マシンを作成し、ネットワークの設定でアダプタ1で”NAT”を、アダプタ2に”ホストオンリーアダプタ”を選択します
  3. 終わったらOSをインストールして下さい。自分は今回CentOS 5.4を使用しました。

となります。これをゲストOSの数だけ繰り返して下さい。(もしくは仮想マシンを一つ作ってそれをコピーするのもよいでしょう)

インストールが終わったらゲストOSにログインして /sbin/ifconfig を実行してみて下さい。自分は今回centos-01とcentos-02 の2つのゲストOSを作ったところ、DHCPで下記のようにIPが割り当てられていました。

  • centos-01: eth0 10.0.2.15, eth1: 192.168.56.101
  • centos-02: eth0 10.0.2.15, eth1: 192.168.56.102

この時点で期待していたことができるか確かめてみます。

  • ホストOSから192.168.56.101,102にping
  • ゲストOSからgoogle.com(外部)にping
  • ゲストOSから192.168.56.1(ホストOSのIP)にping
  • ゲストOS 192.168.56.101から192.168.56.102(centos-02)にping

以上で複数サーバによる分散環境ができましたが、サーバ用途ではDHCPだと後々面倒な事になりそうなので、最後にこのDHCPで割り当てられた設定を参考に static なIPを設定しておきます。具体的にはゲストOSのeth1を192.168.56.10xにすればOKです。以下はcentos-01 の /etc/sysconfig/network-scripts/ifcfg-eth1 の変更箇所です。

--- ifcfg-eth1.orig     2010-04-12 00:11:39.000000000 +0900
+++ ifcfg-eth1  2010-04-12 00:18:52.000000000 +0900
@@ -1,6 +1,9 @@
 # Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
 DEVICE=eth1
-BOOTPROTO=dhcp
+BOOTPROTO=static
 HWADDR=08:00:27:BD:DD:6C
 ONBOOT=yes
-DHCP_HOSTNAME=centos-01
+IPADDR=192.168.56.101
+NETMASK=255.255.255.0
+NETWORK=192.168.56.0

変更したらnetworkを再起動します。

# /etc/init.d/network restart

centos-02は 192.168.56.102 のIPに設定しています。centos-01からcentos-02にpingしてみて通るか確認してみて下さい。

$ ping 192.168.1.102

これで通れば設定完了です。無事複数サーバによる分散環境ができました。

余談:なんでVirtualBox?

  • 無償で使える
  • Windows,Mac,Linuxに対応している
  • GUIによる設定画面がわりとわかりやすい

というのが気に入って使っています。VMwareもWindows,Mac,Linuxで使えますが、Mac版のVMware Fusionは有償なのがちょっと嫌でした。VirtualBoxは使っていてちょっと重いと思うこともありますが、突然落ちたりはせず非常に安定しているので、デスクトップPCで軽く仮想環境を作りたい場合には重宝しています。

CentOS徹底入門 第2版 (DVD付)

著者/訳者:中島 能和 飛田 伸一郎

出版社:翔泳社( 2008-02-05 )

大型本 ( 580 ページ )


カテゴリー: VirtualBox タグ: ,

コマンドラインオプションを解析するPerlモジュールGetopt::Compact

2010 年 4 月 10 日 oinume コメントはありません

Perlでコマンドラインオプションを解析する場合、大体は標準添付されているGetopt::Longを使うと思いますが、自分は3年前ぐらいから Getopt::Compact というモジュールに出会い、それ以降大抵の場合はこれを使っています。このモジュールの良いところは

  • オプションの定義(-c, –config などの定義)とそのヘルプメッセージが一箇所で定義できる
  • -h, –helpオプションを最初から定義してくれてる(–manオプションも)
  • 定義してないオプションが指定されると自動的にエラーにしてくれる
  • Getopt::Compact#usage でヘルプメッセージが簡単に取得できる

があると思っています。などと抽象的な話をしてもしょうがないので、具体的なコードを書いてみます。

#!/usr/bin/env perl
 
use strict;
use warnings;
use Getopt::Compact;
use Data::Dumper;
 
my $getopt = Getopt::Compact->new(
    name => 'getopt_compact.pl',
    modes => [ qw(verbose) ],
    args => 'FILE',
    version => '0.1',
    struct => [
        [ [ qw(f force) ], 'force overwrite of output file and compress links' ],
        [ [ qw(l level) ], 'compress level', '=i' ],
        [ [ qw(S suffix) ], 'use suffix on compressed files', '=s' ],
    ]
);
 
my $options = $getopt->opts;
my $file = shift @ARGV;
unless ($file) {
    print STDERR $getopt->usage;
    exit 1;
}
 
print "options -----\n";
print Dumper $options;

上の例では gzip のオプションのモノマネで

  • -f, –forceというフラグオプション
  • -l, –levelという数値のオプション
  • -S, –suffixという文字列のオプション
  • オプション以外に引数FILEを受け取る

という仕様としています。

でで、例えば

$ perl getopt_compact.pl --help

と実行すると

getopt_compact.pl v0.1
usage: getopt_compact.pl [options] FILE
options                                                          
-h, --help      This help message                                
-v, --verbose   Verbose mode                                     
-f, --force     Force overwrite of output file and compress links
-l, --level     Compress level                                   
-S, --suffix    Use suffix on compressed files                   
    --man       Display documentation

のようにヘルプが表示されます。また、–hoge のような存在しないオプションを指定すると

$ perl getopt_compact.pl --hoge
Unknown option: hoge
getopt_compact.pl v0.1
usage: getopt_compact.pl [options] FILE
options                                                          
-h, --help      This help message                                
-v, --verbose   Verbose mode                                     
-f, --force     Force overwrite of output file and compress links
-l, --level     Compress level                                   
-S, --suffix    Use suffix on compressed files                   
    --man       Display documentation

のようにエラーになりヘルプが表示されます。

という感じで、Getopt::Longより依存モジュールがあるものの便利に使わせてもらってます。ただ、PerlのGetopt系のモジュールは他にも色々あるのでもっと便利なのがありそうですが、こういうのもあるよという紹介でした。

モダンPerl入門 (CodeZine BOOKS)

著者/訳者:牧 大輔

出版社:翔泳社( 2009-02-10 )

大型本 ( 344 ページ )


カテゴリー: Perl タグ:

Shellでgetoptsを使ってコマンドライン引数の解析

2010 年 4 月 6 日 oinume コメントはありません

だいぶ前の話、Perlを使わないでShellスクリプトで頑張っていた頃、Shellでコマンドラインオプションの解析をやる時は

#!/bin/sh
 
for OPT in $*
do
    case $OPT in
    '-x' )
        FLAG_X="TRUE"
        ;;
    '-y' )
        shift
        FLAG_Y="TRUE"
        VALUE_Y=$1
        ;;
    esac
 
    shift
done
 
if [ "$FLAG_X" = "TRUE" ]; then
    echo "Option -x specified."
fi
 
if [ "$FLAG_Y" = "TRUE" ]; then
    echo "Option -y $VALUE_Y specified."
fi

という感じで $* と shift を使ってやっていたのですが、最近 getopts なる素敵なビルトインコマンドを知りました。これを使うと上のスクリプトは下のように書き直すことができます。

#!/bin/sh
 
while getopts xy: OPT
do
    case $OPT in
    "x" )
        FLAG_X="TRUE"
        ;;
    "y" )
        FLAG_Y="TRUE"
        VALUE_Y=$OPTARG
        ;;
    esac
done
 
if [ "$FLAG_X" = "TRUE" ]; then
    echo "Option -x specified."
fi
 
if [ "$FLAG_Y" = "TRUE" ]; then
    echo "Option -y $VALUE_Y specified."
fi

スクリプトの行数自体はあんまり変わらないように見えますが、shift 忘れをよくやらかしていたので、それが無くなった分つまらないバグを入れ込まなくなった気がします。

getoptsの解説

getopts の引数にオプションの文字を指定しますが、文字のあとに : (コロン)をつけると、引数ありのオプションという扱いになります。さらに

$ ./getopts.sh -z

のように未定義のオプションを指定すると

/home/oinume/tmp/script/getopts.sh: illegal option -- z

というように怒られます。このエラーハンドリングを自前でやるには :xy: のように、getopts の引数の文字列の最初を : にすればいいみたい。

さらに $OPTIND という変数を下記のように -1 してやることで、オプション以降に与えられた引数を取得することができます。例えば、上のスクリプトに下記を足して

shift `expr $OPTIND - 1`
if [ -n "$1" ]; then
    echo "Argument $1 specified."
fi
$ ~/tmp/script/getopts.sh -x -y yyy hoge

のように実行すると

Option -x specified.
Option -y yyy specified.
Argument hoge specified.

となります。getopts を実行すると、$OPTIND にはオプションのインデックス番号が保存されているので、これを -1 して shift してやることで、オプション以降の引数が取得できるようになるという仕組みです。

最近はこういうレベルのプログラムだったらPerlで書くことも多かったのですが、Shell でも十分いけそうだと実感しました。

詳解 シェルスクリプト

著者/訳者:Arnold Robbins Nelson H. F. Beebe

出版社:オライリージャパン( 2006-01-16 )

大型本 ( 345 ページ )


カテゴリー: Shell タグ:

Shellで配列のマージ

2010 年 3 月 25 日 oinume コメントはありません

Shellスクリプトで配列のマージってどうやるんだろうって思ったので調べてみたら、${ARRAY[*]} か ${ARRAY[@]} で配列の要素を全部取得できるらしいので、それを () 使ってマージすればいいらしい。

#!/bin/sh
 
ARRAY1=(1.1.1.1 2.2.2.2)
ARRAY2=(3.3.3.3 4.4.4.4)
ARRAY3=(4.4.4.4 5.5.5.5)
 
MERGED=(${ARRAY1[*]} ${ARRAY2[*]} ${ARRAY3[*]})
 
for n in ${MERGED[*]}; do
    echo $n
done

を実行すると

1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
4.4.4.4
5.5.5.5

となる。重複してる値はもちろんケアしてくれないので、頑張って取り除く必要あり。

カテゴリー: Shell タグ:

海外のVPS Linodeを借りました

2010 年 3 月 20 日 oinume コメントはありません

表題の通りなのですが、やっぱり自宅サーバでサービスを運営するのがすごい嫌になったのでLinodeを契約しました。プランは一番安いLinode 360で、契約してもうかれこれ3週間ぐらいですが、かなり快適に使ってます。良い点を挙げると…

  • データセンターにFremont(カリフォルニア)を選ぶと、SSHでストレスはない(Slicehostの時はアメリカの真ん中でネットワーク遅延が激しかったので使い物にならなかった)
  • CPUが(空いてれば)最大で4つまで使える。ちなみにCPUは”Intel(R) Xeon(R) CPU L5520 @ 2.27GHz” でかなり速い
  • まだ試してないけど簡単にプランがアップグレードできる(12分間のダウンタイムあり)
  • OSが自由に選べる(日本のVPSだと選択肢が少なかったり)

という感じで、今のところ不満はありません。なお契約してから知ったのですが、メモリの増量も 90MBで$5 / month で可能なようです。というわけでもしVPS探している人がいればこちらからどうぞ。(僕にアフィリエイトが入ります)

カテゴリー: VPS タグ:

MuninでMySQLプラグインのグラフが描画されない時の解決方法

2010 年 3 月 9 日 oinume コメントはありません

先日設定したサーバでMuninをインストールして監視していたのですが、どうもMySQL関連のプラグイン(mysql_bytes, mysql_queries, mysql_threadsなど)でグラフが描画されず、どうしたものかと思ってぐぐってみたところ、このエントリを見つけました。まさにビンゴで /etc/munin/plugin-conf.d/munin-node に以下の行を足してmunin-nodeをrestartしたところ、うまくグラフが描画されるようになりました。

env.mysqladmin /usr/local/bin/mysqladmin

Muninの問題なのか何なのか、自分のケースでは mysql 関連のコマンドを /usr/local/bin/ 配下にインストールしてたので、ここにPATHが通っていなかったのが問題のようです。

$ sudo -umunin munin-run mysql_bytes

と実行してもうまく数値が出てきたのでどうしたものかと悩んでいたのですが、解決してすっきりしました。

カテゴリー: Munin, MySQL タグ: ,

UbuntuでTimeZoneを変更する方法

2010 年 2 月 28 日 oinume コメントはありません

昔は tzconfig というのを使えばよかったらしいのですが、deprecated と言われました…

# dpkg-reconfigure tzdata

と入力して、Asia -> Tokyo を選択すればOKです。終わったら date コマンドで確認すればOK。

カテゴリー: Ubuntu タグ:
Pages: << 1 2 3 4 5 6 7 8 ...18 19 20 >>