2008年10月20日月曜日

使用していないハードディスクを積極的にスピンダウンするには

24時間稼働させるサーバでは、ハードディスクは原則24時間稼働させなければいけません。しかし、ハードディスクは内部にモータやヘッドなどのメカを持っており、動かしておくということは電力の消費、発熱、騒音を発するということになります。

LinuxのATAドライバでは、 hdparm コマンドを利用すると、ディスクアクセスが少ないときに積極的にスピンダウンさせることができます。

/sbin/hdparm -S 60 /dev/sdb

制御対象のディスクは/dev/sdb, -S オプションのパラメータとして、スピンダウンまでのアイドル時間(5秒単位)を指定します。60を指定した場合、60秒*5=300秒、つまり5分間アイドルの状態になったらディスクをスピンダウンさせます。

実際には、ファイルやディレクトリの読み書き、アクセス時間(atime)の更新などさまざまな操作がI/O発生の要因になります。特にライト要求は、Linuxでは原則5秒ごとにコミットされるため、I/Oが発生してから5秒以内にスピンアップしてしまいます。スピンアップしてしまう要因をきちんと取り除かなければ、スピンダウンとスピンアップを繰り返しディスクを痛めることにもなり得ますので注意が必要です。また、経験上ハードディスクは回しっぱなしの状態が一番安定すると言えます。スピンダウンを積極的に行うこと自体がライフタイムに影響すると考えられます。このため、メリットとデメリットは意識した上で検討しなければなりません。


積極的なスピンダウンを行うためには、以下のような点を検討するとよいでしょう。


  • ファイルシステムのオートマウントを有効化し、普段はアンマウント状態としておく

  • アクセス時間(atime)の更新を抑制するために noatime オプションをつけてファイルシステムをマウントする

  • ディスクの利用目的を明確化し、I/Oをコントロールする
    例1)バックアップ用ディスクは毎晩4:00にマウントし、バックアップ終了後アンマウントする
    例2)MP3プールをシステムディスクと分離しておき、オートマウントする構成にしておく

    例3)参照メインであれば、ライト操作を防止するため、普段は可能であればroマウントにしておく
    などなど...


2008年10月15日水曜日

Firefox 3 で、検索バーの結果は新しいタブに表示したい

Sleipnir をしばらく使っていた身としては、 Firefox 3 に乗り換えると気になるのが『検索バーでの検索結果が、今見ているタブに開かれてしまう』ことです。Slepinirでは新しいタブとして検索結果を開いてくれるのですが....

この挙動を変えるには、 about:config を開き、 browser.search.openintab を true に設定するとよいようです。

ただし、 Tab Mix Plus を有効化している場合は、アドオンの「タブを開く」タブページの中に、検索バーを新しいタブで開くためのチェックボックスがあります。


その他、デフォルトの検索バーの機能を置き換えるタイプのプラグインを導入している場合は、プラグイン側に設定がないか探してみるといいかもしれません。


2008年10月14日火曜日

邪魔なソフトウェアRAIDのシグネチャを消去する

ML110 G5 の Serial ATA ソフトウェア RAID など、 Linux dmraid で認識できる RAID を設定すると、たとえ BIOS レベルで RAID を削除しても dmraid がシグネチャを検出してしまい、 OS インストール時に支障が出ることがあります。

いちばんてっとりばやいのはディスクを /dev/zero で埋めてシグネチャを消してしまうことですが、これには時間がかかります。 シグネチャがディスクの終端にあることがわかっていれば、以下の方法でほぼピンポイントで dd をかければ解決です。

まず、ディスクの正確なサイズを調べておきます。

# fdisk /dev/sda

このディスクのシリンダ数は 19457 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

...

ディスクのセクタサイズは 512 バイトですので、160041885696÷512=31251808セクタ存在することがわかります。このディスクの終わりの部分だけを削除するには、以下のとおりコマンドを入力すると

dd if=/dev/zero of=/dev/sda bs=512 seek=31258100
dd if=/dev/zero of=/dev/sdb bs=512 seek=31258100

とすれば、3125100~31258107セクタの8セクタが/dev/zeroで塗りつぶされ、dmraidが勘違いするシグネチャを葬り去ることができます。

この操作は Anaconda をインストーラとして利用する Red Hat 系のディストリビューションであれば、インストール作業中の仮想コンソールから行えます。ただし、 dmraid の認識を解除するためには、作業後に一度インストーラをリブートする必要があります。





2008年10月10日金曜日

とりあえずLinuxをクラッシュさせる方法

Linuxで構築したシステムの動作検証などを行っている場合にシステムをクラッシュさせる方法としては、電源をブッチ切りするという単純な手もありますが、電源オフは稼働中のハードディスクが突然スピンダウンし障害の原因となります。代替となる方法としては、ほかにシステムをリセットするなどの手もありますが、最近のハードウェアでは必ずしもリセットボタンが付いていないため確実な手ではありません。

上記の代替として Linux では SysRq キーにより OS をクラッシュさせたりコアダンプを取得するための機能がありますので、これを使ってコマンドだけでクラッシュさせることができます。

# echo o > /proc/sysrq-trigger; halt -f
※echo する文字は オー(小文字)

この方法であればカーネルが即時クラッシュし停止するため(しくみについてはLinux日記2004: LKCD 診断(Mon Sep 27 2004)などを参照)、シングル構成のサーバだけでなく、SCSIなどで共有バスをもつようなシステムでも、予期せぬシステムダウンを再現できるなど有用です。




2008年9月20日土曜日

Linuxの起動後画面をオリジナルに置き換える

Linuxの起動完了後、たとえば Debian GNU/Linux 4.0の場合なら以下のような画面が表示されます。

Debian GNU/Linux 4.0 debian tty0

debian login:

