2011年6月28日火曜日

Confluenceのインストール

今までシステム関係のメモは本ブログやプライベート利用のMediaWikiに書き散らしてきましたが、ぼちぼちセキュリティや管理が気になってきました。ドメイン名をhogeに書き換えたり、あくまで個人用のメモとしては、やってられません。
もっと使い勝手の良いソリューションに乗り換えを企てます、会社でAtlassian Confluenceを愛用していて、使い勝手に満足しているので、それにします。

○前準備
メモリ1GBじゃ足りない。Javaメモリ食い過ぎ。

○JDKのインストール
wget http://download.oracle.com/otn-pub/java/jdk/6u26-b03/jdk-6u26-linux-x64-rpm.bin
mv 'jdk-6u26-linux-x64-rpm.bin?e=1309186109&h=c1696b1b8ee4394e96ec0e35d0ac1bef' 'jdk-6u26-linux-x64-rpm.bin'
chmod a+x jdk-6u26-linux-x64-rpm.bin
./jdk-6u26-linux-x64-rpm.bin

○Confluence(体験版)のインストール
インストール先:/usr/local/confluence/
ホームディレクトリ(データ置き場):/var/data/confluence/

wget http://www.atlassian.com/software/confluence/downloads/binary/confluence-3.5.6-std.tar.gz
tar -xvf confluence-3.5.6-std.tar.gz
mv confluence-3.5.6-std /usr/local/confluence
vi /usr/local/confluence/confluence/WEB-INF/classes/confluence-init.properties
-# confluence.home=c:/confluence/data
+confluence.home=/var/data/confluence/
/usr/local/confluence/bin/startup.sh

で以下にアクセスするとSetup Wizardが始まる。
http://localhost:8080/

○日本語化
http://www.ricksoft.jp/document/pages/viewpage.action?pageId=77332576

2011年6月25日土曜日

PEAR File_Archiveのバグ マルチバイト文字(SJIS)対応編

またPEARのPHPライブラリ「File_Archive」のバグを見つけました。
英語できんし、どうフィードバックしたらいいのかわからないので、とりあえずひとりごちります。

■現象
SJISのファイル名を圧縮しようとすると、対象ファイルが出力ファイルに含まれない場合がある。

○対象バージョン
1.5.4

■例
○対象ファイル
ソ/1.jpg

○「ソ/」を対象に書庫ファイルを生成した時の書庫内容物
(空っぽ)

■原因
PHPのいわゆる「5C問題」

■対策パッチ
/usr/share/pear/File/Archive/Reader.php
こうしたら直った。

- $std = str_replace("\\", "/", $path);
+ $std=$path;

○補足
ディレクトリの区切り文字を「\」(0x5c)から「/」に置き変える処理なんですけど、SJIS文字の2byte目に含まれる0x5cまで置換してしまっています。
マルチバイト対応版str_replace関数を自作するなどして置き換えてやるのが正攻法なんでしょうが、僕のやりたいことはLinux上にすでに存在するローカルファイルを圧縮するだけなんで、この関数は不要だと思った。
Windows版PHPとか使ってる人は、だめですよ。

○過去にさかのぼって調べてみた
調べてません。

2011年6月24日金曜日

PEAR File_Archiveのバグ

PEARのPHPライブラリ「File_Archive」のバグを見つけました。
英語できんし、どうフィードバックしたらいいのかわからないので、とりあえずひとりごちります。

■現象
ディレクトリを丸ごと圧縮すると、生成された書庫ファイル内に同じファイルが二重に取り込まれてしまっていることがある。

○対象バージョン
1.5.4

■例
○ディレクトリ構成
a/1.jpg
a/2.jpg
a/3.jpg
a/4.jpg

○「a/」を対象に書庫ファイルを生成した時の書庫内容物
a/1.jpg
a/1.jpg
a/2.jpg
a/2.jpg
a/3.jpg
a/4.jpg

■原因
どうやら「readdir()」で取得されたディレクトリ「.」「..」の取り扱いに不具合がある様子。
正しくスキップせず周辺のファイルを二重に取り込んでしまう模様。

