Server: 2007年2月アーカイブ

 前回、自動認識に失敗したCardBusタイプのLANカードですが、これを認識させることができましたので設定メモ。

まず、自動認識を行おうとしているときに何が起きていたか次のコマンドで確認

# dmesg | egrep 'cbb|pccard|cardbus'
cbb alloc res fail
cardbus0: Can't get memory for IO ports
cbb alloc res fail
cbb alloc res fail
cbb alloc res fail
cbb alloc res fail
cardbus0: at device 0.0 (no driver attached)

どうも割り込みに失敗している模様。
次にデフォルトの割り当てアドレスを確認。
# sysctl -a | grep hw.cbb
hw.cbb.start_memory: 2281701376
hw.cbb.start_16_io: 256
hw.cbb.start_32_io: 4096
hw.cbb.debug: 0

ググッた内容だと
hw.cbb.start_memory="0x40000000"
hw.cbb.start_32_io="0x2000"
とすることで動作した報告があるので(PCによって変わるそうです)/boot/loader.confに下記を加えます。

# ee /boot/loader.conf
hw.cbb.start_memory="0x40000000"
hw.cbb.start_32_io="0x2000"

ここで一旦rebootして自動認識に成功したか確認。

ll /dev/net/
total 0
crw------- 1 root wheel 0, 32 Feb 20 07:59 fxp0
crw------- 1 root wheel 0, 76 Feb 20 07:59 lo0
crw------- 1 root wheel 0, 40 Feb 20 07:59 plip0
crw------- 1 root wheel 0, 81 Feb 20 07:59 rl0

rl0として認識されました。

この後は認識されたLANの設定ですが、LAN側として個別に設定したいのでdevdを使います。
devd(8)を有効にするためrc.confにdevd_enable="YES"を追記。

# ee /etc/rc.conf
devd_enable="YES"

/etc/devdディレクトリが存在しなかった為作成してrl0用の設定ファイルを作成。
# mkdir /etc/devd
# ee /etc/devd/rl0.conf

attach 100 {
device-name "rl0";
action "ifconfig $device-name inet 192.168.0.10 netmask 255.255.255.0";
action "route add default 192.168.0.1";
};

detach 100 {
device-name "rl0";
};

以上の作業を完了して再度rebootして2台とも正しく設定完了しました。
ちゃんと100Mbpsで動作していることもifconfigで確認できました。

rl0: flags=8843 mtu 1500
options=8
inet 192.168.0.10 netmask 0xffffff00 broadcast 192.168.0.255
inet6 fe80::290:ccff:fec5:d73%rl0 prefixlen 64 scopeid 0x4
ether 00:90:xx:xx:xx:xx <- MACアドレスはメーカコード以外伏字
media: Ethernet autoselect (100baseTX )
status: active

[動作実績]
PC:IBM A22m,A21p
LAN:Planex FNW-4000-TX
OS:FreeBSD6.0,FreeBSD6.2
設定内容:上記
関連:LAN構築用にFNW-4000-TX買いました。

20070219-1.jpg

今日の未明になんとかOSのインストールまで終わったので先週作ったラックに収納。このラックならまた台数が増えたときは棚を追加すれば良いし、ある程度大きくなったらキャスタ付けて机の下にでも設置できます。縦置きルータ等、設置に困る機器も残っているので今度サーバーが増えるときは一緒に収納できるようにしてみようかな。

1. インストール前に

1-1.起動ディスク作成ツールとFDイメージの取得

エクスプローラーFTPサイトにアクセスして
起動ディスクを作成するためのツールをダウンロード
ftp://ftp.freebsd.org/pub/FreeBSD/tools/

00_index.txt
README.TXT
boot.bin
bootinst.exe
bsdboot/
ckdist.exe
ckdist.man
dist/
extipl.exe
fdimage.exe
fips.doc
fips.exe
fips.faq
gunzip.exe
gzip.exe
ide_conf.exe
md5.exe
osbs135.exe
osbsbeta.exe
pfdisk.exe
presizer.doc
presizer.exe
rawrite.exe
restorrb.exe
srcs/

エクスプローラーFTPサイトにアクセスしてFDイメージを取得
ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/6.2-RELEASE/floppies/


CHECKSUM.MD5
CHECKSUM.SHA256
README.TXT
boot.flp
fixit.flp
kern1.flp
kern2.flp
kern3.flp