しかし、サーバとして利用する場合、自分のクライアントPC内にサーバ用途の仮想PCを起動しておく場合など、IPアドレスの設定値やディスクの使用量などが常に表示されていたら便利ではないでしょうか?

Linux の場合、このログインコンソールは /etc/inittab の以下の設定値に基づいて出力されています。

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

上記は、tty1(最初の仮想コンソール)ではランレベル1~5においてgettyにログイン待ち受けをするよう、またtty2~6(Alt-F2~F6で切り替え可能な仮想コンソール)ではランレベル2, 3においてgettyにログイン待ち受けをするように指示しています。そして先に示したログインプロンプトは、このgettyが実際に実行され表示しているものです。

この画面を自分のお気に入りステータス画面に置き換えてみましょう。ためしに/root/console.shとして以下のスクリプトを作成します。chmodコマンドで+xしておくことを忘れずに。

#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

while true; do
        date
        uptime
        echo
        ifconfig eth0
        echo
        df -h | egrep  '^/'
        echo

        sleep 3
        clear
done

そして、tty2(Alt-F2で表示可能な仮想コンソール)にこのスクリプトを割り当てます。/etc/inittab 2: ではじまる行に -n (ログインユーザ名を尋ねない), -l (ログインプログラム)を追加します。

2:23:respawn:/sbin/getty -n -l /root/console.sh 38400 tty2

設定を終えたら、システムを再起動するか、 init 1 でシングルユーザに落ちた後いに init 2 を実行しマルチユーザで起動しなおしてください。その後コンソール Alt-F2 を押下すると、先に作成したスクリプトが動作していることがわかります。

今回は tty2 に設定を行ったため、起動後に裏側の仮想コンソールでスクリプトの結果が表示されていますが、tty1 に設定を行えば起動直後に結果が表示されます。

 

これにより、ログインせずとも、仮想コンソール上に常時システムの状態が表示されるようになりました。個人利用であればこの方法は便利ですが、しかし、本来であれば認証を受けた者のみが確認出来る内容が、物理的アクセス可能な全ての者に許されることになりますので、IPアドレスやディスクの利用率情報などを表示させるような場合はそのリスクを勘案した上で行ってください。逆にとらえれば、この方法であれば、ログイン権限を与えずに、注視すべきステータス情報をモニタさせることができる、というメリットがあります。



2008年9月10日水曜日

Thunderbirdで全てのIMAPフォルダを常に表示する

Thunderbird 2.0 で IMAP を利用する場合、全てのIMAPフォルダは表示しない設定がデフォルトのようです。しかし、私の場合、サーバ側の procmail や自作スクリプトにより、メーリングリストごとに自動的にフォルダを作成し仕分けする仕組みを作っていますので、購読されていないフォルダもどんどん表示されていないと困ります。


そこで、 Thunderbird 2.0 で常にすべての IMAP フォルダを表示する設定について探したところ、以下の場所にありました。


アカウント設定 ≫ サーバ設定 ≫ 詳細 ≫ 購読しているフォルダのみ表示する


随分悩んだ…。


2008年9月1日月曜日

リモートのrsyncをsudoと組み合わせてrootで動かす

rsync は2ホスト間のファイル同期に便利なソフトウェアですが、伝送路として SSH のコネクションを使用する場合、リモート側で読み書きできるファイルはリモートのログインに使用したアカウントの権限に依存します。このため、ファイルのパーミッションなどを全て保持したまま全てのファイルをコピーしようとするとリモートに root でログインしなければなりませんが、 /etc/ssh/sshd_config に以下の設定がされていると、素直には目的を実現できません。


PermitRootLogin no


このような場合の回避策として、SSHログイン可能なアカウントでリモートにログイン後、sudoを使うことでrsyncを昇格させる手が使えます。


具体的な手順については mhagroot 権限の必要なディレクトリに対してrsync するにまとめてくれました。


2008年7月11日金曜日

SmartArray E200 の障害検知

HP ProLiant ML110 G5 に搭載した SmartArray E200 コントローラのステータスを監視するために HP Array Configuration Utility CLI (hpacucli) を入れてみました。


本当な HP 社製サーバの場合は System Management Homepage 等をインストールし設定すれば終わりなのですが、廉価なサーバである HP ProLiant ML110 G5 では SMH が利用できません。このため、 SMH を利用せずに、 CLI ベースでアレイの状態を確認できるツールを利用して定期的にアレイのステータスを確認する方針とします。


HP ProLiant ML110 G5 + CentOS 5.1 (x86版) + SmartArray E200 の構成で作業しました。


今回ダウンロードしたのは hpacucli-8.10-2.noarch.rpm (2.96 MB)です。


# wget ftp://ftp.hp.com/pub/softlib2/software1/pubsw-linux/p414707558/v47111/
  hpacucli-8.10-2.noarch.rpm
# rpm -i hpacucli-8.10-2.noarch.rpm


使い方1: システム上のコントローラ情報を取得する


# hpacucli ctrl all show

Smart Array E200 in Slot 4    (sn: xxxxxxxxxxxxx)


使い方2: コントローラ上の論理ボリューム情報を取得する


# hpacucli ctrl slot=4 array all show

Smart Array E200 in Slot 4

   array A (SAS, Unused Space: 0 MB)


使い方3: コントローラ上の物理ドライブ情報を取得する


# hpacucli ctrl slot=4 pd all show

Smart Array E200 in Slot 4

   array A

      physicaldrive 1I:0:1 (port 1I:box 0:bay 1, SAS, 300 GB, OK)
      physicaldrive 1I:0:2 (port 1I:box 0:bay 2, SAS, 300 GB, OK)
      physicaldrive 1I:0:3 (port 1I:box 0:bay 3, SAS, 300 GB, OK)
      physicaldrive 1I:0:4 (port 1I:box 0:bay 4, SAS, 300 GB, OK)