■対策パッチ
/usr/share/pear/File/Archive/Reader/Directory.php
111行目あたり、なんか判定順序がおかしい気がする。こうしたら直った。

- if ($this->source !== null) {
- $this->source->close();
- }

$file = readdir($this->directoryHandle);
if ($file == '.' || $file == '..') {
continue;
}
if ($file === false) {
return false;
}

+ if ($this->source !== null) {
+ $this->source->close();
+ }

○過去にさかのぼって調べてみた
1.1.0頃から発生している様子だけど、実際にはテストしてないのでわかりません。

2011年2月2日水曜日

zfsのprefetchは無効にすべきか

結論:無効にしました。

メモリ4GB以下の環境では、prefetchは無駄読みが多いので無効にすべしとの話を散見します。
かなり大容量メモリの場合でも意味がないとのことでした。
では8GBの場合は、というと、あまり具体的な言及がないようなので、簡単にベンチしてみました。


■事前準備
kfs01# dd if=/dev/random of=/kfs01/DVD/rand.dat bs=1M count=8000
kfs01# dd if=/dev/random of=/kfs01/DVD/rand2.dat bs=1M count=8000
kfs01# dd if=/dev/random of=/kfs01/DVD/rand3.dat bs=1M count=8000
※compressionはoffです

■vfs.zfs.prefetch_disable=1
kfs01# dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M

8388608000 bytes transferred in 61.856323 secs (135614398 bytes/sec)

kfs01# dd if=/kfs01/DVD/rand.dat of=/dev/null bs=512

8388608000 bytes transferred in 126.849035 secs (66130641 bytes/sec)

○同じファイルに10秒差で3プロセス同時アクセス
kfs01# sleep 10; dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &
kfs01# sleep 20; dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &
kfs01# sleep 30; dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &

8388608000 bytes transferred in 118.090073 secs (71035675 bytes/sec)
8388608000 bytes transferred in 108.089322 secs (77608110 bytes/sec)
8388608000 bytes transferred in 134.888056 secs (62189405 bytes/sec)

○別のファイルに3プロセス同時アクセス
kfs01# dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &
kfs01# dd if=/kfs01/DVD/rand2.dat of=/dev/null bs=1M &
kfs01# dd if=/kfs01/DVD/rand3.dat of=/dev/null bs=1M &

8388608000 bytes transferred in 252.801162 secs (33182632 bytes/sec)
8388608000 bytes transferred in 279.368155 secs (30027073 bytes/sec)
8388608000 bytes transferred in 285.504720 secs (29381679 bytes/sec)

■vfs.zfs.prefetch_disable=0
kfs01# dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M

8388608000 bytes transferred in 78.085995 secs (107427817 bytes/sec)

kfs01# dd if=/kfs01/DVD/rand.dat of=/dev/null bs=512

8388608000 bytes transferred in 87.117275 secs (96290982 bytes/sec)

○同じファイルに10秒差で3プロセス同時アクセス
kfs01# sleep 10; dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &
kfs01# sleep 20; dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &
kfs01# sleep 30; dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &

8388608000 bytes transferred in 210.107980 secs (39925223 bytes/sec)
8388608000 bytes transferred in 200.080233 secs (41926221 bytes/sec)
8388608000 bytes transferred in 185.853389 secs (45135620 bytes/sec)

○別のファイルに3プロセス同時アクセス
kfs01# dd if=/kfs01/DVD/rand.dat of=/dev/null bs=1M &
kfs01# dd if=/kfs01/DVD/rand2.dat of=/dev/null bs=1M &
kfs01# dd if=/kfs01/DVD/rand3.dat of=/dev/null bs=1M &

8388608000 bytes transferred in 329.962485 secs (25422914 bytes/sec)
8388608000 bytes transferred in 330.320616 secs (25395351 bytes/sec)
8388608000 bytes transferred in 332.796445 secs (25206423 bytes/sec)

