nkjmkzk.net

powered by Kazuki Nakajima

Archive for 12月, 2008

Ext4, ついに安定版リリース

12/24にLinux kernel 2.6.28がリリースされました。このリリースの目玉としてExt4実装があります。Ext4はExt3と互換性を保ちながらも多くの改良がなされたものになっているようです。kernelnewbies.orgに記載されているNew featureを意訳してまとめてみました。

 
互換性

既存のExt3ファイルシステムはExt4にリフォーマットすることなく移行可能。具体的には該当ボリュームをReadOnlyでマウントしていくつかコマンド叩くだけでOK。

 

より大きなファイルシステムサイズ、ファイルサイズのサポート

Ext3からExt4ではそれぞれの制限は以下の通り。

ファイルシステムサイズ:16TB -> 1EB (エクサバイト)

ファイルサイズ:2TB -> 16TB

ちなみにEBとは、 (1 EB = 1024 PB, 1 PB = 1024 TB, 1 TB = 1024 GB)なぐらい大きい。

 

無制限のサブディレクトリ数

Ext3からExt4でのサブディレクトリ制限は以下の通り。

320000 -> 無制限

 

エクステントによる大きなファイル操作の効率化

これまでは「ファイル」のデータはディスクという円盤のいろんなところに「ブロック」としてバラバラと格納されていたが、このような大きなファイルを物理的に連続したブロック(これがエクステント)として格納するこで、特にdelete等の操作を効率化する。

 

マルチブロックアロケーションによる内部ブロック割当処理の効率化

これまでは連続してデータを書き込む際、ディスク上の空いているブロックを1ブロックずつ探してきて割り当てる、という処理になっていたがこれをブロックアロケータ自身に必要合計ブロック数を認識させることで、単一コールで複数ブロックを割り当てれるようになりオーバヘッドが緩和される。

 

遅延アロケーションによる性能改善

これまではデータが書き込まれるやいなやブロック割当てを実行していたが、これをしばらく遅らせることで連続データ書き込み時のブロック割当て処理をまとめて行えるようになりその分オーバヘッドが軽減できると同時にフラグメンテーションも抑えることができる。これは前述のエクステント、マルチブロックアロケーションと連携して相乗効果を発揮する仕組みになっている。

 

Fast fsck

fsckが対象とするinodeを全inodeから使用したinodeのみに絞り込むことでfsckにかかる所要時間を大幅に短縮する(環境によって1/2〜1/20程度に)。ただしinodeを使用したか未使用かを判断するにはfsckをその前後で走らせる必要があることに注意。

 

Journal checksum

ジャーナルの完全性を高めるためにチェックサム機構を取り入れた。これによって信頼性だけでなく、既存Ext3の2フェーズコミットをシングルコミットとすることができ性能の改善も期待できる(環境によっては20%程度向上の可能性も)。

 

オンライン・デフラグメンテーション

今回のkernelリリース(2.6.28)ではまだ実装していないが、将来のリリースではこのオンラインでのデフラグ機構が盛り込まれる予定。e4defragと呼ばれるツールで実装する。

 

inode関連の変更

ディレクトリ作成時にあらかじめinodeを作成しておくことにより、ファイル作成時のinode作成処理にかかるオーバヘッドを軽減する。

タイムスタンプを秒 -> ナノ秒に拡張。

上記にともないinodeのサイズを128バイトから256バイトに変更。

 

先行ディスク領域割当

アプリケーションがあらかじめ使用予定の領域を確保しておける仕組み。3つの利点があり、1つ目はアプリケーションが独自にこれを行おうとすると、あらかじめ領域を0で埋め尽くさなければ行けないがこれを回避できる。2つ目として、領域をあらかじめ一括して確保できるのでフラグメンテーションを抑制できる。3つ目として、必要な領域がなくなってしまうということがなくなることが挙げられる。

 

バリア機能がデフォルト有効に

ハードウェアが内部write-cacheをもって独自のキャッシュフラッシュ処理(順番入れ替え)を行うような場合でもジャーナルが確実にデータコミット前にディスクに書き込まれるように制御する。性能を若干犠牲にしてデータの完全性を高めるための選択。ただしマウント時に”mount -o barrier=0″とすることでこのバリアを無効にできる。

 

フーム、Ext4ではエクステント、マルチブロックアロケーション、遅延割当等を連携させて論理的に連続するデータを物理的にも連続させて管理やI/Oの効率化を計るところにかなり注力しているようです。素晴らしいー。

with one comment

Written by 中嶋 一樹

12月 27th, 2008 at 10:51 am

Posted in Uncategorized

Tagged with ,

RHEL4.xまたはOEL4.xのゲストOSで/dev/sd*が認識できない問題

RHEL4.xまたはOEL4.xのゲストOSに対して、/dev/sd*のような形で仮想ディスクを認識させたい場合、つまり、