1-2. 起動ディスクの作成

fdimage.exeを利用してフロッピーイメージを作成。
※Cドライブ直下にtoolsとfloppiesを入れカレントをC:\toolsにした場合
C:\tools>fdimage ../floppies/boot.flp A:

続けて、
C:\tools>fdimage ../floppies/fixit.flp A:
C:\tools>fdimage ../floppies/kern1.flp A:
C:\tools>fdimage ../floppies/kern2.flp A:
C:\tools>fdimage ../floppies/kern3.flp A:


2. インストール

2-1.インストーラーの起動

FDからブートできるようにBIOSの設定を調整してBootディスクを入れて起動します。

次にKernel floppy 1を入れるように支持されるのでkern1ディスクを入れます
Kernel floppy 1
Kernel floppy 2
Kernel floppy 3
boot floppy

この後インストーラーが立ち上がります。

2-2. インストールパッケージの選択

Country Selection -> japan
System Console Keymap -> Japanese 106 keymap
sysinstall Main Menu -> Custom -> Distributions -> Minimal

2-3. パーティションの設定

実は手動で設定すると何故かインストール終了後マウントポイントがぶっ飛んでいたので、オートにしました。


/ 495MB
swap 995MB
/var 1470MB
/tmp 495MB
/usr 33515MB

2-4. Mediaの設定

Media -> FTP を選択する
LANカードの設定はcase by case


2-5. ユーザ管理

User Managementでwheelグループのユーザを作成。できればシェルはtcsh

2-6. その他
タイムゾーンの設定 JST
マウスの設定 無効

これでcommitしインストール開始すると必要なパッケージがダウンロードされてインストール完了


3. インストール後の設定

3-1. SSH環境の設定

まずはSSHでログインできるように
ee /etc/rc.confに

sshd_enable="YES"

を追加

/etc/ssh/ssh_config
/etc/ssh/sshd_config

上記2つで

PasswordAuthentication yes

と設定されいることを確認する。ちなみに6.2の/etc/ssh/ssh_configはデフォルトでYesになっていました。
そのあとsshdを起動するためrebootでSSHログイン可能。

SSHユーザーの制限は/etc/ssh/sshd_configにAllowUsersの項目を追加し

AllowUsers user1 user2

のように記述する。


3-2. リソースの節約

6.0の時と同様使用しないコンソールは動作させない。

ee /etc/ttys

gettyを0と1を残して全てコメントアウト、さらにシリアル接続は使わないので全てコメントアウトして再起動。


3-3. セキュリティ強化でちょっと工夫

ログインメッセージの編集⇒/etc/motd


3-3. カーネル再構築とファイヤーウォールの設定

以前と同じ方法なのでファイヤーウォールの設定を参照

とりあえずここまで設定してダメだったのがLAN用に購入したカードがCardBusの自動認識で失敗していることかな。これは6.0側もダメだったのでこちらの新しいサーバで確かめながらやって行こう…。

 まだ2台目を構築完了していないのに気が早いのですが、2台をLANで接続する理由はもちろん負荷分散の為です。予定としては、

1.サーバー構築
 ⇒ネットワークカードの追加
 ⇒ファイアーウォールの設定(LAN通信分)

2.Webの負荷分散
 ⇒Apache2.2によるロードバランシング
 ⇒バックプロキシーによる静的ページとCGIの分離

3.MySQLの負荷分散
 ⇒レプリケーション構成の作成

4.PostgreSQLの負荷分散
 ⇒どんな方法があるか検討中

5.ゲームサーバの複数台構成
 ⇒プロセス間通信からサーバ間通信の実現

まぁこんなところです。勉強することは一杯ありますねぇ。

20070213-1.jpg

このカードを買おうと決定した情報源はココ

http://www.turbolinux.co.jp/products/compatibility/hardware/2.html
FNW-4000-TX Chip: Realtek 8139 (module:8139too)

Linux対応だけどメーカー非サポートとか書くぐらいならせめてスペック表にChipぐらい書けよと思います。これはヨドバシで買いましたがどのメーカーもChip名書いてない。

