2008-12-30

zfs導入

せっかくディスクの移行をするんだからと、えいやでzfsに移行。

How to install FreeBSD 7.0 under ZFSを参考書として全面依存。のうはうの「ZFSメンテナンスの日々」シリーズが副読本。

方針は簡素。

  • boot以外はすべてzfsに。
  • SSD 2個でmirror構成。
  • home以外はatime=offで。

カーネル変更

ZFS Tuning Guideを参考に

  • option KVA_PAGES=512をconfigに加えてkernelを作り直し
  • loader.confに以下を追加してhalt
    zfs_load="YES"
    vm.kmem_size="512M"
    vm.kmem_size_max="512M"
    vfs.zfs.zil_disable="1"
    

DISK初期化

これまで使ってなかったSATAのコネクタ2つ(2つしかない(涙))にSSDを2台接続して起動。すると、ad4, ad6として認識。ad5が飛ばされているのが面白い。

kamui$ dmesg | grep 'ad[46]'
ad4: FAILURE - SET_MULTI status=51<READY,DSC,ERROR> error=4<ABORTED>
ad4: 30520MB <MTRON MSD-SATA3525 0.19R1H2> at ata2-master UDMA100
ad6: FAILURE - SET_MULTI status=51<READY,DSC,ERROR> error=4<ABORTED>
ad6: 30518MB <MTRON MSD-SATA3525 0.19R1H2> at ata3-master UDMA100

妙なエラーが出てるが、ネットで調べると、サポートしてないコマンドがあるってだけで問題ないらしいので以後は無視。「のうはう」に習いsade(8)を利用し、Disk Partition切りとdisklabel書きをおこなう。swapサイズはA = Auto DefaultsでDisklabel Editorに計算させたのを使った。以下、Aを押下した状態。どうでもいいことだが、/ が512MBって少なすぎだな。

                         FreeBSD Disklabel Editor

Disk: ad4       Partition name: ad4s1   Free: 0 blocks (0MB)

Part      Mount          Size Newfs   Part      Mount          Size Newfs
----      -----          ---- -----   ----      -----          ---- -----
ad4s1a    /             512MB UFS2   Y
ad4s1b    swap         1894MB SWAP
ad4s1d    /var         1971MB UFS2+S Y
ad4s1e    /tmp          512MB UFS2+S Y
ad4s1f    /usr        25629MB UFS2+S Y

ともあれ、これを編集して以下のようにする。partition dは、mountpointを適当に指定して作ったあと、M = Mount pt.で値を空にする。

                         FreeBSD Disklabel Editor

Disk: ad4       Partition name: ad4s1   Free: 0 blocks (0MB)

Part      Mount          Size Newfs   Part      Mount          Size Newfs
----      -----          ---- -----   ----      -----          ---- -----
ad4s1a    /            1024MB UFS2   Y
ad4s1b    swap         1894MB SWAP
ad4s1d    <none>      27601MB *      

このまま書き込むと、partition dはUFS2扱いになってしまうので、念のためbsdlabel(8)でunknownに変更しておく。

kamui$ bsdlabel ad4s1
# /dev/ad4s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:  2097152        0    4.2BSD     2048 16384 28552 
  b:  3878912  2097152      swap                    
  c: 62504001        0    unused        0     0         # "raw" part, don't edit
  d: 56527937  5976064    unused        0     0       

ところで、今回購入したSSD 4個のうち、kamuiのad6にした個体だけ容量が2MB ほど足りなかった(先のdmesgの出力参照)。なので、partitiion dが残り3個と同じになるようswapの数値を減らして調整している。

zfs設定

mirror構成でzpool作成。

# zpool create tank ad4s1d ad6s1d

一気にzfs filesystemを作成。tank/ncvsを作るのがkamui。tank/newsを作るのがgambaになる。tank/var, tank/tmpcopies=3はどうよ? とも思うのだが、とりあえずこれで様子見をする。変更は簡単だし。

# zfs set atime=off tank
# zfs create -o compression=gzip                         tank/root
# zfs create -o compression=gzip -o copies=3 -o atime=on tank/home
# zfs create -o compression=gzip                         tank/usr
# zfs create                     -o copies=3             tank/var
# zfs create                     -o copies=3             tank/tmp
# zfs create                                             tank/distfiles
# zfs create -o compression=gzip                         tank/ncvs (or tank/news)

tank/rootをrootにし、データ移行のためにtank/usr以下を実際の相対位置に変更。最初っからfilesystem名をmountpointと同じにしときゃいい話なんだが、そこは趣味ということで。さらに言えば、tankのmountpointをnoneにした段階で、すべてのfilesystemのmountは外れてしまうので、手間は変わらないのだ。

