2009年6月14日日曜日

Sun VirtualBox 2.2.4 上に WindowsServer2008 をインストールして 「Guest Additions」。いわゆるバーチャルマシン追加機能

WindowsVistaに 「Sun VirtualBox 2.2.4 」 を入れて、WindowsServer2008を仮想PC上にセットアップした。
 

OSセットアップ直後には、仮想PCのGUIを触るとマウスが捕えられてちょっと不便、マウスをシームレスにするため Guest Additions というのを入れる。
実は WindowsServer2008 にも対応していると思ってなかったのでちょっと感心した。
 
大体はVRDPでも事足りるんんだけど、追加しといて損はなさそう。
 
 

インストールは非常に簡単、早い話がVirtualPC/VirtualServerのバーチャルマシン追加機能と機能も導入の仕方も同じ。(※多少の差異はアリで)
 


[caption id="attachment_1349" align="alignnone" width="300" caption="画像:VirtualBox の Guest Additions"]画像:VirtualBox の Guest Additions[/caption]
 

以降、迷うとこも無いので再起動まで流す。
 

[caption id="attachment_1350" align="alignnone" width="300" caption="画像:CDを入れたような感じになる"]画像:CDを入れたような感じになる[/caption]
 

[caption id="attachment_1351" align="alignnone" width="300" caption="画像:Guest Additionsセットアップ開始"]画像:Guest Additionsセットアップ開始[/caption]
 

[caption id="attachment_1352" align="alignnone" width="300" caption="画像:専用のドライバが入る"]画像:専用のドライバが入る[/caption]
 


[caption id="attachment_1353" align="alignnone" width="300" caption="画像:再起動を促される"]画像:再起動を促される[/caption]
 
ここで再起動が入るので注意。
 
 

[caption id="attachment_1354" align="alignnone" width="383" caption="画像:マウス統合の説明"]画像:マウス統合の説明[/caption]
 

ゲストの起動を尻目にメッセージボックスが現れる、背後では着々とOSの起動は進行。
 

[caption id="attachment_1355" align="alignnone" width="300" caption="画像:マウス統合後"]画像:マウス統合後[/caption]
 

マウス統合の証アイコンが右下にあるのが判るだろうか。

2009年6月12日金曜日

Windows PowerShell でイベントログをリアルタイム監視

The PowerShell Guy が教えてくれた、WindowsServerでイベントログをリアルタイムで監視する方法。
 
 


.Net FrameWorkで最新のイベントログをキャッチ


.Net FrameWork を使えるPowerShellなら、色々楽勝...といっても結局はWMIに問い合わせるみたい、某所で使っているイベントログ監視スクリプトはVBSで作ってあるけど、あれもWMIだったな。
 

ただ、system.management.ManagementEventWatcher クラスをいきなり使えるということでだいぶ違うように見える。
実はクラスとかあまり理解してないが、なんとも便利になったと思う。
 
 

PowerShellプロンプトでやってみる


イベントを待つには3行ですっきりOK、表示用にもう一行。
手っ取り早く効果を試せるので、下記をPSのプロンプトに張り付けてみる。

[sourcecode language='sh']$ew = new-object system.management.ManagementEventWatcher
$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"
$e = $ew.WaitForNextEvent()
$e[/sourcecode]

ManagementEventWatcher パブリック メソッド の WaitForNextEvent() を使っている、張り付けたスクリプトはいったんここで止まる。
 

PS C:\>$ew = new-object system.management.ManagementEventWatcher
PS C:\>$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"
PS C:\>$e = $ew.WaitForNextEvent()
PS C:\>$e
_←点滅カーソル


何かイベントが発生するまで待機するので、他のシェルからテスト用に eventcreate コマンドでイベントログを書き込み。
 

C:\>EVENTCREATE /T ERROR /ID 1000 /L APPLICATION /D "wait test"
 
成功: 種類が 'ERROR' のイベントが、'APPLICATION' ログ内に、'EventCreate' をソースとして作成されました。

 
すると、 $e に発生したイベントのオブジェクトが代入され、 直後で指定しているので $e が表示される
 

はい出た。
__GENUS : 2
__CLASS : __InstanceCreationEvent
__SUPERCLASS : __InstanceOperationEvent
__DYNASTY : __SystemClass
__RELPATH :
__PROPERTY_COUNT : 3
__DERIVATION : {__InstanceOperationEvent, __Event, __IndicationRelated, __SystemClass}
__SERVER :
__NAMESPACE :
__PATH :
SECURITY_DESCRIPTOR : {1, 0, 20, 128...}
TargetInstance : System.Management.ManagementBaseObject
TIME_CREATED : 128892011594751253

 