ただ、毎日ステータスを確認するわけにもいかないので、スクリプトで自動的に障害を検出できるようにしてみます。状態の判断は以下の2ポイントで行うことにしました。


  • OK の表示が正常なドライブの数が期待値と一致すること


  • failed の表示が存在しないこと


ふたつめの条件は、ドライブに障害が発生した場合に ??? GB, failed) などと出力されるようなので(ドキュメントを参照のこと)、障害を示す failed の文字列で引っかけています。ただし今回のサーバは実際にサービスを提供するため、万が一 failed で引っかからない場合のことを考え OK の表示が 4 行あることも併せて確認する方針としました。論理式では以下のとおりです。


障害 = OKの数がドライブ数と不一致 || failedの数がゼロ以上


上記判断を行い、異常が認められた場合にメールを送信するスクリプトを以下に示します。


#!/bin/sh
SUBJECT="XXX.example.jp RAID Array Status Alert"
MAILTO=hasegaw@exmaple.jp

PATH=/sbin:/bin:/usr/sbin:/usr/bin

OK_DRIVES=`( hpacucli ctrl slot=4 pd all show 2>&1 ) \
  | grep 'OK' | wc -l`
FAILED_DRIVES=`( hpacucli ctrl slot=4 pd all show 2>&1 ) \
  | grep 'failed' | wc -l`

FAILED=0

# 正常状態の物理ドライブ数をカウントする
if [ $OK_DRIVES -ne 4 ]; then
 FAILED=1
fi

# failed と表記された物理ドライブ数をカウントする
if [ $FAILED_DRIVES -ne 0 ]; then
 FAILED=1
fi


# ドライブの異常が確認できない場合
if [ $FAILED -eq 0 ]; then
 exit
fi

# メールを生成する
ACULOG=`( hpacucli ctrl slot=4 pd all show 2>&1 ) `
cat <<EOF | mail -s "$SUBJECT" $MAILTO

OK=$OK_DRIVES, FAILED=$FAILED_DRIVES
$ACULOG

EOF

プリンタを自動設定するバッチファイル

Windows のプリンタ設定って一台二台の世界ならよいですけど、情シス部門の立場で大量に設定しないといけない場合はメンドクサイですよね。 Active Directory があればそれでもまだマシなのですが、 AD がない場合は本当に全マシンにプリンタドライバを配布してまわったりしないといけませんし。

私は仕事でクライアントPCに5~6個のプリンタを設定してまわったりすること等があるのですが、そのときには以下のようなバッチファイルを流して楽をしてます。処理の自動化によりプリンタの設定漏れを防げますし、プリンタ名なども標準化が楽でよいです。

set PRNPORT_CMD=cscript %SystemRoot%\System32\prnport.vbs

%PRNPORT_CMD% -a -o raw -n 9100 -h mpc6000.example.jp -r IP_TOKYO_mpc6000

rundll32 printui.dll,PrintUIEntry /if /m "RICOH imagio MP C6000 RPCS" \
/f "DRV_MPC6000\RC92D12K.INF" /b "mpc6000(東京)" /r "IP_TOKYO_mpc6000"

prnport.vbs の場所については適宜適切な場所を設定してください。なおこの例は Windows XP Professional を想定しています。 Windows XP Home だとこのスクリプトが存在しないかもしれませんが、その場合はどこかの Windows XP Professional マシンからコ(ピー)してこれば一応大丈夫です。

Vista の動作は未確認です。



2008年7月9日水曜日

CentOS5 + mdraid + mondorescue → 復元失敗

最近、 mondorescue でのディザスタリカバリを研究しています。

VMware や ML115 G1 の SATA インターフェイス、その他 Hewlett Packard 製の SmartArray コントローラとの組み合わせでテストを行っていますが、Linux の md raid ドライバと組み合わせても nuke だけで復旧できるか検証してみました。N700系新幹線万歳。

結果は...

080709a

orz

まぁ Linux 2.4 系なら大丈夫だとか、何か条件があるのかもしれません。


2008年7月6日日曜日

RHEL/CentOS インストール時のパーティーション作成小技(3)ネットワークを通してファイルをダウンロードする

fdisk等のコマンドラインツールでパーティーションを作成するsfdiskを使ってパーティーション構成をコピーすると小技シリーズを続けてきましたが、今回はネットワークを通してファイルをダウンロードする方法を紹介します。


PXEブートによるキックスタートを行う場合などでは、RHEL/CentOS のインストーラ実行中は NIC に IP アドレスが割り当てられた状態となっています。また、この際、実は wget などのアプリケーションを利用できます。


このため、たとえば sfdisk で使用するための part.txt を Web サーバ上に置いておけば、以下のようなアクションが可能です。


# wget http://192.168.100.1/~osinstall/part.txt | sfdisk /dev/sda


このコマンドでは、指定された URL にある part.txt の内容を使って /dev/sda の上にパーティーションを作成しています。多数のノード上に同じパーティーション構成を展開したい場合には、この方法は非常に有効です。


ネットワーク キックスタートを使わない場合は、 NIC には IP アドレスが割り当てられていません。この場合には wget などのコマンドを利用する前に NIC を立ち上げる必要があります。 Web サーバが同じセグメント上にいて、利用できる仮アドレスが明確であれば、以下の要領で立ち上げることが可能です。


# ifconfig eth0 192.168.100.3 netmask 255.255.255.0 192.168.100.254


指定しているIPアドレスは順に、(1)ノードに割り当てるIPアドレス (2)サブネットマスクの値 (3)デフォルトゲートウェイ です。その他名前解決で Web サーバを指定したい場合は /etc/resolv.conf の設定も必要となるでしょう。