# zfs set mountpoint=none tank
# zfs set mountpoint=/tank tank/root
# zfs set mountpoint=/tank/usr tank/usr
# zfs set mountpoint=/tank/var tank/var
# zfs set mountpoint=/tank/tmp tank/tmp
# mkdir /tank/usr/ports
# zfs set mountpoint=/tank/usr/ports/distfiles tank/distfiles
# zfs set mountpoint=/tank/usr/home tank/home
# zfs set mountpoint=/tank/usr/home/ncvs tank/ncvs
# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
tank             354K  26.3G    25K  none
tank/distfiles    18K  26.3G    18K  /tank/usr/ports/distfiles
tank/home         19K  26.3G    19K  /tank/usr/home
tank/ncvs         18K  26.3G    18K  /tank/usr/home/ncvs
tank/root         18K  26.3G    18K  /tank
tank/tmp          18K  26.3G    18K  /tank/tmp
tank/usr          32K  26.3G    32K  /tank/usr
tank/var          18K  26.3G    18K  /tank/var

zfs set mountpoint=fooすると、ディレクトリfooは自動で作られる。もしかしたらmkdir -p foo相当のことをしてくれている可能性もある。途中mkdirしてるんだけど、要らなかったのかも。

データ移行

作業前にincomingなデータを扱うdaemonを停止。メールだけは半端にできないんで止めとかきゃ、程度。single userにしないあたりがいいかげんなところである。データコピーはcpioで。いやぁ、cpioって始めて使ったよ。

# cd /
# find -x / | cpio -pmd /tank

UFS2なpartition aに、single user bootできるようminirootを作成しておく。

# echo .[cp]* [Cbdelpr]* sbin
.cshrc .profile COPYRIGHT bin boot dev dist entropy etc lib libexec proc rescue root sbin
# for i in 4 6; do
> newfs /dev/ad${i}s1a
> mount /dev/ad${i}s1a /mnt
> find -x .[cp]* [Cbdelpr]* sbin | cpio -pmd /mnt
> mtree -f /etc/mtree/BSD.root.dist -p /mnt
> umount /mnt
> done

小細工

7.0-RELEASEではまだzfsでbootできない。のうはう: ZFSメンテナンスの日々 #7 ZFS Boot 編みたくzfsbootを導入すればできなくもないらしいが、まぁ、RELEASEでサポートされるまで待つってことで、参考書通りに小細工をする。

# rm -rf /tank/boot
# mkdir /tank/bootdir
# ln -s bootdir/boot /tank/boot

/tank/boot/loader.confvfs.root.mountfrom="zfs:tank/root"を追加。念のため、fstabも適当に作っておく。

# for i in 4 6; do
> mount /dev/ad${i}s1a /mnt
> echo 'vfs.root.mountfrom="zfs:tank/root"' >> /mnt/boot/loader.conf
> cat <<EOF >/mnt/etc/fstab
> # Device		Mountpoint	FStype	Options		Dump	Pass#
> /dev/ad${i}s1a		/               ufs	rw		1	1
> /dev/ad${i}s1a		none		swap	sw		0	0
> /dev/acd0		/cdrom		cd9660	ro,noauto	0	0
> EOF
> umount /mnt
> done

/tank/etc/fstabも参考書通りに用意。

# cat /tank/etc/fstab 
# Device		Mountpoint	FStype	Options		Dump	Pass#
/dev/ad4s1a		/bootdir	ufs	rw		1	1
/dev/ad4s1b		none		swap	sw		0	0
/dev/acd0		/cdrom		cd9660	ro,noauto	0	0

ここで優雅な環境をあきらめ、shutdown nowしてsingle userへ。

# shutdown now
# cd /

tank以下のmountpointを実位置に

# zfs set mountpoint=/usr tank/usr
# zfs set mountpoint=/var tank/var
# zfs set mountpoint=/tmp tank/tmp
# zfs set mountpoint=/usr/ports/distfiles tank/distfiles
# zfs set mountpoint=/usr/home tank/home
# zfs set mountpoint=/usr/home/ncvs tank/ncvs

tank/rootはboot時に/にmountされるので、automountされないようにmountpoint=legacyをセット

# zfs set mountpoint=legacy tank/root

これで終り。あとはrebootして様子を眺める。ふっふっふ。

完了

homeをcopies=3にしてるため、kamuiでは移行前より膨れ上ってしまった。gambaでは減っている。