■結論
ブロックサイズの小さなシーケンシャルリードは、prefetch有効のほうが速かったです。
シーケンシャルでもブロックサイズが大きいとprefetch無効のほうが速かったです。
このへんの挙動は、おおむね想定の範囲内かなと思いました。

sambaのout速度は、あんまり変わらなかったです。
sambaには一度に読む量の設定があった気がするので、設定依存かも知れません。

ddを3本同時に走らせた場合、prefetch無効のほうが速かったです。これは意外。
てっきりprefetchで先読みしてあげればIO待ちが軽減されるかと思ったのですが、速度が出てない。
ただいずれにしても、パフォーマンスは思ったほど落ちなかったようです。NCQかZFSのおかげかわかりませんが。

で、結局どうするかというと、
ブロックサイズの細かいファイルアクセスが続くような場合ですと
prefetch有効のほうがいいみたいですが、それ以外の場合は無効のほうがいいみたいですね。

ということはprefetchはホームユースのストレージサーバでは、あんまりメリットがない気がします。
でっかいファイルをシーケンシャルにドンドコ読むか、細かいファイルを個別に開いて編集するか、がほとんどかなと。

ウェブのストレージとしてもARC&L2ARCやクライアントサイドでのキャッシュなど踏まえますと
たいていの場合は、全然意味がない機能かも知れませんね?

唯一、システム起動ディスク用途としてはONのほうがいいかも知れません?
けどzvolの挙動はzfsとは異なるようなので、また改めて研究が必要だなぁ、と思います。

というわけで、追加研究の時間はなさげなので、prefetch無効で運用することにします。

2011年1月29日土曜日

rsyncを高速に

rsyncを高速化するには

rsync -avS -e 'ssh -c blowfish' --progress --stats hogehoge mogemoge

みたいなオプションがいいらしい。(+個人的趣味)

けど、blowfishは実はあんまり速くない。
手元のCore 2 Quadでは、arcfourのほうが断然速い。2~3倍くらい速い。

rsync -avS -e 'ssh -c arcfour' --progress --stats hogehoge mogemoge

メモでした。

makewhatisを止める

chmod 644 /etc/cron.daily/mlocate.cron
chmod 644 /etc/cron.daily/makewhatis.cron
chmod 644 /etc/cron.weekly/makewhatis.cron

2011年1月27日木曜日

kfs01を再構築する

ストレージサーバを再構築します。
OSはコピるもの、という信念の元、FreeBSDをコピって使い続けてきましたが、そろそろ昔いじった内容なんかがあやふやになってきましたので手順を完全に残しながら、改めて再インストールしたいと思います。

■インストール
高品質と言われていて、割と安定して手に入る白芝SDHC8GBを使います。1パーティション全量「/」に割り当てます。SWAPは別途ZFS上に確保します。MBRはStandardを選びます。
ちなみにlabelやfdiskの画面では構成を決定した後、[w]は押してはいけない。writeするとインストール開始後の領域確保でインストーラがエラー出して止まります。これで相当ハマりこみました。
KernDeveloperでインストールします。kernel再構築の予定はないけど、一応。
再起動かかったところでディスクイメージをddで吸い出しておくと、失敗時にやり直ししやすいです。

■SSH rootログイン許可
kfs01# vi /etc/ssh/sshd_config
-#PermitRootLogin=no
+PermitRootLogin=yes
kfs01# service sshd restart
kfs01# /etc/netstart

■設定書き換え
kfs01# vi /etc/motd
※適当に書き換え

kfs01# vi /boot/loader.conf
autoboot_delay="3"
kern.cam.boot_delay=20000
aio_load="YES"
ahci_load="YES"
siis_load="YES"
vm.kmem_size_max="6144M"
vm.kmem_size="6144M"
vfs.zfs.arc_max="3072M"
vfs.zfs.vdev.cache.size="40M"
vfs.zfs.txg.synctime=5
vfs.zfs.txg.timeout=5
vfs.zfs.vdev.max_pending=1
vfs.zfs.zfetch.block_cap=512
vfs.zfs.zfetch.max_streams=16
vfs.zfs.prefetch_disable="1"
#vfs.zfs.zil_disable="1"
cpufreq_load="YES"
#hint.acpi_throttle.0.disabled=1
#hint.acpi_throttle.1.disabled=1
#hint.acpi_throttle.2.disabled=1
#hint.acpi_throttle.3.disabled=1