RHEL/CentOS インストール時のパーティーション作成小技(2) sfdiskを使ってパーティーション構成をコピーする

fdisk等のコマンドラインツールでパーティーションを作成する では、 RHEL/CentOS のインストーラ動作中に fdisk を使ってパーティーショニングする方法について解説しました。今回は、 fdisk ではなく sfdisk を使ったパーティーショニングが可能です。


以下に sfdisk の簡単な使い方の例を示します。


# sfdisk -d /dev/sda > part.txt
    … (1)/dev/sda のパーティーション情報を part.txt に出力
# cat part.txt | sfdisk /dev/sda
    … (2)/dev/sda に part.txt のパーティーション情報を書き込み
# sfdisk -d /dev/sda | sfdisk /dev/sda
    … (3)/dev/sda のパーティーショテーブルを /dev/sdb にコピー


この方法はもちろんインストール後の OS 上でも利用できますが、 RHEL/CentOS のインストーラ上でソフトウェア RAID を構成した場合にも非常に便利です。以下に、 sfdisk と md を利用したソフトウェア RAID を使ってパーティーショニングする例を示します。


  • RHEL/CentOS のインストーラ GUI 上で Ctrl-Alt-F2 を押して仮想コンソール上のシェルに落ちる


  • 一台目のハードディスクのパーティーションテーブルを作成する
    fdisk /dev/sda


  • 二台目のハードディスクに、一台目のハードディスクのパーティーションテーブルをコピーする
    sfdisk -d /dev/sda | sfdisk /dev/sda


  • Ctrl-F6 を押して、 GUI インストーラに戻る。必要であればパーティーション構成画面にて「リセット」ボタンを押し、最新のパーティーションテーブルをリロードする


  • 一台目、二台目のハードディスクに同一サイズのパーティーションが同一構成で作成されているので、RAID 設定を行い RAID-1 で論理保護されたパーティーションを作成する


RHEL/CentOS インストール時のパーティーション作成小技(1) fdisk等のコマンドラインツールでパーティーションを作成する

RHEL/CentOSでパーティーションを作成する場合は基本的にインストーラのGUI画面でパーティーション構成を設定するかと思いますが、パラメータシートなどを基にパーティーションを構成したい場合には、このGUIが厄介なモノとなることがあります。


具体的には、GUI画面では、パーティーション番号を指定してパーティーションを作ることができません。/bootは第1パーティーション、swapは第2パーティーション、ルートは第三パーティーション、…などと決めていても、GUIツールでは「このパーティーションはプライマリパーティーションにすべきかどうか」しか指定できず、インストーラによりパーティーション番号を入れ替えられてしまったりすることがあります。


これを回避する方法として、インストーラではパーティーションを作成せずに、他のツールでパーティーションテーブルを作成しておき、インストーラからは各パーティーションの使い方(マウントポイント、ファイルシステムの種類)だけを指定する方法があります。


もちろん knoppix のような 1CD Linux を利用してもよいのですが、 CentOS/RHEL のインストーラでは Ctrl-Alt-F2 で仮想コンソールのシェルに落ちることができますので、このシェル上から fdisk コマンドを利用してパーティーションすることができます。ファイルシステムタイプ(83 = Linux, 82=Linux swap, 7e=Linux LVM, fd=Linux RAID)まではfdisk上で済ませておくと後がラクチンです。


fdisk でパーティーショニングを済ませたら Alt-F6 でインストーラの GUI 画面に戻り、作業を続行します。インストーラが fdisk 前の古いパーティーションテーブルを認識している場合は、「リセット」ボタンを押すと、その時点のパーティーション構成が GUI 上に表示されます。fdiskで作成したパーティーション構成が画面上に表示されたら、各パーティーションに対してマウントポイントやファイルシステムの種類について設定を行ってください。


2008年7月5日土曜日

ホスト間のRPMパッケージのインストール差異を知る

Linuxで2台以上のRPMパッケージの差分を調べるときは、以下のコマンドが便利です。


 rpm -qa --qf "%{NAME}\n"


このコマンドではRPMバージョンを含まない、RPMのパッケージ名のみが標準出力に出力されます。



■ rpm -qa --qf "%{NAME}\n" | sort の出力例
4Suite
Canna
Canna-libs
FreeWnn
FreeWnn-libs
GConf2
MAKEDEV
NetworkManager
ORBit2
Omni

■ rpm -qa | sort の出力例
4Suite-1.0-3
Canna-3.7p3-7.EL4
Canna-libs-3.7p3-7.EL4
FreeWnn-1.10pl020-5
FreeWnn-libs-1.10pl020-5
GConf2-2.8.1-1.el4
MAKEDEV-3.15.2-3
NetworkManager-0.3.1-4.el4
ORBit2-2.12.0-3
Omni-0.9.1-7.1

2ホスト間のパッケージ差異を、RPMバージョンを無視して比較したい場合は、例えばSSHを使って以下のように作業します。

node1$ rpm -qa --qf "%{NAME}\n" | sort > rpms.node1
node1$ ssh node2 'rpm -qa --qf "%{NAME}\n" | sort' > rpms.node2
node1$ diff -u rpms.node[12]

node2には入っているけどnode1に入っていないパッケージをyumで追加する場合は

diff -u rpms.node2 rpms.node1 | grep '+' | grep -v ' ' | echo xargs yum install

としてコマンドラインを生成し、確認後 echo を外すと yum でパッケージをまとめて install できます。

2008年6月20日金曜日

LinuxマシンのGRUB MBR復旧にはGRUB CDを

デキの悪いバックアップ ソフトウェアなどにより、MBRの復旧に失敗してリカバリが不完全に終わった場合は、 CDブート可能な GRUB で以下の作業を行うと復旧できる事が多いです。

root (hd0,0)  … (1)
setup (hd0)  … (2)

