2009年9月22日火曜日

NTPで時刻合わせ

予備機がNTPで同期してなかったので修正しました。


yum install ntp
ntpdate ntp.asahi-net.or.jp

あと自動同期の設定など。
vi /etc/ntp.conf
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
server -4 ntp.asahi-net.or.jp

/etc/rc.d/init.d/ntpd start
chkconfig ntpd on

ハードウェアクロックにも反映しとかないと、再起動のたびに狂っちゃうよ
hwclock --systohc

いじょう。

2009年9月13日日曜日

OpenXのアップデート

DL&解凍
# wget http://download.openx.org/openx-2.8.1.tar.gz
# tar zxvf openx-2.8.1.tar.gz

DBバックアップ
# /kfs/backup/mysqlsnapshot -u [ID] -p [PW] -l -v -s /kfs/backup/output

ディレクトリ入れ替え
# mv public_html openx26_200909012
# mv openx-2.8.1.tar.gz public_html

パーミッション切り替え
# chmod -R a+w /kfs/ad/public_html/var
# chown -R apache:apache /kfs/ad/public_html/var
# chown -R apache:apache /kfs/ad/public_html/var/cache
# chown -R apache:apache /kfs/ad/public_html/var/plugins
# chown -R apache:apache /kfs/ad/public_html/var/templates_compiled
# chown -R apache:apache /kfs/ad/public_html/plugins
# chown -R apache:apache /kfs/ad/public_html/www/admin/plugins
# chown -R apache:apache /kfs/ad/public_html/www/images

あとブラウザでアクセスして適当に進める。
本当は定期メンテとか切らないといけないんだけどね。
パーミッションで怒られたら、そのとおり対処する。

終わったらvarディレクトリ内を全部書き込み禁止にしておく。

2009年9月6日日曜日

FreeBSDにiTunesサーバを立てる

# cd /usr/ports/audio/mt-daapd
# make install clean
# vi /usr/local/etc/mt-daapd.conf
○パスワード変えとく
admin_pw mt-daapd
admin_pw admin

○ファイル保存先
mp3_dir /usr/local/share/mt-daapd
mp3_dir /mnt/kfs01/FreeNAS1/iTunesServer

○サーバ名
servername mt-daapd
servername KFS-iTunes

○自動起動
# vi /etc/rc.conf
mt_daapd_enable="YES"

○手動起動
# /usr/local/etc/rc.d/mt-daapd start

○Webインターフェース
http://kfs01.hoge.com:3689/


これでファイル保存先に適当にファイルを突っ込み、iTunesを起動すると自動的に接続される。

2009年9月2日水曜日

Xenイメージをストレージサーバに置く

今までXenのイメージファイルはローカルディスクに置いて運用していましたが、大規模なストレージサーバを導入して日が経っていることから、ストレージサーバに置くことにしました。

当面はNFS共有で行きます。将来的にZFS@FreeBSDでzVOL(iSCSI)がサポートされたら、また考えます。

…と思ったんだけど失敗しました。敗因は最後に。