kfs01# vi /etc/rc.conf
defaultrouter="192.168.0.1"
hostname="kfs01.hoge.com"
ifconfig_em0="inet 192.168.0.251 netmask 255.255.255.0 mtu 1500"
keymap="jp.106"
nfs_client_enable="YES"
nfs_server_enable="YES"
rpcbind_enable="YES"
sshd_enable="YES"
ntpdate_enable="YES"
ntpdate_flags="asia.pool.ntp.org"
mountd_enable="YES"
nfs_server_flags="-u -t -n16"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"
samba_enable="YES"
webmin_enable="YES"
nmbd_enable="YES"
smbd_enable="YES"
winbindd_enable="YES"
zfs_enable="YES"
powerd_enable="YES"
#performance_cx_lowest="C2" ←ネットワークパフォーマンスが激しく低下するので却下
#economy_cx_lowest="C2"
istgt_enable="YES"
istgt_flags="-m 1"

■/tmpをメモリ上に確保(SDカード遅いから)
kfs01# echo 'tmpfs /tmp tmpfs rw,nosuid 0 0'>>/etc/fstab
kfs01# mount -a
kfs01# echo 'WRKDIRPREFIX=/tmp' >>/etc/make.conf
kfs01# echo 'TMPDIR=/tmp' >>/etc/make.conf
kfs01# echo 'DISTDIR=/tmp/distfiles' >>/etc/make.conf
kfs01# echo 'WITHOUT_X11=yes' >>/etc/make.conf
kfs01# echo 'WITHOUT_GUI=yes' >>/etc/make.conf
kfs01# echo 'NO_X=true' >>/etc/make.conf
kfs01# echo 'WITHOUT_IPV6=yes' >>/etc/make.conf
kfs01# echo 'WITH_MBSTRING=yes' >>/etc/make.conf
kfs01# echo 'SUPHOST=cvsup2.jp.FreeBSD.org' >>/etc/make.conf
kfs01# echo 'MASTER_SITE_OVERRIDE=ftp://ftp3.jp.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/' >>/etc/make.conf

■ZFS作る
kfs01# zpool create kfs01 raidz2 ada0 ada1 ada2 ada3 ada4 ada5 ada6 ada7
kfs01# zfs set atime=off kfs01
kfs01# zfs create -o compression=on -o sharenfs="-network 192.168.0.0 -mask 255.255.255.0 -maproot=root" kfs01/kfs
kfs01# zfs create -o compression=on -o sharenfs="-network 192.168.0.0 -mask 255.255.255.0 -maproot=root" kfs01/xen
kfs01# zfs create kfs01/DVD
kfs01# zfs create -o compression=on kfs01/NAS
kfs01# zfs create kfs01/zvols
kfs01# zfs create -V 16G kfs01/zvols/swap
kfs01# zfs create -V 1T kfs01/zvols/istgt1
kfs01# chmod 777 /kfs01/DVD
kfs01# chmod 777 /kfs01/NAS
kfs01# chmod 777 /kfs01/kfs
kfs01# chmod 777 /kfs01/xen

■SWAP on ZFS
kfs01# zfs create kfs01/zvols
kfs01# zfs create -V 16G kfs01/zvols/swap
kfs01# zfs set org.freebsd:swap=on kfs01/zvols/swap
kfs01# swapon -a /dev/zvol/kfs01/zvols/swap
kfs01# swapinfo

※ここらで一旦再起動