(1) では、 GRUB のファーストステージ、セカンドステージおよび menu.lst ファイルがあるパーティーションを指定します。 (2) では、 GRUB をインストールするディスク、もしくはパーティーションを指定します。

私は、Red Hat Enterprise Linux 3 までであれば、 GRUB の再インストールはレスキューモードから行っていましたが、 EL4 から udev の採用により "おまじない" が増えて大変になってしまいました。もちろんいざという的にはレスキューディスクを使った復旧作業を行うのですが、考えることが増えるため、最近は素直に CD ブート可能な GRUB を利用しています。この方法であれば有る程度作業内容を簡略化できますので、他のエンジニアやオペレータへの引き継ぎも比較的容易となります。


ループバップアダプタとSSHポート転送で透過のような通信を確保する

SSHのポートフォワーディングを利用すると、直接経路がないホストのポートまでも、手軽に TCP 経路を確保できます。他ネットワークのゲートウェイまで SSH を接続し、ポートフォワーディングを利用してプライベートなサービスへのアクセスを確保する方法は、皆さんもよく利用されているのではないでしょうか。


例:手元のホストから辿りつけないホストのIPアドレス


192.168.30.1 :  destination1
192.168.30.2 :  destination2
192.168.30.3 :  destination3
192.168.30.4 :  destination4


例:destinaion1~4に辿りつける remotehost を経由した SSH ポートフォワーディング


Host remotehost
   LocalForward 11000 destination1:1000
   LocalForward 12000 destination1:2000
   LocalForward 21000 destination2:1000
   LocalForward 22000 destination2:2000
   LocalForward 31000 destination3:1000
   LocalForward 32000 destination3:2000
   LocalForward 41000 destination4:1000
   LocalForward 42000 destination4:2000


しかしこの方法では実際に connect() する際の宛先IPアドレス・ポート番号の両方、もしくは片方がかわってしまい、透過的とはいえません。


SSHで何段もポートフォワーディングしなければたどり着けないホストや、例えば IRC の DCC コネクションなどのように、プロトコル中に IP アドレスが含まれていたり、 Web ページの中にホストの IP アドレスが入るケースでは透過的な通信を確保したいケースもあります。


ここで、手元のホスドのループバックアダプタなどに接続先のホストのアドレスを割り当て、バインド先としてIPアドレスとポートを明示的に指定しポートフォワーディングを行うと、TCPのあらかじめ指定したポートだけでも、まるで透過的なようにアクセスできます。


例:ループバックアダプタと組み合わせて利用する SSH ポートフォワーディングの例(~/.ssh/config ファイルの例)


Host remotehost
   LocalForward 192.168.30.1:1000 destination1:1000
   LocalForward 192.168.30.1:2000 destination1:2000
   LocalForward 192.168.30.2:1000 destination2:1000
   LocalForward 192.168.30.2:2000 destination2:2000
   LocalForward 192.168.30.3:1000 destination3:1000
   LocalForward 192.168.30.3:2000 destination3:2000
   LocalForward 192.168.30.4:1000 destination4:1000
   LocalForward 192.168.30.4:2000 destination4:2000


なお、ループバックアダプタに 192.168.30.0/24 をアサインしている場合、本来 destination1~4 のセグメントにルーティングができるネットワーク上に移動したとすると、このループバックアダプタが邪魔をして通信に支障をきたします。このような場合には、 Windows の場合はアダプタ単位で無効化することで回避でき、具合がいいでしょう。


2008年5月22日木曜日

cacls.exe コマンドでディレクトリのACEを編集する

NTFSのディレクトリのアクセス権といえばプロパティから編集するものですが、 cacls.exe から編集することもできます。


本日アクセス権を編集しようとしたサーバでは、プロパティ画面が無応答になってしまう現象が出たので、 cacls.exe を使って ACE を書き足してみました。 e:\shared にアクセスさせたくないユーザを登録するための アクセス禁止グループ を作成後、コマンドラインより以下のコマンドを入力します。


X:\> cacls e:\shared /E /D "アクセス禁止グループ"
processed dir: e:\shared


/E は既存の ACE を残す(Edit)、 /D は指定したオブジェクトに対する拒否エントリを作成する(Deny)オプションです。 /E を忘れるととっても痛い思いをするので注意しましょう。


2008年5月21日水曜日

でかいファイルをDVD-Rに記録する

Red Hat Enterprise Linux 5 でデカいファイルをとりあえず DVD-R に記録する方法を探していたのですが、 growisofs コマンドを用いるのが楽なようです。 growisofs を使用すると DVD-R に簡単にオンザフライ書きこみを行えます。

# growisofs -dvd-compat -Z /dev/hda -r -l \
-x ~/image \
~/image/bigfile

上記コマンドで ~/image/bigfile のみを DVD-ROM に記録します(ファイル名は複数指定することもできます)。ディレクトリ構成は -x でルートにしたいディレクトリを指定していますので、 bigfile は ISO イメージ的には ISO イメージのルート直下に置かれます。

-Z /dev/hda は使用する DVD-R ドライブの指定です。 -r -l は RockRidge Extension で、ロングファイルネームを許容するために必要です。



2008年5月20日火曜日

W32Timeサービスの時刻同期機能をオフにする

Windows xp, Vista や Windows Server には、時間を管理するための W32Time サービスがあります。 W32Time サービスは以下の役割を持っています。


  • 別システムの時刻を取得し、自システムの時刻を取得した時刻に合わせる


  • サーバとして、別システムからの時刻問い合わせに応答する


ハードウェアレベルで仮想化を行う仮想マシン技術の場合 - たとえば VMware では、時刻同期は VMware Tools に含まれる時刻同期アプリケーションが用意されています。しかし、 W32Time サービスと VMware Tools の時刻同期機能を同時衝突しておもわぬ誤動作をすることがあります。