■ストレージサーバ(kfs01)にボリューム作成、イメージ移動
○作成と移動
zfs create zen
zfs set sharenfs="-network 192.168.0.0 -mask 255.255.255.0 -maproot=root" kfs01/xen
mkdir /mnt/kfs01/xen/img
mkdir /mnt/kfs01/xen/conf
mv /mnt/kfs01/kfs/xen/* /mnt/kfs01/xen/img

○設定書き換え
Xenの設定ファイルのファイルパスを書き換えます。
>> disk = [ "tap:aio:/kfs_alpha/xen/ad01.img,xvda,w" ]
<< disk = [ "tap:aio:/kfs_xen/img/ad01.img,xvda,w" ]

○スナップショット作成
ここらでセーブしとくか。
zfs snapshot kfs01/xen@`date +%Y%m%d%H%M%S`

■AlphaとBetaにマウントポイント作成
# mkdir /kfs_xen
# mount -t nfs kfs01.hoge.com:/mnt/kfs01/xen /kfs_xen
# vi /etc/fstab
kfs01.hoge.com:/mnt/kfs01/xen /kfs_xen nfs rw 0 0

○設定ファイルはシンボリックリンク共有にしちゃう
ln -s /kfs_xen/conf/* /etc/xen/

■一気に起動
省略。

■参考:メンテナンス方法
○スナップショット閲覧
zfs list -t all

○スナップショット作成
zfs snapshot kfs01/xen@`date +%Y%m%d%H%M%S`

○スナップショット削除
zfs destroy kfs01/xen@hogehoge

■どうなったか
ストレージサーバのアクセスランプが点灯しっぱなし。パフォーマンスめちゃ悪い(1MB/sとか)。
起動にも時間かかるし、DBなんかまともに動いちゃいない。想定外の事態である。

○原因を考える
ストレージサーバへの転送速度測定では80MB/sくらい出ている。ローカルのRAID1と同じくらいなので、単体アクセス時の速度面は問題なし。複数同時アクセスするとパフォーマンスが激しく落ちるのだろうか。ZFSではキャッシュが盛大に効いているようなので、むしろ速くなるのではないかと期待していたのだが。。

ディスクイメージをNFSで共有しているのが問題なんだろうか。ファイルを部分的に読み書きする場合のNFS+ZFSのパフォーマンスは未確認である。ここかしら。

アクセスランプが点灯しっぱなしであるが、zpool iostatでは10MB/sくらいしか読み書きしていないようである。ってかまず10MB/sも何をしているんだろうか。そんなに盛大にローカルディスクにアクセスする機会、ないんですけど。ファイルの一部分だけを書き換える操作にNFS+ZFSが向いていなくて、広範囲を読み書きしてしまって速度が低下しているんだろうか。

○対策
しかしZFSのsnapshot機能は、サーバのディスクイメージを保管するのにもってこいの機能ではないですか。無停止で取れるし、無駄な容量食わないし。なんとしても活用したい。
というわけでサービス上の最大のボトルネックはDBの読み書きであると判断し、DBサーバだけローカルディスクで稼働するように再変更しました。
これにより、相変わらずアクセスランプは激し目に点滅しているものの、一応サービス提供に問題ないレベルまで速度向上したと思います…。なんか納得いかない。。

気がつけばOpenSolarisの新バージョンが出ているようなので、どこかの段階で、改めてSolaris導入を検討したいと思います。NFS共有がダメなんだとすれば、SolarisでZFSでzVOLでshareiscsi使えば問題なさそうな気がするので。大改造ですけども。

2009年6月8日月曜日

FUPPESを導入する

FreeBSD8-CURRENTにFUPPESを入れる。

cd /usr/ports/audio/lame
make && make install
cd /usr/ports/audio/twolame
make && make install
cd /usr/ports/multimedia/ffmpeg
make && make install
cd /usr/ports/devel/pcre
make && make install
cd /usr/ports/databases/sqlite3
make && make install

cd ~
fetch http://ncu.dl.sourceforge.net/sourceforge/fuppes/fuppes-SVN-578.tar.gz
tar -xvzf fuppes-SVN-578.tar.gz
cd fuppes-SVN-578
./configure --enable-video-transcoding --disable-gnome-panel-applet --disable-libnotify
make && make install

…が、こんなのが出て止まっちゃう…。。。
lib/HTTP/HTTPMessage.cpp:781: error: 'atoll' is not a member of 'std'

ググると解決策は見あたるが、めんどいし、どうせなら最新版を入れちまえ。。
依存関係は多分おなじようなもんではないかと。

cd /usr/ports/devel/subversion
make && make install
cd ~
/usr/local/bin/svn co https://fuppes.svn.sourceforge.net/svnroot/fuppes/trunk fuppes
cd fuppes/
autoreconf -vfi
./configure
make && make install

…おいおい、こっちもエラーかよorz ※SVN636

vi src/plugins/ffmpeg/ffmpeg.cpp

#if LIBAVCODEC_VERSION_MINOR >= 11
av_freep(subtitle_to_free->rects[i]->pict.data[0]);
av_freep(subtitle_to_free->rects[i]->pict.data[1]);
av_freep(subtitle_to_free->rects[i]);
#else
av_free(subtitle_to_free->rects[i].bitmap);
av_free(subtitle_to_free->rects[i].rgba_palette);
#endif

to

//#if LIBAVCODEC_VERSION_MINOR >= 11
// av_freep(subtitle_to_free->rects[i]->pict.data[0]);
// av_freep(subtitle_to_free->rects[i]->pict.data[1]);
// av_freep(subtitle_to_free->rects[i]);
//#else
av_free(subtitle_to_free->rects[i].bitmap);
av_free(subtitle_to_free->rects[i].rgba_palette);
//#endif

これでmake && make installすると
/usr/local/bin/fuppes
に本体が入る。やれやれ。

/usr/local/bin/fuppes
でスタンドアロン版を起動すると、設定画面のURLが表示されるのでアクセスする。
共有ディレクトリを適当に指定して(あとついでにポートも固定して)
rebuild databaseする。

デーモン起動はこちら。
/usr/local/bin/fuppesd

2009年5月28日木曜日

Kingmax U-DriveをFreeBSD7.1で使う

多分FreeBSD7.2でも同様だと思う。

Kingmax U-Drive 8GBとやらが安かったので買ってきたが、FreeBSDではこいつがUSBデバイスとして定義されていないので、ZFSで使用する時に盛大にエラーが出る。kernelを再構築すれば使える。

vi usbdevs
(追加)
vendor KINGMAX 0x1687 Kingmax
product KINGMAX UDRIVE 0x6211 Kingmax U-Drive

(追加)
vi umass.c
{ USB_VENDOR_KINGMAX, USB_PRODUCT_KINGMAX_UDRIVE, RID_WILDCARD,
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE
},

多分これだけ。ちゃんちゃん。

…と思ったらmakeが通らない… めんどくさい。やっぱやーめた。。

2009年5月5日火曜日

エラーの多いUSBメモリ対策

USBメモリがよく壊れる。

USBメモリから起動させて数日経つと、フリーズしてしまう。原因は、どうやらUSBメモリのデータ破損らしい。ZFSのCKSUMがうなぎ登り。やはり激安USBメモリではムリがあったか。

対策としては、信頼性の高いストレージを導入することだが、いまさらHDDに切り替えも困難。物理的に搭載できる限界に達してしまっている。USBメモリで何とかするしかない。

SLCのUSBメモリを買えば信頼性は向上するだろうが、今のメモリが無駄だし高いし、そもそも所詮USBメモリなので、根本的解決にはならないだろう。MLCだって1万回程度の書き換え耐久はある(と言われているようだが、どう考えても2~3回くらいしか書き換えてないが…)はずで、それが10倍になったところでこの現象が収まるとは思えない。2~3日で壊れるのが、20~30日で壊れるようになっても、ねぇ。

今回はZFSのミラーリングを利用し、データが破損すること前提で、対策を打ってみる。ZFSが全ブロックチェックサムでデータ破損を検知し、正常なミラーブロックのデータで上書きして動き続ける仕組みを活用する。

バッドノウハウですけれども。。


■ディスク構成
・1GBのUSBメモリ 1本(da0)
・4GBのUSBメモリ 1本(da1) こいつが腐ってるUSBメモリ。

■構築方法
1. da0にFreeBSDをインストールする。
2. da0のFreeBSDでkernelを再構築する(da1が腐っているので、その対策のため設定改変)
3. da1を4分割し、ZFSミラープールを構築する(rpoolという名前にした)。
4. /boot以外のデータをrpoolにコピーする。
5. 起動時にrpoolをrootとしてマウントするように設定する。

■問題点
・2本1セットでないと運用できない(目をつぶる)
・bootパーティションはミラー化されていない(ddでバックアップしておくことにする)

ミラーを3本にすれば1本のUSBメモリで何とかなる気もするが、なにせ信用ならないUSBメモリなので、bootパーティションが破壊された時のために分割しておくことにします。da0のほうはわりと運用実績あるので、信用する。

■やりかた要旨(基本、3つ前のエントリーに沿って作業する)
da0にFreeBSDをインスコして、kernel再構築する。
…と思ったら1GBメモリでは容量不足で再構築できなかったので、腐ったUSBメモリで再構築した/boot以下を上書きコピーしちゃう。

○シングルモードで起動
mount -w /
mkdir /mnt/temp
mount /dev/da1s1a /mnt/temp
rm -rf /boot
cp -a /mnt/temp/boot /
umount /mnt/temp
rmdir /mnt/temp
reboot

○マルチユーザモードで起動
sysinstall->fdiskでスライスを同容量で4つ確保する(da1)
7843838/4 = 1960959

sysinstall->labelでそれぞれパーティションを1つづつ作る
da1s1d/da1s2d/da1s3d/da1s4d

ミラープール作成
zpool create rpool mirror /dev/da1s1d /dev/da1s2d /dev/da1s3d /dev/da1s4d

ZFSパーティション作成。読み書き速度が1/4になる&容量ちょっと足んないので、全部圧縮しちゃう。
zfs create rpool/root
zfs set compress=gzip rpool/root
zfs set atime=off rpool/root
zpool export rpool
reboot

○シングルユーザモードで起動
mount -w /
zpool import rpool

da0のデータをrpoolにコピーしてboot時にマウントされるようにする。
find -x / | cpio -pmd /rpool/root

rm -rf /rpool/root/boot
mkdir /rpool/root/bootdir
cd /rpool/root
ln -s bootdir/boot boot
echo 'vfs.root.mountfrom="zfs:rpool/root"' >> /boot/loader.conf

vi /rpool/root/etc/fstab
(変更前)/dev/da0s1a / ufs rw 1 1
(変更後)/dev/da0s1a /bootdir ufs rw 1 1

cd /
zfs set mountpoint=/ rpool/root
zfs set mountpoint=legacy rpool

zpool export
reboot

これだけ。ナイスだZFS。
安定性はまた後日レポします。

--追記(2009/5/15)--
極めて安定している。嘘のように安定している。エラーが出ない・・・orz
4組ミラーはさすがに無駄が多いので、2組ミラーのストライピングに切り替えちゃいました。
zpool detach rpool da1s3d
zpool detach rpool da1s4d
zpool add rpool mirror /dev/da1s3d /dev/da1s4d

うーん、再起動不要。ナイスだZFS。