一応有線LANカードはZaurus用にCFタイプを一枚持っているのだがこれは10Mbpsの為、新たに2枚買いました。これで週末までにノートPCからデータバックアップとってFreeBSD6.2の構成にしようと思います。
CPUやメモリーは殆ど同じですがHDDが40GBあるのでファイル置き場としてもいいですね。

 最近WinCVSについて有名なごった煮版を探していたら以前公開されていたURLにアクセスできなくなっていた。更新停止から長い期間が経った事と今はEclipseから利用するのが多いようなのでWinCVSは流行ってないのかな。仕事上Eclipse使うハメになっているのでどうせならCVSクライアントして使おう。

 また接続方式はpserverではなくssh。CVSだけのためにinetdを有効にするのが勿体無いというのもありますが、ファイル転送をscpに限定している為pserverで構築する意味が無いのでsshで接続することにしました。

◆CVSの初期化(Server上)
自分用リポジトリ作成(例:user1ユーザ)
> mkdir ~/cvs
> cvs -d /home/user1/cvs/ init

/home/user1/cvs/にCVSROOTディレクトリが生成され、その下にいくつかの設定ファイルが生成されます。

> ls
Emptydir config editinfo,v modules,v taginfo
checkoutlist config,v history notify taginfo,v
checkoutlist,v cvswrappers loginfo notify,v val-tags
commitinfo cvswrappers,v loginfo,v rcsinfo verifymsg
commitinfo,v editinfo modules rcsinfo,v verifymsg,v


ソースのインポート(Server上)
> pwd
/home/user1/project-mmo
> ls
client server
> cvs -d /home/user1/cvs/ import ProjectMMO PJMMO PJMMO_1_0

コメントを入力

Project MMO Development
CVS: ----------------------------------------------------------------------
CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
CVS:
CVS: ----------------------------------------------------------------------

/tmp/cvszL0n4K: 5 lines, 253 characters
[中略]
No conflicts created by this import


◆Eclipse(CVSクライアント)から利用

Eclipse [ウィンドウ]-[パースペクティブを開く]-[その他]で
CVSリポジトリー・エクスプローラーを選択して[OK]

CVSリポジトリーの追加ボタンをクリック
接続タイプにextsshを指定

SSH2メッセージに[はい]

これだけで接続完了。

特にMMO制作ではC++言語とバイナリ素材がメインになるのでEclipseはCVSクライアントとして利用します。

サーバー上に出来上がったファイルを見るとどれも差分ファイルの塊だったので公開用はWinSCPでローカルから送信。
別にサーバー上でコマンド使って生成してもいいのですが公開ディレクトリはCVSと絡みたくないのでローカルからコピーします。

他のプロジェクトで共同開発を行う事も多いのでEclipse+CVSを薦めてみよう。

参考書籍:CVS/WinCVSハンドブック
CVSで買った2冊目の書籍ですが、これは非常に分かりやすいです。ググって中途半端な情報を組み合わせて構築するよりずっと楽でした。(というかsshだと構築不要なんですね)

TCP/IPの本

| | コメント(0) | トラックバック(0)

 昨日帰りに本屋に行って買って来ました。
目的は今の開発現場はCVS使ってるのでそれをちゃんと覚えたいという目的で買いに行ったのですが、ついついネットワークプログラミング関連に行っちゃいます。私はどちらかというとウェブプログラマーではなくネットワークプログラマーで在りたいと思ってるからなのですが。

 買ったのはこの本『TCP/IPプログラミング徹底解説』。これがちょっと立ち読みしたら現場で役立ちそうなことが沢山書いてます。普通の本であればプログラミングの作法とか実現方法が多いのですが、これは作成したプログラムがネットワーク障害を起こしたときに何が原因なのかノウハウが詰まっている気がします。これを読まないとついついネットワーク機器やインフラのせいにしそうです。

 最近ずっとサーバーの設定を見直してなかったので、少し見てみたらapache2.2がデフォルトで無駄な情報を吐き出さないように設定されているので他の項目は一切触れてなかった。PHPなんてエラー出力を画面に吐き出さないようにしてるだけ。これはマズいので特にPHP設定のセキュリティレベルを上げようと思う。

IPA ISEC セキュア・プログラミング講座
http://www.ipa.go.jp/security/awareness/vendor/programming/

PHP と Web アプリケーションのセキュリティについてのメモ
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html

セキュアなWebサーバ(Apache+mod_ssl)の設定方法
http://ash.jp/sec/env/mod_ssl.htm