この問題を解決するには、 W32Time のクライアント機能を停止するか、 VMware Tools の時刻同期機能をオフにするかのどちらかが必要となります。


システムを Active Directory のドメインコントローラとして利用する場合など、 W32Time サービスが必須の場合があります。このようなケースでは、 W32Time サービスのレジストリ値を書き換えることで、自システムの時刻同期機能のみをオフにすることができます。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"Type"="NoSync"

上記とおりレジストリ値を変更の上、W32Timeサービスをリスタートします。なお、 Type が "NTP" (デフォルト値)の場合には Network Time Protocol を用いて時刻同期を行います。

W32Time サービスの詳細については以下のドキュメント(Microsoft Word形式)が参考になります。

The Windows Time Service By Shala Brandolini and Darin Green, Microsoft Corporation
Published: April 2001


2008年5月17日土曜日

BLADE3.0祭@仮想化友の会

5/16は久々に仮想化友の会の勉強会でした。

お題はブレードサーバ。会場には HP BladeSystem c3000 があって、各自持ち込んだ CD-ROM 等からブレードに OS を iLO2 でインストール大会。しかしネットワーク負荷的な事情によりほとんどの人がOSインストールを達成できずに、50インチのプラズマテレビでニコニコ動画を見たりとか色々と gdgd でした。(悪いことだとは思ってないんですが)

個人的には HP BladeSystem の管理画面や、ハードウェアを実際にいじる機会に恵まれたので、それだけでも満足。私自身は Windows Server 2008 をブレードにインストールしていましたが、ファイルの展開 81% でタイムイズオーバー、とっても残念。できたら Hyper-V 動かしてみたかったんだけどなー。


2008年5月16日金曜日

どこかのマシンにぶら下がっている共有を特定のドライブにマップするVBScript

USBハードディスクを複数のPCで共有しているときに、どのマシンからでも同じドライブレターで共有をマップできるツールを VBScript で書いてみました。


USBハードディスクが \\pc1\共有 もしくは \\pc2\共有 のどちらかとして共有されるシチュエーションを想定し、 \\pc1 もしくは \\pc2 のどちらかに共有が見つかればドライブをマップします。この際、目的のドライブレターに他のネットワーク共有をマップされていたら、その共有は切断した上でマップしなおします。


利用する場合は、特に DoMount() をニーズにあわせて書き直してください。正直なところエラーチェックやテストは不十分です。VBScript自体、ここ数年間で2つしか作ったことがないので、中身にあまり期待はしないでください...


Option Explicit
'On Error Resume Next

If DoMount Then
 WScript.Echo "フォルダを S: にマウントしました。"
Else
 WScript.Echo "フォルダをマウントできなかったようです..."
End If

Function DoMount
 If TryToConnect("S:", "\\pc1\共有") Then
  DoMount = True
 ElseIf TryToConnect("S:", "\\pc2\共有") Then
  DoMount = True
 Else
         DoMount = False
 End if
End Function

Function IsShareExist(ShareName)
 Dim objFSO

 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
 IsShareExist = objFSO.FolderExists(ShareName)

End Function

Function TryToConnect(Drive, ShareName)
 TryToConnect = False

 If IsShareExist(ShareName) Then
  TryToConnect = DoMapNetwork(Drive, ShareName)
 End If
End Function

Function DoMapNetwork(strDrive, strPubFolder)
 Dim objWshNetwork
 Set objWshNetwork = WScript.CreateObject("WScript.Network")
 Dim CurrentMapped

 DoMapNetwork = False
 CurrentMapped = GetMapNetwork(strDrive)
 If CurrentMapped = strPubFolder Then
  DoMapNetwork = True
  Exit Function
 ElseIf CurrentMapped <> "" Then
  objWshNetwork.RemoveNetworkDrive strDrive, True
 End If

 objWshNetwork.MapNetworkDrive strDrive, strPubFolder
 DoMapNetwork = (Err.Number = 0)
End Function

Function GetMapNetwork(strDrive)
 Dim WshNetwork, oDrives, i
 Set WshNetwork = WScript.CreateObject("WScript.Network")
 Set oDrives = WshNetwork.EnumNetworkDrives

 GetMapNetwork = ""
 For i = 0 to oDrives.Count - 1 Step 2
  If strDrive = oDrives.Item(i) Then
   GetMapNetwork = oDrives.Item(i + 1)
  End If
 Next
End Function

2008年5月15日木曜日

VMware Serverへの Sarge移行および時刻同期

とある場所にて、 Windows Server 2003 に Sarge の仮想マシンを移行した。


移行対象の仮想マシンはこれまで colinux 上で動作していたものです。元々は VMware Workstation 上で作成した仮想マシンを colinux 用に変換したものでしたので、以下の手順で再度 VMware 用に変換できました。


VMware で仮想マシンを動作させる際に注意が必要な点としては 2.6 カーネルをゲストに使用すると時刻が進んでしまったり、遅れてしまったりする現象があります(このあたりはcoLinuxやXenなど、ハードウェアエミュレーションではなく準仮想化的アプローチのほうがホストとの時刻同期は正確です)。この問題については、もちろんハードウェア構成やホスト OS 構成、使用する Linux カーネルなどの条件がからむため一概には言えないようですが、 Linux カーネル時のオプション指定(※1)と VMware Tools に含まれる vmware-guestd の時刻同期機能(※2)の設定を行ったところ、今回のケースでは他のシステムと最大でも2~3秒程度のズレの範囲で維持できるようになりました(実際のところ、先走ったり遅れたりはしています...)。


nosmp noapic nolapic clock=pit    … (※1)
tools.syncTime = "TRUE"           … (※2)