disk = [
'file:/OVS/running_pool/OEL4U7i386/system.img,xvda,w',
'file:/OVS/running_pool/OEL4U7i386/vd1.img,sda,w',
]

な形でディスクを認識させようとしても、起動後にls /devしてみるとsdaはどこにも見あたりません。/var/log/messegesを見てみるとこんなメッセージが出ているはずです。

Dec 19 10:30:53 localhost kernel: register_blkdev: cannot get major 8 for sd
Dec 19 10:30:53 localhost kernel: xen_blk: can't get major 8 with name sd

これは本来使わなくていいはずのscsiカーネルモジュールをロードしてしまっているのが原因です。これを回避するためにはscsiモジュールを取り除いた形でinitrdをリビルドします。まず現状のinitrdにscsiモジュールが含まれてしまっていることを確認するには以下のようにコマンドを実行します。

[root@~]# zcat /boot/initrd-2.6.9-67.0.15.0.1.ELxenU.img | cpio -it | grep ko | grep -i scsi
lib/scsi_mod.ko

scsiモジュールが入っています。これを取り除いた形で新しいinitrdを生成します。

[root@~]# cd /boot/
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk /boot/initrd-2.6.9-78.0.0.0.1.ELxenU.img.scsifix 2.6.9-78.0.0.0.1.ELxenU

[root@~]# ls | grep initrd
initrd-2.6.9-78.0.0.0.1.ELxenU.img
initrd-2.6.9-78.0.0.0.1.ELxenU.img.scsifix

下が新しく作ったinitrdです。scsiモジュールが取り除かれているか確認します。

