2009年4月11日土曜日

ZFS@FreeBSDの導入

Dom0でファイルサーバを動かしていたが、大容量化するべくZFSを使いたくなったので、ZFSが使えるOSに乗り換える。LinuxはZFSとライセンスの折り合いが悪いようで、Solaris系かFreeBSD系から選択せねばならない。正直まんどい。

■FreeNAS 0.7.4489(amd64)
一旦入れてみたものの、負荷をかけると安定しない。カーネルメモリの割り当てが足りない。amd64版でも1.5GB割り当てようとすると、起動しなくなる。こういうブツは標準状態を改変して運用したくないので泣く泣くパスすることにする。

■Solaris 10
HDDを丸ごとNAS領域にしたいのでUSBメモリにインスコしたが、めちゃめちゃ重い。起動に1時間かかる。神聖Solaris帝国っちゅーことでパッケージの依存関係を自動解決できず運用工数もかかるし、これもパスすることにする。

■OpenSolaris 2008/11
NEC Express5800/110Gdでインストーラが起動しない。Language選択で画面がまっ白になり、固まる。パスすることにする。

■Nexenta Core 1.0.1 Stable
Debian互換のSolaris。パッケージ管理がapt-getで楽勝だろうということで。
インストールは簡単。導入先を選択し、ネットワーク設定を行うだけ。起動すると既にSSHDが上がっているので、以後はSSHから操作することにする。
#初期状態でzfs snapshotが取られていてGJ。

だがしかし、FreeNASで作ったZFS領域をimportできなかった。詳しい情報があまりないのだが、どうもBSD Flagというのがあって、簡単には移行できないっぽい? Solaris系は諦めるしかないのか…?

■Nexenta Core 2.0RC1
NEC Express5800/110Gdでインストーラが起動しない。ロード中に落ちる。他のマシンでインストールして110Gdに繋いでも、ロードが終わらない。ダメっぽい。

…結局、モトのNreeNASで何とかするか、素のBSDを入れるしか選択肢がない。。FreeNAS0.7はamd64版が全然公開されないし、進捗遅そうなので、自力で立てるほうを選択します。




■FreeBSD7.1 RELEASE
HDDを全量ストレージにするため、USBメモリにminimalでインスコした。
USBメモリは書換耐久力が気になる。ZFSは追記型FSなので書き換え領域が分散するし、後からミラー追加できるし、全ブロックにCheckSUM付きで安心である。ここを参考に/ディレクトリのZFS化を試みた。

…USBメモリがFlushコマンドに対応していないらしく、書き換える度に猛烈にエラーが出まくる…。
↓書き込む度にこんなのが大量にグワァァァーーーっと。
(da0:umass-sim0:0:0:0): SYNCHRONIZE CACHE. CDB: 35 0 0 0 0 0 0 0 0 0
(da0:umass-sim0:0:0:0): CAM Status: SCSI Status Error
(da0:umass-sim0:0:0:0): SCSI Status: Check Condition
(da0:umass-sim0:0:0:0): ILLEGAL REQUEST asc:24,0
(da0:umass-sim0:0:0:0): Invalid field in CDB
(da0:umass-sim0:0:0:0): Unretryable error

kernelを再構築すれば解消できるらしいが、minimalで入れてしまったのでソースやmakeはおろかkpg_addもsysinstallも、fetchさえも入っていない始末。。。

…素のBSDでも、一筋縄では行かないようで。




気を取り直して再インスコからやり直す。他のOSがまともに動かないんじゃ、しょうがない。。

■FreeBSD7.1 インストール
インストールパッケージは「Kern-devel」を選択。
スライスはUSBメモリ全体を丸ごと1スライスで確保する。
パーティションは/を1.5GB確保(一次インストール&/boot用)。残り全量をマウント無しで確保(ZFSストレージ化して後から引っ越す)。
#後から思ったが、/bootをちょびっと確保して、/とZFS領域を同量で確保しておくと、JBOBかRAID0で無駄なく使えたかもな… と思った。


■kernel再構築 マルチユーザモードでも可
○再構築の準備&ついでに若干最適化
cd /usr/src/sys/amd64/conf
cp GENERIC KFS
vi KFS
(変更前)ident GENERIC
(変更後)ident KFS