■portsnap初期化
kfs01# mkdir -p /tmp/var/db/portsnap
kfs01# echo 'WORKDIR=/tmp/var/db/portsnap' >>/etc/portsnap.conf
kfs01# echo 'SERVERNAME=portsnap.allbsd.org' >>/etc/portsnap.conf
kfs01# echo 'REFUSE arabic chinese french german hebrew hungarian' >>/etc/portsnap.conf
kfs01# echo 'REFUSE korean polish portuguese russian ukrainian vietnamese' >>/etc/portsnap.conf
kfs01# echo 'REFUSE x11 x11-clocks x11-fm x11-fonts' >>/etc/portsnap.conf
kfs01# echo 'REFUSE x11-servers x11-themes x11-toolkits x11-wm' >>/etc/portsnap.conf
kfs01# portsnap fetch extract update
※2回目以降
kfs01# portsnap fetch update

※WORKDIRについて
作業ディレクトリというものの、インデックスらしきファイルが残ります。
再起動すると消えちゃうtmpfsで大丈夫なのか、ググってもどうも確証が得られません。
まぁ安定稼働しちゃえば頻繁に使うコマンドではないと思うので、ダメだったらfetch extractからやり直すことにします。

■Portsを並列処理で高速化
kfs01# echo '.if ${.CURDIR:M*/usr/ports*}' >>/etc/make.conf
kfs01# echo 'FORCE_MAKE_JOBS=YES' >>/etc/make.conf
kfs01# echo 'MAKE_JOBS_NUMBER=8' >>/etc/make.conf
kfs01# echo '.endif' >>/etc/make.conf

※止まっちゃうportsがあれば以下のように対処する
kfs01# .if ${.CURDIR:M*mail/procmail}
kfs01# .undef FORCE_MAKE_JOBS
kfs01# .endif

■portupgrade導入 ※ディスク足りない、やらない
kfs01# cd /usr/ports/ports-mgmt/portupgrade
kfs01# make install clean
kfs01# rehash
kfs01# portsdb -uU
kfs01# pkgdb -aF

※バージョンアップ
kfs01# portupgrade -r firefox
※全バージョンアップ ←普通使わない容量注意
kfs01# setenv BATCH yes
kfs01# portupgrade -a

※ここから先のportsインストールは、同時に行うと、同じライブラリを使っていたりしてエラー出ることがあるようです。

■smartctl導入
kfs01# cd /usr/ports/sysutils/smartmontools
kfs01# make install clean
※libiconvの設定でEXTRA_PATCHESをONにする
kfs01# service smartd start

■rsyncd導入
kfs01# cd /usr/ports/net/rsync
kfs01# make config
kfs01# make install clean
kfs01# echo 'rsyncd_enable="YES"' >> /etc/rc.conf
kfs01# echo 'uid = root' >>/usr/local/etc/rsyncd.conf
kfs01# echo 'gid = wheel' >>/usr/local/etc/rsyncd.conf
kfs01# echo 'hosts allow=192.168.0.0/24' >>/usr/local/etc/rsyncd.conf
kfs01# service rsyncd start

■samba導入
kfs01# cd /usr/ports/net/samba35
kfs01# make install clean
※samba:LDAPとCUPSとIPV6を切ってAIO_SUPPORTを入れる
※python:デフォルトのまま
※perl:THREADをON
※m4:デフォルト

kfs01# mv /usr/local/etc/smb.conf /usr/local/etc/smb.conf.org
kfs01# vi /usr/local/etc/smb.conf
[global]
encrypt passwords = yes
map to guest = Bad User
workgroup = WORKGROUP
server string = hogehoge storage
hosta allow = 192.168.0.
load printers = no
display charset = utf-8
unix charset = utf-8
dos charset = cp932
aio read size = 0
aio write size = 16384
socket options = IPTOS_LOWDELAY TCP_NODELAY
write cache size = 262144

[DVD]
path = /kfs01/DVD
public = yes
writable = yes
printable = no
guest ok = yes
only guest = yes
browseable = yes

[NAS]
path = /kfs01/NAS
public = yes
writable = yes
printable = no
guest ok = yes
only guest = yes
browseable = yes

kfs01# service samba start

■iSCSIターゲット:istgt導入
kfs01# cd /usr/ports/net/istgt
kfs01# make install clean
kfs01# vi /usr/local/etc/istgt/auth.conf
[AuthGroup1]
Comment "Auth Group1"
Auth "iqn.1991-05.com.microsoft:yggdrasill" "abcdefghijklmnop"