[root@~]# zcat /boot/initrd-2.6.9-67.0.15.0.1.ELxenU.img.scsifix | cpio -it | grep ko | grep -i scsi
(scsi_mod.koが表示されなければOK

ブートローダの設定ファイルを編集してこの新しいinitrdを使ってブートするようにします。

[root@~]# vi /boot/grub/menu.lst

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/xvda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Enterprise (2.6.9-78.0.0.0.1.ELxenU)
    root (hd0,0)
    kernel /vmlinuz-2.6.9-78.0.0.0.1.ELxenU ro root=/dev/VolGroup00/LogVol00 console=xvc0 rhgb quiet
    initrd /initrd-2.6.9-78.0.0.0.1.ELxenU.img.scsifix

これで完了です。リブートすれば/dev/sd*も認識できるようになっているはずです。

追記

このscsiモジュール無しのinitrdで起動している場合、VBDを/dev/sd*と認識することはできますが、そのかわりにiSCSIで直接ストレージに接続することができなくなっちゃいます。VBDの場合はxenblkドライバを使えばいいものの、iSCSI直接続の場合は本来のscsiドライバが必要になるからですね。まぁ、併用しなければいけないというような要件はなさげだしいいか。

without comments

Written by 中嶋 一樹

12月 19th, 2008 at 2:45 pm

Posted in Uncategorized

Tagged with

Func Package Controller v1.1

最新のfunc-0.23では仕様が少し変わって後方互換性がなくなってる部分があったので、fpcを最新バージョンに合わせてアップデートしました。

ダウンロードはこちら:fpc-1.1.zip

without comments

Written by 中嶋 一樹

12月 15th, 2008 at 10:59 am

Posted in Uncategorized

Tagged with

Oracle DatabaseとphpでOPAL環境を構築する

昨日はOracle Database XEの紹介とインストール手順を解説しました。

今日はそのXEを使ってOPAL環境を構築したいと思います。OPALとはかなりマイナーな略式名称ですが、Oracle Database, PHP, Apache, Linuxで構成するWeb+DBのスタックのことです。いわゆるアレです、LAMP(Linux, Apache, MySQL, PHP)みたいなもんです。というか平たく言えばパクリでしょう。*ちなみに「P」はPHP,Python,Perlのどれか。

昨日まででLinuxとOracle Databaseのインストールは済んでいるという前提で、その同じマシンにApacheとPHPをインストール/セットアップしていきましょう。それぞれ今日現在で最新のhttpd-2.2.10とphp-5.2.8を使用します。

まずはApacheですがこれは簡単、というかとくにOPALだからといって特別な手順やオプションはありません。普通にコンパイルしてインストールします。

# tar xvfj httpd-2.2.10.tar.bz2
# cd httpd-2.2.10/
# ./configure ¥
--prefix=/srv/httpd ¥ #適当に置き換えてください
--enable-so #多分デフォルト有効なのでいらないと思われますが一応
# make
# make install

終了ーー。では次にphpのインストールへ。

# tar xvfj php-5.2.8.tar.bz2
# cd php-5.2.8/

次のコンフィグが結構ミソです。phpからOracleに接続するにはOCI (Oracle Call Interface) を使うのが一般的かつ、性能面、機能面で最適な方法と言われています。ただしこれにも2種類あって、PDO_OCIと普通のOCI8というのがあります。実際、よりup-to-dateなドライバはOCI8になります。PDO_OCIの方はMySQLやPostgreSQLに接続する際でも統一されたインターフェースを提供してくれるいわゆる抽象化ドライバです。なので一見こいつをつかっといた方が後でDBを切り替えることがあった際に便利なのですが、残念ながら最近このPDO_OCIはメンテナンスされておらず、OCI8で実装されているBugFixや機能拡張などが反映されていません。なのでOracle一筋な方は迷わずOCI8を選択してください。そしてこのOCI8を使用するにはコンフィグ時に--with-oci8オプションを指定しておく必要があります。ちなみにPDO_OCIの方は--with-pdo-ociとします。一応こいつも入れておいてやろう。

# ./configure ¥
--prefix=/srv/php ¥ #適当に置き換えてください
--with-apxs2=/srv/httpd/bin/apxs ¥ #Apacheをインストールした場所によって置き換えてください
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ¥ # $ORACLE_HOMEを指定します。
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ¥ # 同じく$ORACLE_HOMEを指定します。
--with-gd ¥
--with-gettext ¥
--disable-short-tags ¥
--enable-pdo ¥
--enable-mbstring ¥
--enable-exif ¥
--enable-sigchild

これでOK。ビルドしていきます。

# make
# make install

これでバイナリがインストールされました。次に設定ファイルを作成します。テンプレートがあるのでそれをコピーして少しだけ編集(追記)します。

# cp php.ini-recommended /srv/php/lib/php.ini
# vi /srv/php/lib/php.ini
extension_dir=/srv/php/lib/php/extensions/no-debug-non-zts-20060613
extension=oci8.so

あと、httpd.confにも少し手を入れます。以下を最後の方にでも追記してください。

# vi /srv/httpd/conf/httpd.conf
AddType application/x-httpd-php .php 
AddType application/x-httpd-php .phtml 
AddType application/x-httpd-php-source .phps 

これでOKです。なお、今更ですがSE Linuxとかが有効になっているとphpのモジュールをロードする際にエラーになっていまうので/etc/selinux/configでSELINUX=disabledにしておいてください。もうこれで使える状態にあるのですが、実はこのphpのソースにバンドルされているOCI8は結構古かったりします。気持ち悪いので最新版にアップデートしておきたいところです。というわけでPECLから最新のソースをとってきます。

# wget http://pecl.php.net/get/oci8-1.3.4.tgz
# tar xvfz oci8-1.3.4.tgz
# cd  oci8-1.3.4/
# /srv/php/bin/phpize
# ./configure --with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
# make
# make install

これでばっちりです。最新のモジュールが/srv/php/lib/php/extensions/no-debug-non-zts-2006061にインストールされました。あとはapachectl startするだけです。ちなみに一応ちゃんとOCI8がインストールされているか確認するためにphpinfo()を活用しましょう。Apacheのドキュメントルートに以下の様にファイルを作成します。

# vi /srv/httpd/htdocs/phpinfo.php
<?php
phpinfo();
?>

そしてこのサーバにアクセスしましょう。


http://あなたのIPアドレス/phpinfo.php

するとこんな画面が出てくるはずです。

下の方にスクロールしていき・・・

ありましたね。よかったよかった。ひとまずこれでセットアップは完了です。

ちなみに今回のようなOPAL環境の構築について、佐藤さんがいち早く良いドキュメントを紹介されています。

http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf

英語にはなってしまうのですがこれははっきり言ってかなりの良書です。Oracle好きだけどJavaはちょっと、という僕のような人にはたまらない感じです。

with one comment

Written by 中嶋 一樹

12月 14th, 2008 at 7:49 pm

Posted in Uncategorized

Tagged with , ,

Oracle Database XEをインストールする

Oracle Databaseにも実はフリーエディションがあります。日本では全く露出していないのであんまり知られていません。その名もOracle Database Express Edition、略してXEです。

ライセンス料が発生するStandard Edition, Enterprise Editionと比べるといくつか制限があります。

  • プラットフォームはLinuxかWindowsの32bit
  • データは4GByteまで
  • メモリは1Gbyteまで
  • CPUは1ソケットまで

しかしながら開発環境はもちろん、ある程度の環境であれば十分使えるデータベースです。なにせデータベースそのものは上位のエディションとまったく同じコードベースですから。それではインストールしましょう。

OSはOracle Enterprise Linux 5 – i386でいきます。ちなみにswapが1024MByte確保されてないとインストーラにはじかれてしまいますのでご注意を。あと、事前に名前解決だけご注意を。hostnameコマンドをうって、そのホスト名が/etc/hostsとかで正しいIPに解決されることを確認しておいてください。さてインストーラですが、コマーシャル版はOUI (Oracle Universal Installer)でインストールするのが定石ですが、XEはRPMで提供されるためrpmコマンド一発でインストールできます。 

[root@local]# rpm -ivh oracle-xe-univ-10.2.0.1-1.0.i386.rpm
Preparing...                ########################################### [100%]
   1:oracle-xe-univ         ########################################### [100%]
Executing Post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to
configure the database.

うーむ、こういうシンプルさ、好きです。

そしてマネージャやリスナーのポート設定、アカウント設定等の初期設定をするために上記メッセージ通りにoracle-xe configureを実行します。

[root@local]# /etc/init.d/oracle-xe configure
Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express 
Edition.  The following questions will determine whether the database should 
be starting upon system boot, the ports it will use, and the passwords that 
will be used for database accounts.  Press <Enter> to accept the defaults. 
Ctrl-C will abort.
Specify the HTTP port that will be used for Oracle Application Express [8080]:
Specify a port that will be used for the database listener [1521]:
Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 
different passwords for each database account.  This can be done after
initial configuration:
Confirm the password:
Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:y
Starting Oracle Net Listener...Done Configuring Database...Done Starting Oracle Database 10g Express Edition Instance...Done Installation Completed Successfully. To access the Database Home Page go to "http://127.0.0.1:8080/apex"

おぉ。これでインストール終わりですか。

ちなみにこのメッセージ、みたことある人もいらっしゃるかも。実はOracleVM ManagerはデータストアとしてこのXEを使っているのです。なのでOracleVM Managerをインストールするときに同じようなメッセージが表示されます。さて、インストールが済んだら管理画面を開いてみよう。これはXEをインストールしたホスト上のブラウザで以下のURLを参照することでアクセスできます。


http://127.0.0.1:8080/apex

デフォルトではローカルホスト上からしかアクセスできないことに注意。これは簡単にリモートからも操作可能に設定できます。

これがログイン画面。
3104578840_7b2547646c_o

そしてログイン後のトップ画面。
3103747423_e65d9b46d0_o

参考までにテーブルを作る画面。

3104578948_14fbf3b46e_o

このようにXEではApplication ExpressというEnterprise Managerとは別の管理プログラムがついてきます。これもでもなかなか使えますよ。

あと、$ORACLE_HOME/binにoracle_env.shというのがあります。こいつはOracle固有の環境変数を設定してくれるスクリプトになっています。

. $ORACLE_HOME/bin/oracle_env.sh

としておくもよし、.bash_profileに適当に書き写しておくもよし、です。

without comments

Written by 中嶋 一樹

12月 13th, 2008 at 7:18 pm

Posted in Uncategorized

Tagged with

func-0.23をセットアップする

以前にいきなりfuncのモジュールをリリースしましたが、久しぶりに見てみたらバージョンが大分上がってインストール手順も少し変わっているようなのでそのあたりをご紹介しておこうと思います。

そもそもfuncとはFedora Unified Network Controllerの略で、大量のサーバ群を一元管理するためのツールです。

サーバが死ぬほどたくさんあってそれぞれに同じような操作を行わなければいけないようなケース、例えば、パッケージの追加やアップデート、パッチ適用、設定ファイルの編集などを全サーバに施す必要が出てきた場合、うんざりしながらもしょうがないのでパワープレイで一台づつSSHでログインして・・ということをやってしまいがちだが、こういったことはfuncがあれば一回の操作でカタがつく。

funcでは一括して命令を行うcertmasterと呼ばれるコンポーネントと、そしてその命令の対象となるminionと呼ばれるコンポーネントで構成されています。

能書きはそれくらいにしてインストール、いってみよう。

まずは必要なモジュールをインストールする。EPELのレポジトリをすでに登録している粋な人は

[root@~]# yum install func

とするだけでOKだ。依存するモジュールも自動的にインストールしてくれる。しかしそんな人はあんまりいないので個別にダウンロードしてインストールする方法も紹介しておきたい。必要なのは多分以下のモジュール。

  • func
  • pyOpenSSL
  • certmaster
  • python-simplejson

funcのバージョンは今回0.23を想定しています。必要なモジュールは環境によっては他にもあるかもしれないけど、大抵はこのくらい集めればOKだと思われます。ダメだったらrpmのエラーを見て対応。ダウンロードしたら全部

[root@~]# rpm -ivh *

みたいな感じでインストールします。これらのモジュールはcertmaster, minionともに同様にインストールしておきます。

次にminion上で設定ファイルを編集し、minionにcertmasterの場所(IP)を教えてあげる。

[root@~]# vi /etc/certmaster/minion.conf
# configuration for minions
[main]
certmaster = 192.168.0.1 #certmasterのIPアドレスを指定
log_level = DEBUG
cert_dir = /etc/pki/certmaster

これでOK。デーモンの起動に移ろう。まずはcertmasterから。

[root@~]# service certmaster start

次にminion。

service funcd start

この状態でプロセスの起動まで完了。現状ではminionがcertmasterに対して自身の登録依頼を出した状態になっている。これをcertmasterで認可してやる必要がある。まずは認可待ちになっているminionを確認してみる。

[root@~]# certmaster-ca --list
minion01

フムフム。来とる来とる。で、認可します。

[root@~]# certmaster-ca --sign minion01
/var/lib/certmaster/certmaster/csrs/minion01.csr signed - cert located at /var/lib/certmaster/certmaster/certs/minion.cert

完了。確認しておきましょうか。

[root@~]# certmaster-ca --list-signed
minion01

オッケーィ。正常に登録されました。それでは軽く命令の発行の仕方だけ最後に確認しておきましょう。基本的にはcertmaster上で以下のような書式で命令します。

[root@~]# func 対象minion 命令

命令の部分はさらにいくつかのパートに分かれますが、最初に文法コンプリートするのもナンなので例文を紹介しておくにとどめます。例えば、minion01に再起動を命じる場合、以下のように命令します。

[root@~]# func minion01 call reboot reboot

そしてこれだけであれば「オイオイ、sshした方が早かろうて」ということになりますが、funcの特徴の一つは対象minionのところにワイルドカードが指定できることです。例えばminion01の他に、minion02, minion03がいたとします。3台ともに再起動を命じる場合、以下のように命令します。

[root@~]# func "minion*" call reboot reboot

またはこのケースであれば”minion*”を単純に”*”に置き換えてもいいでしょう。このようなホストの命名規則がある程度しっかりしていればワイルドカードで簡単に複数台を指定できます。もし、ホスト名はめちゃくちゃランダムです、という場合であれば、事前に設定ファイルにてグループを定義することもできます。グループの設定ファイルはcertmaster上の/etc/func/groupsですがデフォルトだと作成されていないので↓な感じで作ります。

[グループ名]
host = minion名をカンマ区切りで指定

サンプル

[WebServers]
host = web01,web02,ap01,ap02

そして命令文の中では「@グループ名」として指定します。

[root@~]# func @WebServers call reboot reboot

サブグループを作ったりもできますので気になる方は調べてみてください。

without comments

Written by 中嶋 一樹

12月 7th, 2008 at 7:02 pm

Posted in Uncategorized

Tagged with

Oracle VMってどんなの?

OracleVMはORACLEが提供している仮想化ソフトウェア。OracleVMはHyperviosr型でそのエンジンにはXenを採用しています。OracleVMの特徴を要約すると、

Xen + 独自拡張(GUI, H/A Cluster, QoS等々) + ORACLEのサポート

な感じです。

OracleVMにはVM ServerとVM managerという2つのコンポーネントが存在します。VM Serverは仮想マシン(ゲストOS)を稼動させるコンポーネントで、I/Aサーバ機に直接インストールします。このVM Serverはそれ単体でもコマンドラインから仮想マシンを作成したり、起動/停止することができますが、それらの操作はGUI上でも行うことができます。その機能を提供するのがVM Managerです。VM ManagerはRedhat Enterprise LinuxまたはOracle Enterprise Linux上で動作するソフトウェアで、Webアプリとして動作します。なのでVM Managerへのアクセス、操作はブラウザ経由で行います。VM Serverが複数台あってもコイツがあれば一元管理が可能ってわけです。このVM Managerを使えば以下のような一般的な管理作業はすべてGUIベースで行うことができます。*ちなみにバージョンは2.1.2

  • 仮想マシンの新規作成
  • 仮想マシンの起動/停止
  • 仮想マシンのテンプレート化
  • テンプレートから仮想マシンを作成
  • 既存の仮想マシンの複製(複製台数を指定可能!)
  • H/Wリソースの調整(CPUコア数、メモリ容量、ディスク、NIC、ディスクI/O優先度、ネットワーク帯域幅制限)

画面はこんな↓です。

ログイン画面

 

3086624522_5355363dc2_o

ログイン後のトップ画面。仮想マシンのリストが表示されます。

 

3086624566_7326c5f138_o

任意の仮想マシンをクリックして詳細情報を表示。

 

H/Wリソースの調整もここから行えます。

3086624642_c48c1e789a_o

やっぱりGUIでポチポチ操作ができるとマニュアル読まなくても使えちゃうので便利ですね。

なのでXenを使いたいんだけどコマンド操作ってちょっと億劫、なんて人には便利です。これ、完全に無料で使えるので。フフフ。

without comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:19 pm

Posted in Uncategorized

Tagged with

func package controller v1.0

突然何の脈絡もないですが、func package controllerなるものを作成しました。

ダウンロードはこちらから:fpc-1.0.zip

これはfunc (Fedora Unified Network Controller)というサーバ管理フレームワークを使っているシンプルなPythonスクリプトで、以下のようなことができます。

・大量のサーバに一括してRPMをインストールする。

・大量のサーバから一括してRPMをアンインストールする。

・大量のサーバの任意、または全てのパッケージをアップデートする。

・大量のサーバの内、任意のRPMがインストールされているサーバをしらべる。

・大量のサーバの内、任意のRPMがインストールされていないサーバをしらべる。

つまりは大量のサーバのパッケージ管理がワンライナーでできますよ、というツールです。

インストール方法や使い方などは付属のREADMEを参照下さい。こいつのインストール自体は簡単極まりないですが、そもそもfuncが使える環境でないと動かないでのBe careful.

funcがどんなものかとか全然説明してないですが、詳しくは発売中の日経Linuxのサーバ管理最強テクニックという連載の第4回、第5回(もうちょっとしたら発売)にあり。またこのサイトでも後日詳細を書こうと思います。

without comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:16 pm

Posted in Uncategorized

Tagged with ,

MacBook Air

1月中、帰省中に実家でみたMacBook AirのTV CMがずっと頭から離れませんでした(あの歌が)。2週間ほど前に現物がみてみたくて仕事帰りに渋谷のAppleストアに立ち寄ったところブツが店頭に置いてありました。30分ほど持ち上げたり意味なく文字列を打ち込んだりして感触を確かめていましたが、ふと店員さんが近くに来たので「WebのAppleストアでは納期2〜3週間となっているけど、実際どのくらい?」と聞いてみたところ、「・・・1.6Ghzのモデルですか?」と店員。「はいそうです。」と僕。「・・・今、確認してきますが、実はごくわずかだけ在庫があったと思います。多分1台だけ・・  押さえましょうか?」と店員。「あ、そうなんですか。」としらじらしく応答。そんな夫婦ザイマンみたいなことをしつつあえなく購入。いうまでもなく在庫はまだあったでしょうな。
さておき、このMacBook、なんとなく気になってたもののスペックからすると結構高いし、コレをどうしても買わなきゃいけない理由があまり見当たらなかったものの、最後は衝動BUYしました。で、実際買ってみてどうかというと、・・・イイです。あくまで個人的な意見ですが、かなりイイ。某所でも同じことがいわれていましたが、買ってみるとスペック等まったく気になりません。というのも実際動作速度に不満を覚えることもないし、それよりもコイツをいろんなところに持ち歩いてなにげにパカッと開いて作業を始めるのがとてつもなく満足な気分になるから。23万というのはスペックを基準につけられた価格ではないことがよく理解できます。こいつと一緒にウロウロしてそこら中でパカパカ開いて使うと何故か妙に満足できます。僕は社会人になってからずっとThinkpad Xシリーズを使い込んでおり、サイズ、重さ、キータッチ、トラックポインタすべてがもはやノートPCとして完成型だと思っていました。しかしこのMacBook Airはそんな価値観を転換させるほど魅力的。それはハードウェアとしての美しさと機能性、そしてLeopardというOSがそうさせるんでしょうなぁ。Thinkpadにはなかった新しいノートPCとしての魅力がこのAirにはあるようです。ここまで書いて何がそんなにいいのかを整理するほどの気力がなくなってきたのと百聞は何とか、ということで一枚の写真を皆様に。

without comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:10 pm

Posted in Uncategorized

Tagged with

オープンソースの統合監視システム 「ZABBIX」を構築する

こんにちは、お久しぶりです。
今日はZABBIXという監視ソフトウェアを紹介しようと思います。加えて構築手順にも言及します。

ZABBIXはラトビアのZABBIX SIA社が母体となって開発しているオープンソースの統合監視システムです。ライセンスはGPLv2。サーバとエージェントという二つのコンポーネントで構成されます。エージェントが監視対象に常駐して各種情報を取得し、サーバがその情報を引っ張ってきてデータベースに格納。集めた情報をサーバ上のWebインターフェースで管理するという形です。Webインターフェースやデータベースそのものはサーバ上においてもOKですが、外出しすることも可能です。ちなみにエージェントを入れるのがヤダという人はエージェントレスでSNMPやカスタムスクリプトで情報を集めることも可能です。

このソフトウェア、何ができるの?というのをとりあえず以下に一部をまとめました。

監視対象検出
・ネットワークをスキャンして監視対象を自動検出&自動設定!

監視対象の情報取得
・H/Wリソース(CPU使用率、メモリ使用率、ネットワーク帯域、ディスク容量、ディスクI/O)状況
・ホスト名、起動時間
・inode状況、プロセス状況
・温度(気温ではない)
・自作スクリプトでいろいろ

アクション
・メール通知
・SNMPトラップ
・Jabber通知
・自作スクリプトでいろいろ

レポーティング
・集めた情報をグラフ化 期間、対象は自由に選択可

マップ
・監視対象のトポロジをマップで可視化

という感じ。何しろ強力なのが拡張性です。情報取得やアクションを自分で自由に作成できるのがいい。そもそも何故いきなり監視システムの話かというと、Xenの仮想化システムに対してばっちりフィットする良いソフトウェアを探していたからです。このZABBIXも特段Xen対応しているわけではないのですが、拡張機能でがんばればいろいろできそうだな、と思っていろいろやってみたという背景です。伝統的なNagiousや国産で多機能なHinemosも調べてみましたが拡張性においてはZABBIXがベストでした。しかも監視対象自動検出&自動設定やテンプレートによる監視対象の一元的設定等、かなりツボをついてくるソフトです。全機能を完全にフリーで使えてここまで作りこまれているソフトを私は知りません。誰か知ってたら教えてください。

というわけでそろそろ構築手順に移りたいと思います。
サーバ、監視対象(エージェントを突っ込む)のプラットフォームはいずれもRedHat EL5.1で検証しています。CentOSやFedoraでも概ね同様でいけると思います。Debianの場合はすでにパッケージが用意されているという噂なので多分apt-getでいけるのかも知れません(デベロッパーはubuntuベースで開発しているらしい)。ZABBIXのバージョンは1.4.4を使用します。

まずはサーバの構築から。ZABBIXのソースをとってきます。このソースからサーバもエージェントもビルドできます。公式サイトからDownloadできますのでこれを/optに保存して展開しておきます。

# tar xvfz zabbix-1.4.4.tar.gz

依存関係で必要なものをyumでどんどんインストールします。

# yum install httpd mysql mysql-server mysql-devel php php-gd php-bcmath net-snmp net-snmp-devel net-snmp-libs net-snmp-utils -y

あとRedhatのパッケージには無いfpingというユーティリティをソースからコンパイルしてインストールします。なお、インストール後に実行ファイルへスーパーユーザ/グループビットを付加します。

# cd /opt
# wget http://fping.sourceforge.net/download/fping.tar.gz
# tar xvfz fping.tar.gz
# cd fping-2.4b2_to
# ./configure
# make
# make install
# chmod 710 /usr/local/sbin/fping
# chmod ug+s /usr/local/sbin/fping

MySQLにZABBIX用のデータベースを作成します。(ちなみにPostgresqlやOracle等でも代用可能です)

# mysql_install_db
# service mysqld start
# mysql -u root
> create database zabbix;
> q

作成したデータベースにスキーマを突っ込みます。

# cat /opt/zabbix-1.4.4/create/schema/mysql.sql | mysql -u root zabbix
# cat /opt/zabbix-1.4.4/create/data/data.sql | mysql -u root zabbix
# cat /opt/zabbix-1.4.4/create/data/images_mysql.sql | mysql -u root zabbix

このあたりでZABBIXユーザとグループを作成しておきます。

# groupadd zabbix
# useradd -g zabbix

ユーザのログインシェルはセキュリティ的に/sbin/nologin等にすべきだという噂もありますが、僕はかくかくしかじかで/bin/bashのままにしておきます。

ZABBIXをインストールするディレクトリを作成します。今回は/srv/zabbixをPREFIXとしてインストールします。

# mkdir -p /srv/zabbix/{etc,run,log,script}

コンパイル&インストールに移ります。

cd /opt/zabbix-1.4.4
# ./configure
--prefix=/srv/zabbix
--enable-server
--enable-agent
--with-mysql
--with-net-snmp
--with-libcurl

# make
# make install

これで/srv/zabbix/sbinにZABBIXのバイナリがインストールされました。次に設定ファイルを用意します。サンプルファイルをコピーしてきてそれを編集します。

# cp /opt/zabbix-1.4.4/misc/conf/zabbix_server.conf /srv/zabbix/etc/
# vi /srv/zabbix/etc/zabbix_server.conf
(抜粋)
PidFile=/srv/zabbix/run/zabbix_server.pid
LogFile=/srv/zabbix/log/zabbix_server.log
AlertScriptsPath=/srv/zabbix/script
ExternalScripts=/srv/zabbix/script
FpingLocation=/usr/local/sbin/fping

次に起動スクリプトを用意します。これもサンプルファイルをコピー&編集します。これはプラットフォームとなるOSに応じてサンプルがいくつか用意されているのですがRHEL5用というものはありません。代わりにfedora core用のものを拝借して利用します。

# cp /opt/zabbix-1.4.4/misc/init.d/fedora/core/zabbix_server /etc/init.d
# vi /etc/init.d/zabbix_server
(抜粋)
# Zabbix-Directory(修正)
BASEDIR=/srv/zabbix

# Binary File(そのまま)
BINARY_NAME=zabbix_server

# Full Binary File Call(修正)
FULLPATH=$BASEDIR/sbin/$BINARY_NAME

# Configuration File(追加)
CONFIG_FILE=$BASEDIR/etc/zabbix_server.conf

# PID file(修正)
PIDFILE=$BASEDIR/run/$BINARY_NAME.pid

# Establish args(そのまま)
ERROR=0
STOPPING=0

#(途中省略)

start() {
if [ $RUNNING -eq 1 ]
then
    echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"
else
    #(設定ファイルを指定するように修正)
    action $"Starting $BINARY_NAME: " $FULLPATH -c $CONFIG_FILE
    touch /var/lock/subsys/$BINARY_NAME
fi
}

インストールディレクトリ全体をZABBIXユーザの所有とします。

# chown -R zabbix:zabbix /srv/zabbix

さぁ、これでマネージャは準備ができました。起動してみましょう。

# service zabbix_server start

ps -ef等でプロセスを確認すると複数のzabbix_serverプロセスが起動しているはずです。プロセスが見当たらない場合にはログをみてシューティングして下さい。

次にWebインターフェースを設定します。これは必要なphpコンテンツをWebサーバのドキュメントルート以下にコピーするだけでOKです。(以前までは手動でデータベース関連の設定を編集する必要がありましたが、新しいバージョンでは不要となりました。データベース関連の初期設定もすべてブラウザから可能です。)

# cp /opt/zabbix-1.4.4/frontends/php/* /var/www/html/

phpの環境設定を行います。2点だけ。

# vi /etc/php.cnf
max_execution_time = 300
date.timezone = Asia/Tokyo

さて、これでWebインターフェースの方も準備OKです。httpdプロセスを起動します。

# service httpd start

ちなみにhttpd.confのServerNameだけは設定しておかないと警告がでますがとりあえずは気にしないということで。

これでZABBIXにアクセスできるようになりました。ブラウザでWebサーバにアクセスしてみてください。初回アクセス時には初期設定ウィザードが表示されます。要求どおりにポチポチNextを押していけば設定は完了します。

次にエージェントの方も設定します。別筐体にインストールしてもいいのですが、今回はお手軽にサーバと同一サーバ機上にインストールしてみましょう。実は上記のサーバインストールの手順でエージェントのバイナリも一緒に作ってあります。./configureの–enable-agentオプションがそれです。なのでエージェントだけ構築する際には./configure –enable-agentだけでOKです。今回はエージェントはすでに/srv/zabbix/sbin/zabbix_agentdとしてインストールされていますので残るセットアップを行っていきます。エージェントの設定ファイルをこれまたサンプルをコピー&編集します。

# cp /opt/zabbix-1.4.4/misc/conf/zabbix_agentd.conf /srv/zabbix/etc
# vi /srv/zabbix/etc/zabbix_agentd.conf
(抜粋)
DisableActive=1
PidFile=/srv/zabbix/run/zabbix_agentd.pid
LogFile=/srv/zabbix/log/zabbix_agentd.log
EnableRemoteCommands=1

DisableActive=1としておかないとエージェントからサーバに能動的にアクセスしようとします。これが疎通する環境であれば問題ないのですが、NATがかかったりしているとこの通信はブロックされる可能性もありますので僕はOFFにしています。ちなみに一つ前の1.4.3ではこれを有効化したまま通信がうまくいかないとエージェントがダウンするという不具合がありました。Be carefull。

次に起動スクリプトをサンプルからコピー&編集します。

# cp /opt/zabbix-1.4.4/misc/init.d/fedora/core/zabbix_agentd /etc/init.d
# vi /etc/init.d/zabbix_agentd
(抜粋)
# Zabbix-Directory(修正)
BASEDIR=/srv/zabbix

# Binary File(そのまま)
BINARY_NAME=zabbix_agentd

# Full Binary File Call(修正)
FULLPATH=$BASEDIR/sbin/$BINARY_NAME

# Configuration File(追加)
CONFIG_FILE=$BASEDIR/etc/zabbix_agentd.conf

# PID file(修正)
PIDFILE=$BASEDIR/run/$BINARY_NAME.pid

# Establish args(そのまま)
ERROR=0
STOPPING=0

#(途中省略)

start() {
if [ $RUNNING -eq 1 ]
then
    echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"
else
    #(設定ファイルを指定できるように修正)
    action $"Starting $BINARY_NAME: " $FULLPATH -c $CONFIG_FILE
    touch /var/lock/subsys/$BINARY_NAME
fi
}

よし、これで完了。エージェントの方は簡単ですね。
エージェントも起動しましょう。

# service zabbix_agentd start

エージェントの方も複数のプロセスが起動したと思います。うまくいったら自動起動するようにしておきましょう。

# for i in httpd mysqld zabbix_server zabbix_agentd
do
chkconfig --level 3 $i on
done

お疲れ様です。ZABBIXのサーバ、エージェント両方セットアップ完了です。あとはWebからがんがん設定していくのみです。次回はこの設定について書こうかな。

without comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:09 pm

Posted in Uncategorized

Tagged with