うちでは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でフォーマットされているのでこれをクリアしてセットアップ開始。

  1. まずは確認
    camcontrol devlist
    gpart show da0
  2. 上の出力を見てMBRパーティションテーブルを消去
    gpart delete -i 1 da0
    gpart destroy da0
  3. GPTパーティションを作ってZFS-only FreeBSDの起動ディスクにする
    gpart create -s gpt da0
    gpart add -b 34 -s 128 -t freebsd-boot da0
    gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
    gpart add -b 162 -t freebsd-zfs -l usbdisk0 da0
  4. USBメモリなのでnoatimeが重要
    zpool create -o atime=off zusbroot /dev/gpt/usbdisk0
  5. 事前に/tmp, /var, /usr/localなどはパーティションを分けておく(/tmpはメモリが潤沢にあるならtmpmfs推奨)
  6. 現在の/zrootだとして、zusbrootにコピーする手順
    zfs snaptshot zroot@now
    zfs send zroot@now | zfs receive -F zusbroot
    zfs destroy zroot@now
  7. 新しい/boot/loader.confvfs.root.mountfrom="zfs:zusbroot"を設定
    vi /zusbroot/boot/loader.conf
  8. 新しい/etc/fstabzusbroot / zfs rw 0 0を設定
    vi /zusbroot/etc/fstab
  9. /usrを分けている場合は/usrも作ってコピーした後、zfs unmountしてからマウントポイントを/usrに設定
    zfs unmount zusbroot/usr
    zfs set mountpoint=/usr zusbroot/usr
  10. /は自動マウントの対象外
    zfs set mountpoint=legacy zusbroot
  11. あとは/root/usr/share/man/**/cat*などを何とかして、平時はread onlyにしたい
    zfs set -o readonly=on zusbroot
    zfs set -o readonly=on zusbroot/usr

何か抜けてるかもしれないし間違ってるかもしれないので自分で意味を考えながらリスクを承知でやってください。

リセットしてF10でBIOSセットアップに入って二箇所(USB Device Boot PriorityをHighにして、起動デバイス順序でUSBメモリを他のHDDより上に移動)直したら、ちゃんとブートするか確認。
うまく起動できたら、もう一つUSBメモリを背面にでも差して、da1について同様に設定する。zpool createのプール名をzusbroot2のように変え、今度は上記操作をzusbrootzusbroot2と読み替えればいい。以後、大きめのアップグレード、特にZFSのバージョンが上がった際にrsync -xaHAXでファイルを同期し、gpart bootcodeでbootcodeの更新を行えばいいだろう。寿命を気にしてのUSBメモリ化なのでミラーリングはしない。なお、最初はattachでミラー後にdetachして置いておけばいいかと思ったら、detachした時点でどこのプールにも属さなくなってしまうため、/をマウントできずブートできないディスクになってしまうのでダメだ。
最後に、時々はsudo find -x / -mtime -1hで最近いじられたファイルやディレクトリがないかを調べ、da0に頻繁に書き込みアクセスが発生したりしていないか見るといいだろう。また、gstat(8)も見た方がいい。俺はそれでatime=offし忘れに気付いたりした。
そんな感じで、うちのサーバは赤いやつで動いています。

Tags : , ,
Categories : Tech