↓コメントアウトした行。もっと攻めてもいいけど、無難にね。。
makeoptions DEBUG=-g
options INET6
options SCTP
options COMPAT_FREEBSD4
options COMPAT_FREEBSD5
options COMPAT_FREEBSD6
options KTRACE
options AUDIT

○Transcend JetFlash Driveの機器追加
エラーを吐きまくる現象を回避する。このメモカ限定の現象。参考資料1 参考資料2

cd /usr/src/sys/dev/usb/
vi usbdevs
(追加)product ALCOR TRANSCEND 0x6387 Transcend JetFlash Drive

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

○kernel再構築
cd /usr/src/sys/amd64/conf
config KFS
cd ../compile/KFS
make cleandepend
make depend
make
make install

reboot


■ZFS pool作成 マルチユーザモードでも可
zpool create rpool /dev/da0s1d

zfs create rpool/root
zfs create rpool/root/usr
zfs create rpool/root/var
zfs create rpool/root/var/log

zfs set compress=gzip rpool/root/usr
zfs set compress=gzip rpool/root/var/log
zfs set atime=off rpool
zfs set quota=512M rpool/root/var/log

echo 'zfs_enable="YES"' >> /etc/rc.conf
echo 'zfs_load="YES"' >> /boot/loader.conf
echo 'vm.kmem_size="1536M"' >> /boot/loader.conf
echo 'vm.kmem_size_max="1536M"' >> /boot/loader.conf

zpool export rpool
reboot


■ZFS on root化 シングルユーザモード
mount -w /
zpool import rpool

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=/usr rpool/root/usr
zfs set mountpoint=/var rpool/root/var
zfs set mountpoint=/var/log rpool/root/var/log
zfs set mountpoint=/ rpool/root
zfs set mountpoint=legacy rpool

zpool export
reboot

■SWAPのZFS化 シングルユーザモード
zfs create -V 1GB rpool/swap
zfs set org.freebsd:swap=on rpool/swap

zpool export
reboot

■ゴミ片付け シングルユーザモード
cd /bootdir
rm -rf `ls | grep '[^boot]'`

mv /bootdir/boot /bootdir/boot.old
cp -Rp /bootdir/boot.old/* /bootdir
mv /bootdir/boot /bootdir/boot.file
cd /bootdir
ln -s ./ ./boot

echo '/loader' >> /bootdir/boot.config

rm /boot
mkdir /boot
vi /etc/fstab
/dev/ad0s1a /boot ufs rw 1 1

zpool export
reboot

■続・ゴミ片付け シングルユーザモード
rm -rf /bootdir


↓残りの作業はまだまだこんなに。。

■NFS
vi /etc/rc.conf
(追加)nfs_server_enable="YES"
(追加)nfs_server_flags="-u -t -n16"
(追加)rpc_lockd_enable="YES"
(追加)rpc_statd_enable="YES"
(追加)rpcbind_enable="YES"

zfs_enable="YES"
↑これも書いておかないと、zfs set sharenfsが効かない。

共有ディレクトリはZFSでmountする。
zfs set sharenfs="-network 192.168.0.0 -mask 255.255.255.0 -maproot=root" kfs01/kfs

■Samba
ja-sambaとsambaの違いは、設定ファイルやメッセージが日本語だったりする点。正直いらね。
よってsysinstallからnet/sambaを入れちゃう。

vi /etc/rc.conf
(追加)samba_enable="YES"

でもって、文字コードにUTF8やCP932を指定したりする。
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

[homes] ※すべてコメントアウト
[printers] ※すべてコメントアウト

[FreeNAS1] ※ネーミングはFreeNAS時代の名残り
comment = FreeNAS1
path = /mnt/kfs01/FreeNAS1
public = yes
writable = yes
printable = no
guest ok = yes
only guest = yes
browseable = yes


ちなみにja-sambaの場合↓
cd /usr/ports/japanese/samba3
make config
make NO_CHECKSUM=yes
make install clean
あとは一緒。

/usr/local/etc/rc.d/samba start

■Webmin
sysinstallで導入しとく。

vi /etc/rc.conf
(追加)webmin_enable="YES"


■Postfix
■rsyncd
■smartd

0 件のコメント: