うちではMLシリーズをいくつも買って160GB HDDがたくさん余っているので、代々サーバの起動ディスクはHDD 二台のミラーリング構成だったんだけど、電気代や発熱の点で無駄なのでUSBメモリ(x2)に変えることにした。
ちょうど、ML110 G6にはオンボードのUSBソケットがありBIOSのサポートで起動ドライブとして選択できるのでこれを利用する。USBメモリは何でもいいが、FreeBSDなので赤いやつにした。FreeBSD/amd64なのでたぶん8GBの壁はないが、どうせ/
だけ(/tmp
, /usr/local
, /var
などは外出し)なので大きくても意味がない。緊急時のために/usr/src
のコピーを持っておき、ビルド用のスペースも残し、それらをひっくるめてメジャーアップグレードする際にZFS snapshotを取る余裕を考えても、8GBもあれば十分だ。
届いたUSBメモリを差すと、(ほかにSCSIやumassのデバイスがなければ)da0
として認識される。初期状態ではFATでフォーマットされているのでこれをクリアしてセットアップ開始。
- まずは確認
12camcontrol devlistgpart show da0 - 上の出力を見てMBRパーティションテーブルを消去
12gpart delete -i 1 da0gpart destroy da0 - GPTパーティションを作ってZFS-only FreeBSDの起動ディスクにする
1234gpart create -s gpt da0gpart add -b 34 -s 128 -t freebsd-boot da0gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0gpart add -b 162 -t freebsd-zfs -l usbdisk0 da0 - USBメモリなので
noatime
が重要
1zpool create -o atime=off zusbroot /dev/gpt/usbdisk0 - 事前に
/tmp
,/var
,/usr/local
などはパーティションを分けておく(/tmp
はメモリが潤沢にあるならtmpmfs
推奨) - 現在の
/
がzroot
だとして、zusbroot
にコピーする手順
123zfs snaptshot zroot@nowzfs send zroot@now | zfs receive -F zusbrootzfs destroy zroot@now - 新しい
/boot/loader.conf
にvfs.root.mountfrom="zfs:zusbroot"
を設定
1vi /zusbroot/boot/loader.conf - 新しい
/etc/fstab
にzusbroot / zfs rw 0 0
を設定
1vi /zusbroot/etc/fstab /usr
を分けている場合は/usr
も作ってコピーした後、zfs unmount
してからマウントポイントを/usr
に設定
12zfs unmount zusbroot/usrzfs set mountpoint=/usr zusbroot/usr/
は自動マウントの対象外
1zfs set mountpoint=legacy zusbroot- あとは
/root
や/usr/share/man/**/cat*
などを何とかして、平時はread onlyにしたい
12zfs set -o readonly=on zusbrootzfs set -o readonly=on zusbroot/usr
何か抜けてるかもしれないし間違ってるかもしれないので自分で意味を考えながらリスクを承知でやってください。
リセットしてF10でBIOSセットアップに入って二箇所(USB Device Boot PriorityをHighにして、起動デバイス順序でUSBメモリを他のHDDより上に移動)直したら、ちゃんとブートするか確認。
うまく起動できたら、もう一つUSBメモリを背面にでも差して、da1
について同様に設定する。zpool create
のプール名をzusbroot2
のように変え、今度は上記操作をzusbroot
→zusbroot2
と読み替えればいい。以後、大きめのアップグレード、特にZFSのバージョンが上がった際にrsync -xaHAX
でファイルを同期し、gpart bootcode
でbootcodeの更新を行えばいいだろう。寿命を気にしてのUSBメモリ化なのでミラーリングはしない。なお、最初はattachでミラー後にdetachして置いておけばいいかと思ったら、detachした時点でどこのプールにも属さなくなってしまうため、/
をマウントできずブートできないディスクになってしまうのでダメだ。
最後に、時々はsudo find -x / -mtime -1h
で最近いじられたファイルやディレクトリがないかを調べ、da0
に頻繁に書き込みアクセスが発生したりしていないか見るといいだろう。また、gstat(8)
も見た方がいい。俺はそれでatime=off
し忘れに気付いたりした。
そんな感じで、うちのサーバは赤いやつで動いています。