が、えらくメタな情報だな。
 
 

今回目的のイベントログは TargetInstance ってプロパティに格納されているので表示する、この辺はWMI。
PS C:\> $e.targetinstance
 
 
__GENUS : 2
__CLASS : Win32_NTLogEvent
__SUPERCLASS :
__DYNASTY : Win32_NTLogEvent
__RELPATH : Win32_NTLogEvent.Logfile="Application",RecordNumber=13539
__PROPERTY_COUNT : 16
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Category : 0
CategoryString :
ComputerName : ********
Data :
EventCode : 1000
EventIdentifier : 1000
EventType : 1
InsertionStrings : {wait test}
Logfile : Application
Message : wait test
RecordNumber : 13539
SourceName : EventCreate
TimeGenerated : 20090********.000000-000
TimeWritten : 20090********.000000-000
Type : エラー
User : ********\sawano

 
OK、イベントソース、コードなど、おなじみのものが表示されている。
 
 



監視をループさせる


それではイベントログをリアルタイムで監視させる。
特に芸も無く、ループで回すだけだ。
[sourcecode language='sh']$a = 0

$ew = new-object system.management.ManagementEventWatcher
$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"

do
{
$e = $ew.WaitForNextEvent()
$e.TargetInstance
}
while ($a -ne 1)
[/sourcecode]

While にずっと達成できない条件を指定して、ずっと回ってもらう。
 
これをPSプロンプトに流すと、Whlieの後で、カーソル点滅。 最後はDoの>>が消えるまでEnterの入力が必要。
 

--snip--
>> $e.TargetInstance
>> }
>> while ($a -ne 1)
>>
_←点滅カーソル

 

さて、この状況でほっといてみよう、EventCreateで試してもいい。
Vistaでやっていたら、意外と色々ログが上がって来て面白かった。
 
 

おわりに


さて、これをやってどうするか。
イベントをキャッチして、mixi や wassr に投稿するBotも捨てがたいが、通常は警告(Warning)、エラー(Error)もしくは特定のイベント発生を管理者に通知したい。
手段として妥当なところでは、メールだろうか。
 

今度はメール通知部分をくっつけてみよう、起動はタスクマネージャからだな。
 

2009年6月11日木曜日

WindowsServer2003、SP1のサポートは2009年4月で終わってる

今月もMicrosoftUpdateの時期が来たわけだが、ある所から『WindowsServer2003のSP1 にパッチが落ちてこないよー』、と聞こえてきた。
 

マイクロソフト プロダクト サポート ライフサイクル を見ると...
 
製品名 / サービス パック サポート終了日
Windows Server 2003 Service Pack 1 / 2009/04/14

 

アラヤダ、先月はサーバ用のパッチが無かったので気づかなかったのね。
 
 

という事で、SP1の状態ではもうパッチが落ちてきませんよー。

Nagios に pnp を合体させたが、グラフだけ出なかった

適当に新規でインストールした CentOS5.3 に、Nagios と アドオンのグラフツール pnp (pnp4nagios) を入れてみた。
 

公式のドキュメントどおりに、Bulk Mode with NPCD でセットアップ、rrdtoolをフェッチするとちゃんと値が入ってるのを確認したので、WEBから見に行ったらグラフが出ない。。。
 
 

httpdのエラーログを見たらフォントがネーヨだって。

No fonts found; this probably means that the fontconfig
library is not correctly configured. You may need to
edit the fonts.conf configuration file. More information
about fontconfig can be found in the fontconfig(3) manual
page and on http://fontconfig.org

 


ああ、 rrdtool がグラフ書くには、フォントがいるんだなぁ
fc-list したら何も無い、そういえばX入れてないもの、フォント空っぽだわ。
 


とりあえずyumでghostscriptを入れといたらちゃんとグラフ出力された。
 

2009年6月9日火曜日

cron で サービス監視ワンライナー

linuxやUNIXサーバで、取り合えず起動していて欲しいサービスがある場合。
堅くやりたければ daemontools や monitやらを使い、nagiosなどで外部から監視させたい。
 
そこまで不要だけどとりあえず、って時は cron にやらせるのも手軽でアリ。
nagios プラグインと組み合わせることで意外と柔軟な設定もできる。
 
 