@IT:Apacheパフォーマンス・チューニングのポイント(2-2)
http://www.atmarkit.co.jp/flinux/rensai/apache15/apache15b.html

 前回、vmstatの1回目の値が正確な値ではないと書いていましたがLinuxでも同じなので調べてみたら前回実行からの平均値だろうです。単なる無知でしたorz。さらに1秒間隔では瞬間的なバッチ処理でアラート出してしまうので最低5秒間の平均をとるように変えました。その他ログ書き出しや例外処理を追加

 実装に向けてLinux対応をしてみましたが移植の際に注意するのはこのスクリプトで使用しているコマンドのパスやオプションそしてvmstatの出力フォーマットをチェックすることですね。

#!/bin/sh

TO=webmaster@exsample.com
CC=user1@exsample.com
DATE=`date '+%Y-%m-%d' `
TIME=`date '+%H%M%S' `
DATETIME=`date '+%Y-%m-%d %T' `
HOST=`hostname -i`
BORDER=70
LIMIT=95
IDLE=`/usr/bin/vmstat 5 2 | /usr/bin/tail -1 | /bin/awk '{print$15}'`
LOAD=`expr 100 - $IDLE`
LOGDIR=~/logs

if [ $# -eq 1 ]
then
MODE=$1
else
MODE=run
fi

if [ ! -e $LOGDIR ]
then
`mkdir $LOGDIR`
fi

if [ ! -d $LOGDIR ]
then
if [ $MODE = test ]
then
echo "ERROR: $LOGDIR IS NOT DIRECTORY."
fi
echo "$HOST ERROR: $LOGDIR IS NOT DIRECTORY." | /bin/mail -s "CPU CHECK ERROR" -c $CC $TO
exit 0
elif [ ! -r $LOGDIR -o ! -w $LOGDIR -o ! -x $LOGDIR ]
then
if [ $MODE = test ]
then
echo "FORBIDDEN: Don't have permission to $LOGDIR on this server."
fi
echo "$HOST FORBIDDEN: Don't have permission to $LOGDIR on this server." | /bin/mail -s "CPU CHECK FORBIDDEN" -c $CC $TO
exit 0
fi

echo "$DATETIME CPU Load $LOAD%" >> $LOGDIR/cpustat_$DATE.log

if [ $BORDER -lt $LOAD -o $MODE = test ]
then
`/usr/bin/top -b -n 1 > $LOGDIR/top_$DATE-$TIME.log`
fi

if [ $LIMIT -lt $LOAD -o $MODE = test ]
then
echo "$HOST CPU Load $LOAD%" | /bin/mail -s "CPU CHECK Alert" -c $CC $TO
fi

exit 0

 ここ最近ずっと課題になっていたのがサーバーが過負荷になったときどうやって検知するのかということ、プロセスダウンでもすればわかりやすいがCPU使用率が危険な状態というのはどうしようかといろいろ探してみた。vmstatやtopを使う方法が一般的ですが、topコマンドがRHLとBSDで使い勝手が違いがあったので単純なvmstatを選びました。

どこかに載っていたコマンドですが
/usr/bin/vmstat|/bin/grep -E "^ ?[0-9]"|/usr/bin/awk '{print$18}'

このようにgrepでヘッダ部分を省きawkを利用してcpuの部分(BSDだと18番目)を抜き出す。
但し、ウチのBSDだとvmstatの1発目が正確な値を表示してくれないので2回分出力して2行目を取得。
そうするとコマンドはこのようになる。

/usr/bin/vmstat 1 2 | /usr/bin/tail -1 | /usr/bin/awk '{print$18}'

grepよりかtail -1の方が簡単だな。
これをアラート設定込みでシェルスクリプトに組み込んだのが下の例です。

#!/bin/sh

TO=webmaster@example.com
CC=user1@example.com

idle=`/usr/bin/vmstat 1 2 | /usr/bin/tail -1 | /usr/bin/awk '{print$18}'`
cpu=`expr 100 - $idle`

if [ 90 -lt $cpu ]
then
echo "CPU = $cpu" | mail -s "CPU Alert" -c $CC $TO
fi

exit 0

このアーカイブについて

このページには、2007年2月以降に書かれたブログ記事のうちServerカテゴリに属しているものが含まれています。

前のアーカイブはServer: 2007年1月です。

次のアーカイブはServer: 2007年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.1