【作業概要】

  • 適当な Linux ベースの仮想マシン(以後作業用VM)に、マイグレーション先の仮想ハードディスクを設定

  • 作業用VMを起動

  • 作業用VMでマシン上にファイルシステムを作成

# fdisk /dev/sdb
  ※パーティーション sdb1 (Linux), sdb2 (Linux swap) を設定
# mkfs.ext3 /dev/sdb1
# mkswap /dev/sdb2
# mkdir /mnt/new_image
# mount /dev/sdb1 /mnt/new_image

  • 作業用VMから Windows Server 2003 上の仮想マシンイメージをマウント

# mkdir /mnt/foo /mnt/orig_image
# mount -t msdos -o username=administrator //ws2003/foo /mnt/foo
# mount -o ro,loop /mnt/foo/hoge.ext3 /mnt/orig_image

  • 作業用VMにて、仮想マシンのイメージを新しいディスクイメージにコピー

# cd /mnt/orig_image; tar cf - * | tar xvf - -C /mnt/new_image

  • fstab, grub.lst などの設定見直し

GRUB起動パラメータ (Linux 2.6カーネルの時刻ズレ対策)
  kernel          /boot/vmlinuz-2.6.8-2-386 root=/dev/sda1 ro (続)
                               nosmp noapic nolapic clock=pit

  • 作業用VMからディスクイメージをアンマウントし、新しいVMにマウント

  • GRUB ISOイメージで起動し、ブートローダをインストール

  • VM起動確認

  • VMware Toolsのインストール

  • VM の .vmx ファイルに以下の設定を追加(変更)

tools.syncTime = "TRUE"

2008年5月11日日曜日

ZFSでミラーリング

ディスク2基を使ってZFSのミラー環境を作ってみました。


# zpool add -f mypool mirror c6d0s2 c6d1s2


3秒ぐらいで何も言わずに終了。続いてファイルシステムを作ります。


# zfs create mypool/nfs
# zfs crrate mypool/iscsi


各ファイルシステムは /mypool/nfs/ /mypool/iscsiにマウントされていますが、これを/export以下に移動させます。

# mkdir -p /export/nfs /export/iscsi
# zfs set mountpoint=/export/nfs mypool/nfs
# zfs set mountpoint=/export/iscsi mypool/iscsi

確認するには zfs list コマンドを使用します。

-bash-3.2# zfs list
NAME                                 USED  AVAIL  REFER  MOUNTPOINT
mypool                               705M   228G    18K  /mypool
mypool/iscsi                          18K   228G    18K  /export/iscsi
mypool/nfs                           704M   228G   704M  /export/nfs

各ストレージに対するI/Oの状況をチェックするにはzpool iostatコマンドを使用します。

-bash-3.2# zpool iostat -v
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool       804M   231G      0     18     51  1.12M
  mirror     804M   231G      0     18     51  1.12M
    c6d0s2      -      -      0     15    176  1.13M
    c6d1s2      -      -      0     15      0  1.13M
----------  -----  -----  -----  -----  -----  -----
rpool       2.29G  27.5G      2      1   156K  26.7K
  c5d1s0    2.29G  27.5G      2      1   156K  26.7K
----------  -----  -----  -----  -----  -----  -----

とりあえず試しにほかのホストからホームディレクトリを tar でコピーしてみました。この時点ではbandwidthの値がうまく分散していないようです(readがミラーのうち片方に偏っている)。試しにmypoolの中でファイルをcpしてみました。これでread, writeの操作がファイルシステムにたいし行われるはずです。

-bash-3.2# zpool iostat -v         
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool      1.11G   231G      2     21   348K  1.43M
  mirror    1.11G   231G      2     21   348K  1.43M
    c6d0s2      -      -      1     18   174K  1.43M
    c6d1s2      -      -      1     18   174K  1.43M
----------  -----  -----  -----  -----  -----  -----
rpool       2.29G  27.5G      2      1   147K  25.1K
  c5d1s0    2.29G  27.5G      2      1   147K  25.1K
----------  -----  -----  -----  -----  -----  -----

c6d0, c6d1のbandwidthが一緒になったので、どうやらリード操作がストライピングされたようだ。

ついでなので、ディスク c6d1 の電源を落としてみました。

May 11 10:53:06 opensolaris genunix: [ID 698548 kern.notice] ata_disk_start: select failed

I/O操作でブロックされ、ターミナルが反応しなくなってしまった...

mb:~ hasegaw$ ping 192.168.44.42
PING 192.168.44.42 (192.168.44.42): 56 data bytes
64 bytes from 192.168.44.42: icmp_seq=0 ttl=255 time=10081.327 ms
64 bytes from 192.168.44.42: icmp_seq=1 ttl=255 time=9081.151 ms
64 bytes from 192.168.44.42: icmp_seq=2 ttl=255 time=8081.209 ms
64 bytes from 192.168.44.42: icmp_seq=3 ttl=255 time=7081.229 ms
64 bytes from 192.168.44.42: icmp_seq=4 ttl=255 time=6081.241 ms
64 bytes from 192.168.44.42: icmp_seq=5 ttl=255 time=5075.657 ms
64 bytes from 192.168.44.42: icmp_seq=6 ttl=255 time=4075.728 ms
64 bytes from 192.168.44.42: icmp_seq=7 ttl=255 time=3075.743 ms
64 bytes from 192.168.44.42: icmp_seq=8 ttl=255 time=2075.837 ms
64 bytes from 192.168.44.42: icmp_seq=9 ttl=255 time=1075.855 ms
64 bytes from 192.168.44.42: icmp_seq=10 ttl=255 time=75.989 ms
64 bytes from 192.168.44.42: icmp_seq=11 ttl=255 time=0.896 ms
64 bytes from 192.168.44.42: icmp_seq=12 ttl=255 time=0.936 ms
64 bytes from 192.168.44.42: icmp_seq=13 ttl=255 time=0.949 ms