では linux版、pidofを使ってみる。
*/10 * * * * root /sbin/pidof hoge > /dev/null || /sbin/service hoge start
 

たとえばこんなの。10分おきにpidof を叩いて、正常終了しなかったら実行の "||" を使って エラーがあれば通知(デフォルトならroot宛)もしてくれる。
 
 


ちょっと応用して、Nagios の check_procs プラグインを使ってプロセスの状態による動作設定をしてみる。

# /usr/local/nagios/libexec/check_procs -w 1:10 -a 'httpd'
PROCS OK: 9 processes with args 'httpd'


check_procs の結果コードは 正常終了が0・Warningが1を返すので、そのまま "&&" や "||" に渡せばOK。
例ではhttpd のプロセス数が 1から10 の間に入ってないとWarning だ。
 
 

ほかにも、check_http で応答が悪かったら、再起動するなり止めるなりするという使い方もできそうだ。
(止める場合は、適当にsleep コマンドをはさんで再開なども)
 

Solarisでも使える、(check_procはコンフィグオプションがややこしいが動作はする)、その場合は service を svcadmに変えればよい。
 
 

で、用があるので IRCプロキシの tiarra を監視した。
*/15 * * * * root /usr/local/nagios/libexec/check_procs -w 1:5 -a 'tiarra' >/dev/null || /usr/bin/screen -d -m /usr/l
ocal/tiarra/tiarra --config=/usr/local/tiarra/tiarra.conf

 

tiarra は daemon で動かしたかったんだけど、制御端末からうまく切り離せなかったので断念。 daemon 関数で普通に呼ぶだけじゃ無理なんかな?
 
ってことで、15分おきに tiarra 関連プロセス数が 1-5 の間にあるかチェック、無かったらscreen のデタッチ退却モードで tiarra を動作させるという仕組みで作成。
 

軽くテストはしたので多分動くと思うが、、まだ事故でtiarraが止まってないのでどうなるか。
 
 

プラグインでなくても、「ps -eo 'comm args」の出力辺りから何とかできないかなあ。
 

Solaris10、sdの番号割当をリセットする

Solars10を使っていて、某SCSIのディスクデバイスをつけたりはずしたりしていたら、インスタンス番号※が徐々に増えていった。
※sd00 の 00部分
 

sd90 を超えてきたので、いくらなんでも気持ち悪いと思い、リセットすることにした。
 
 


確認のため、"/etc/path_to_inst" を見るとずらずらとインスタンス定義振られているのがわかる。
 

さてどうしたものかと、マニュアルをちらちら読んでもリセットのやり方がよくわからん。。。
"devfsadm -C" ? ーCオプションはクリアとあるが、"path_to_inst" は特に変化無し。
 
 

で、「Open Solaris and Solaris 10 Forums」見つけた情報。
http://www.solarisforums.com/e107_plugins/forum/forum_viewtopic.php?421
 

消せってか、こいつはシンプル。
 
 

という事で、"/etc/path_to_inst" のバックアップを取った後、中身を空っぽにして再起動してみた。
 

起動中に現れたメッセージには。。。
--snip--
WARNING: /etc/path_to_inst empty or not found
NOTICE: rebuilding device instance data
--snip--

 

OK、うまくいった。
このファイルがおかしいと、平気でSolarisが起動不能に陥るので十分に注意が必要だ。
(失敗したら?OpenSolarisとかをCD起動して、バックアップから直してあげればOK、…多分)
 

かくしてsd90~のデバイスたちはsd1,sd2に若返りするさせることが出来た。
ついでにZFSのデバイスとしては、SD番号が変わるのに何の問題も無い。GUIDがあるから

2009年6月2日火曜日

Gratuitous ARP を捕まえて 機器に設定されたIPアドレスを見る

使っていなかった機器が倉庫から出てきた。
設定など見ようとしたが、IPアドレスの設定情報が無い。
 
 

手元のPCとその機器を適当なスイッチに接続、PC側でWireshark を起動して機器を起動する。
※スイッチは念のため社内LANからは切り離そうね。
 

[caption id="attachment_1339" align="alignnone" width="300" caption="画像:Gratuitous ARPの取得"]画像:Gratuitous ARPの取得[/caption]
 

Gratuitous ARP を飛ばしてくれたのでIPアドレスが判明した。
DHCPなこともあるが。
 
 

linuxがあれば"tcpdump arp" で事足りる。