せっかくディスクの移行をするんだからと、えいやで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
に以下を追加してhaltzfs_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/tmp
にcopies=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.conf
にvfs.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 件のコメント:
コメントを投稿