しばらくするとpingに応答しなくなったり、突然復活したり、という状況。これではmirrorの意味があまりないなぁ.... デバイスドライバ側の問題なのかしら。ちなみにインターフェイスはICH5です。

OpenSolaris 2008.05をインストールする

OpenSolaris プロジェクトから、はじめての一般ユーザ向けリリースとなるOpenSolaris 2008.05 がリリースされました。 OpenSolaris には ZFS などの技術で関心を持っていたので、今日はついカッとなって OpenSolaris 2008.05 をインストールしてみました。



  • OpenSolaris 2008.05 をライブCDで起動する



  • ハードウェア対応状況をライブCDから確認する



  • OpenSolaris 2008.05 をライブCDからインストールする


  • OpenSolaris はファイルサーバの構築にはかなり期待できる OS ではないかと個人的に思っています。なぜなら ZFS(Zetabyte File System) による強力なストレージ管理を利用できるためです。そのほか NFS サーバとしての運用にも向いていますし、 iSCSI ターゲットとして運用しても可です。


    OpenSolaris 2008.05 は現在 http://www.opensolaris.com/get/ からダウンロード可能です。 700MB の CD-R 一枚で、ハードディスクにOSをインストールしなくても、 CD ブートするとライブ CD として利用でき、 Device Driver Utility を使えば OpenSolaris のデバイスドライバ対応状況を確認できるなど便利です。


    ◆ opensolaris 2008.05 をライブCDから起動する

    OpenSolaris 2008.05を起動すると、以下に示す GNOME デスクトップが表示されます。デスクトップ上には Firefox や Thunderbird があり、そのほかにも GIMP をはじめ多くのアプリケーションを Live CD 上で利用できます。

    OpenSolaris LiveCDで起動したイメージ
    OpenSolaris LiveCDで起動したイメージ

    Live CD で動作している場合は、ホームディレクトリに置かれたファイルはメモリファイルシステム上に配置されます。このためシステムをシャットダウンすると失われるのは当然ですが、実装メモリ量が少ないマシンの場合はアプリケーションを複数起動したりするとメモリ不足が生じうまく動作しないことがあります。メモリ512MBのマシンでは、OpenSolarisインストーラ、GIMPを起動した状態でターミナルを起動できませんでした。

    ◆ ハードウェア対応状況をライブCDから確認する

    デスクトップ上の Device Driver Utility アイコンをクリックすると、 OpenSolaris が認識しているハードウェアの情報が表示されます。

    Device Driver Utility
    Device Driver Utility

    私が所有するコンピュータでは以下のデバイスが認識されませんでした。

    • Marvell Technology Group Ltd. 88E8001 Gigabit Ethernet Controller

    • Integrated Technology Express, Inc. IT/ITE8212 Dual channel ATA RAID controller

    • Brooktree Corporation Bt848 Video Capture

    Bt848が認識されないことは特に問題がありませんが、88E8001 Gibabit Ethernet Controllerが認識されていないことから、LinuxやそのほかのPC UNIXと比べNICへの対応が手薄いことが感じられます。もちろんOpenSolarisに本気で取り組むのであれば、OpenSolarisがサポートしているハードウェアを選定しましょう。

    ITE8212は使用マザーボードに搭載されているParallel ATA用RAIDチップです。ICH5については認識されていますので、ハードディスクを多数装着する場合でなければそれほど実害はないでしょう。

    ちなみに Hewlett Packard の Proliant ML115 では Submit ボタンを押すと以下のようにハードウェア情報が表示されました。モデルが自動的に特定されるようです。

    Device Driver Utility (HP ML115の場合)
    Device Driver Utility

    ◆ OpenSolaris 2008/05 をライブCDからインストールする

    opensolaris 2008.05のインストールはこのライブCD自体から行うことができます。デスクトップ上にある 「OpenSolaris をインストールする」アイコンをダブルクリックすると、OpenSolaris 2008.05のインストーラが起動します。

    OpenSolaris 2008.05 インストーラ
    Installer

    次へをクリックします。

    ディスク
    ディスク

    OpenSolarisをインストールする先をインストールします。OpenSolarisはディスク全体か、もしくはディスク上のパーティーションにインストールできます。/varや/usrなどのパーティーションは分割する必要はありません(このインストーラからでは分割できません)。

    今後データ用のZFSプールを作成することを想定し、今回はディスク上に32GBのシステム用パーティーションを作成し、その中にインストールすることにしました。一つ目のパーティーションタイプをSolarisに変更し、左側のボックスに32と入力するだけです。残りのパーティーションは以後別途パーティーショニングするため、未使用のままにしておきます。

    タイムゾーンの設定
    タイムゾーン


    タイムゾーンの設定画面です。地域「アジア」、場所「日本」を順番に選択します。この時点でタイムゾーンは自動的に「日本」が選択されたことと思います。

    ロケール
    ロケール

    ここではデフォルトの言語を選択します。「日本語」を選択します。

    ユーザー
    ユーザー

    ここではrootアカウントのパスワード、最初の一般ユーザの登録、およびコンピュータ名の設定を行います。

    インストール
    インストール

    インストールここではインストールパラメータを確認します。

    インストール中の画面
    インストール中の画面

    Live CDからインストールが開始されます。

    インストール完了
    インストール完了

    インストールが完了すると以下に示す画面が表示されます。

    インストールログ
    インストールログ

    インストールログの表示を選択すると以下のような画面が表示されます。残念ながら直接ファイルに落とすことはできないようですが、テキストボックスになっていますので、Ctrl-Aでテキスト全体を選択しコピーした後、エディタやコンソールにペーストすることができます。