※「MutualUser」「MutualSecret」は双方向で認証する場合に使用します。

kfs01# vi /usr/local/etc/istgt/istgt.conf
[Global]
NodeBase "iqn.com.hoge.istgt"
PidFile /var/run/istgt.pid
AuthFile /usr/local/etc/istgt/auth.conf
MediaDirectory /var/istgt
LogFacility "local7"
Timeout 30
NopInInterval 20
DiscoveryAuthMethod Auto
MaxSessions 16
MaxConnections 4
MaxR2T 32
MaxOutstandingR2T 16
DefaultTime2Wait 2
DefaultTime2Retain 60
FirstBurstLength 262144
MaxBurstLength 1048576
MaxRecvDataSegmentLength 262144
InitialR2T Yes
ImmediateData Yes
DataPDUInOrder Yes
DataSequenceInOrder Yes
ErrorRecoveryLevel 0

[UnitControl]
Comment "Internal Logical Unit Controller"
AuthMethod CHAP
AuthGroup AuthGroup1
Portal UC1 127.0.0.1:3261
Netmask 127.0.0.1

[PortalGroup1]
Comment "Portal Group 1"
Portal DA1 192.168.0.251:3260

[InitiatorGroup1]
Comment "Initiator Group1"
InitiatorName "ALL"
Netmask 192.168.0.0/24

[LogicalUnit1]
TargetName disk1
Mapping PortalGroup1 InitiatorGroup1
AuthMethod CHAP
AuthGroup AuthGroup1
UnitType Disk
QueueDepth 64
LUN0 Storage /dev/zvol/kfs01/volumes/xen1 Auto

[LogicalUnit2]
TargetName disk2
Mapping PortalGroup1 InitiatorGroup1
AuthMethod CHAP
AuthGroup AuthGroup1
UnitType Disk
QueueDepth 64
LUN0 Storage /dev/zvol/kfs01/volumes/xen2 Auto

kfs01# service istgt start
※istgtcontrol.conf は存在しなくても動くみたい…
ターゲットに向けてリムーバブルメディアを出し入れしたりする命令を発行するistgtcontrolコマンドを使わない限りは。
よくわかんないんですけど、UnitTypeでisoとかtapeとか指定した時に活用できるのかしらん?

■webmin導入
kfs01# cd /usr/ports/sysutils/webmin
kfs01# make install clean
kfs01# /usr/local/lib/webmin/setup.sh
kfs01# service webmin start

■netperf導入
kfs01# cd /usr/ports/benchmarks/netperf
kfs01# make install
kfs01# rehash

○サーバ起動
kfs01# netserver

○テスト
netperf -H kfs01.hoge.com -fM


■HPN-SSH(マルチスレッド版SSH)のためにopenssh-portableを導入
kfs01# cd /usr/ports/security/openssh-portable
kfs01# make config
※HPN有効、OVERWRITE_BASE有効(既存のsshを置き換える)
kfs01# make install clean

○バージョン確認
kfs01# ssh -v
(前)OpenSSH_5.4p1 FreeBSD-20100308, OpenSSL 0.9.8n 24 Mar 2010
(後)OpenSSH_5.2p1-hpn13v6 FreeBSD-openssh-portable-overwrite-base-5.2.p1_3,1, OpenSSL 0.9.8n 24 Mar 2010

※ここまででディスクイメージ化しておく。


■ZFSの自動スナップショット作成
kfs01# crontab -e
@daily /kfs01/kfs/backup/cron/zfs_snapshot.sh kfs01 days_later 7 recursive
@weekly /kfs01/kfs/backup/cron/zfs_snapshot.sh kfs01 weeks_later 5 recursive
@monthly /kfs01/kfs/backup/cron/zfs_snapshot.sh kfs01 months_later 12 recursive
@yearly /kfs01/kfs/backup/cron/zfs_snapshot.sh kfs01 years_later 10 recursive