oldkamui$ df -h
Filesystem        Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a        35G     13G     19G    41%    /
devfs             1.0K    1.0K      0B   100%    /dev
kamui$ df -h
Filesystem        Size    Used   Avail Capacity  Mounted on
tank/root         8.3G     22M    8.3G     0%    /
devfs             1.0K    1.0K      0B   100%    /dev
/dev/ad4s1a       989M    232M    678M    25%    /bootdir
tank/tmp          8.3G      0B    8.3G     0%    /tmp
tank/usr           12G    3.3G    8.3G    28%    /usr
tank/home          21G     12G    8.3G    59%    /usr/home
tank/ncvs         9.6G    1.3G    8.3G    13%    /usr/home/ncvs
tank/distfiles    9.2G    908M    8.3G    10%    /usr/ports/distfiles
tank/var          8.7G    339M    8.3G     4%    /var
oldgamba$ df -h
Filesystem        Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a        35G     21G     11G    65%    /
devfs             1.0K    1.0K      0B   100%    /dev
fdescfs           1.0K    1.0K      0B   100%    /dev/fd
gamba$ df -h
Filesystem        Size    Used   Avail Capacity  Mounted on
tank/root          21G    7.4M     21G     0%    /
devfs             1.0K    1.0K      0B   100%    /dev
/dev/ad4s1a       989M    230M    680M    25%    /bootdir
fdescfs           1.0K    1.0K      0B   100%    /dev/fd
tank/tmp           21G    128K     21G     0%    /tmp
tank/usr           22G    1.2G     21G     5%    /usr
tank/home          22G    941M     21G     4%    /usr/home
tank/news          23G    1.7G     21G     7%    /usr/local/news
tank/distfiles     21G    232M     21G     1%    /usr/ports/distfiles
tank/var           22G    1.1G     21G     5%    /var

kamui側のsnapshotをどう採るかを考えないと。homeのsnapshotを多く確保するなら、copies=2にしてしまった方がいいかもしれない。これは正月かけてゆっくり検討しよう。

ところで、compression=gzipしてるところでは、妙なものを見ることができる。

$ ls -l /usr
total 80
lrwxrwxrwx   1 root  wheel   10 Dec 28 22:58 X11R6 -> /usr/local
drwxr-xr-x   2 root  wheel  424 Dec 28 19:07 bin
drwxr-xr-x   2 root  wheel    2 Jan  8  2006 compat
drwxr-xr-x   2 root  wheel   16 Dec 28 19:29 games
drwxr-xr-x   9 root  wheel    9 Dec 29 02:11 home
drwxr-xr-x  47 root  wheel  243 Dec 28 19:08 include
drwxr-xr-x   6 root  wheel  468 Dec 28 19:08 lib
drwxr-xr-x   5 root  wheel    5 Dec 28 19:08 libdata
drwxr-xr-x   5 root  wheel   61 Dec 28 19:08 libexec
drwxr-xr-x  16 root  wheel   16 Dec 28 19:18 local
drwxr-xr-x   3 root  wheel    3 Dec 28 19:47 obj
drwxr-xr-x  70 root  wheel   84 Jan  1 03:08 ports
drwxr-xr-x   2 root  wheel  265 Dec 28 19:18 sbin
drwxr-xr-x  26 root  wheel   26 Dec 28 19:21 share
drwxr-xr-x  23 root  wheel   31 Dec 28 19:29 src

ディレクトリのサイズがこんな半端なものになってるのを見たのは始めてだ。もちろん一般ファイルでは圧縮前のサイズが表示される。

こぼれ

移行後、innがやたらとエラーを吐くようになった。

Dec 30 12:54:58 gamba innd: tradindexed: index inode mismatch for fj.soc.politics
Dec 30 12:54:58 gamba innd: tradindexed: index inode mismatch for 9759A691F86C6A2C5599913D8E50BA82
Dec 30 12:54:58 gamba innd: tradindexed: index inode mismatch for japan.jiji
Dec 30 12:54:58 gamba innd: tradindexed: index inode mismatch for 9CE72130FD3C736BCCFA4C4416FC66EF
Dec 30 12:54:58 gamba innd: tradindexed: index inode mismatch for 9759A691F86C6A2C5599913D8E50BA82
Dec 30 12:54:58 gamba innd: tradindexed: index inode mismatch for 9CE72130FD3C736BCCFA4C4416FC66EF

再度、~news以下を被せ直したりしても直らない。ので、あれこれググるとtdx-util -Fで直せることがわかった。要は、overviewのIDXファイル中にi-node番号が入っているかららしい。

0 件のコメント:

コメントを投稿