ここのことはなかったことにするかもしれない

仕事がらみの記事を主として扱いますが、あくまで個人ブログです。2013年以前の記事は https://yellow-73.hatenablog.com/ にあります。

フルにZFSにしてみた

RAIDカードがアレだったでござるのでZFSにしたった - ここのことはなかったことにするかもしれない の続きです。

これまでのあらすじ

H310は以下略

前提

  • Dell Power Edge R320, RAIDカードは H310 で RAID は切ってます。
  • HDDは3G*4本で、FreeBSDからは mfisyspd0 - mfisyspd3 となっているとします。
  • raidz1 (RAID5相当) にします。
  • rpool というプールを作り、その下に rpool/root, rpool/home のファイルシステムを作ります。
  • rpool/root をルートファイルシステムとします。
  • rpool/home は /home にマウントします。

参考情報(再掲)

http://kanjuku-tomato.blogspot.jp/2013/01/freebsd-91-release-zfs-root-filesystem.html でほぼOKです。

RAID 5にする場合には http://d.hatena.ne.jp/SeishiONO/20120813/1344865725 あたりも見ながら行きます。

パーティションを切る

いつものインストールでパーティションを切る直前まで行き、ここで"Shell"を選択。

まずパーティションが残ってるようなら強制削除してやる。
gpart destroy -F /dev/mfisyspd0

gptを作成

gpart create -s gpt /dev/mfisyspd0
gpart create -s gpt /dev/mfisyspd1
gpart create -s gpt /dev/mfisyspd2
gpart create -s gpt /dev/mfisyspd3

ブートパーティションを作成

gpart add -s 64K -t freebsd-boot /dev/mfisyspd0
gpart add -s 64K -t freebsd-boot /dev/mfisyspd1
gpart add -s 64K -t freebsd-boot /dev/mfisyspd2
gpart add -s 64K -t freebsd-boot /dev/mfisyspd3

swapを作成

(64G必要かといえば必要ないような気がしますがまあ古い人だということで)
gpart add -s 64G -t freebsd-swap /dev/mfisyspd0
gpart add -s 64G -t freebsd-swap /dev/mfisyspd1
gpart add -s 64G -t freebsd-swap /dev/mfisyspd2
gpart add -s 64G -t freebsd-swap /dev/mfisyspd3

zfsパーティションを作成

gpart add -t freebsd-zfs -l disk0 /dev/mfisyspd0
gpart add -t freebsd-zfs -l disk1 /dev/mfisyspd1
gpart add -t freebsd-zfs -l disk2 /dev/mfisyspd2
gpart add -t freebsd-zfs -l disk3 /dev/mfisyspd3

bootcode書き込み

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/mfisyspd0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/mfisyspd1
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/mfisyspd2
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/mfisyspd3

全てのHDDにブートコードを書いていますが、これはHDD0が壊れた際でもブートするようにするためです。

zfsのプールとかを作る

プールを作り /tmp/zfs にマウント

/tmp/zfsを仮ルートとして、"rpool"という名前のプールを作ります。
この際、gtp/disk0-3 を組み入れた raidz1 (RAID5相当)とします。

zpool create -f -o altroot=/tmp/zfs rpool raidz1 \
  /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 /dev/gpt/disk3
rootとhomeのパーティションを作成

rpool/rootには128Gの制限をかけました。

zfs create rpool/root
zfs create rpool/home
zfs set quota=128G rpool/root
ブートパーティションをrpool/rootにする
zpool set bootfs=rpool/root rpool

インストール

tar xzpf /usr/freebsd-dist/base.txz -C /tmp/zfs/rpool/root
tar xzpf /usr/freebsd-dist/kernel.txz -C /tmp/zfs/rpool/root

なお、後で出てくるzfsチェックツールは src.txz にあるので、それも展開して下さい。

設定ファイルを記述

loaderでzfsモジュールを読むことと、ルートをrpool/rootとすることを設定します。zfsモジュールが依存するopensolarisモジュールはzfsを読む場合に自動で読みます。

vi /tmp/zfs/rpool/root/boot/loader.conf

zfs_load="YES"
vfs.root.mountfrom="zfs:rpool/root"

/etc/rc.d/zfs を実行できるようにします。

vi /tmp/zfs/rpool/root/etc/rc.conf

zfs_enable="YES"

レガシーなマウント登録を書きます。
最低でもfreebsd-swapのぶんは登録する必要があります。

また、zfsのマウントもレガシーにしたい(後述)ので、もうここで書いちゃいましょう。

vi /tmp/zfs/rpool/root/etc/fstab

/dev/mfisyspd0p2 none swap sw 0 0
rpool/home       /home zfs rw 0 0

zpool.cache を作る

zfs umount -a
mkdir /tmp/tmp
mount -t tmpfs tmpfs /tmp/tmp
zpool export rpool
zpool import -o cachefile=/tmp/tmp/zpool.cache -o altroot=/tmp/zfs rpool
cp -p /tmp/tmp/zpool.cache /tmp/zfs/rpool/root/boot/zfs/

zfsファイルシステムをレガシーな登録にする

rpool自体のマウントは切って、rpool/root, rpool/homeはlegacyにします。

zfs set mountpoint=none rpool
zfs set mountpoint=legacy rpool/home
zfs set mountpoint=legacy rpool/root

rpool/home は fstab でマウントさせます(前述)。rpool/rootはboot時にルートファイルシステムと認識されるように設定されています(前述)。

リブート

最終確認として zfsboottest を使うことができますが、ソースを入れたうえでコンパイルする必要があります。

最終確認を行い、または最終確認をすっとばしてリブートを実行します。

この際、 /home がマウントできないとか言われてブートが止まったら、あわてず mkdir /home を実行します。

zfsboottestの利用

src.txz を展開しているものとします。

cd (rpool/rootをマウントしているフォルダ)/usr/src/tools/tools/zfsboottest
vi Makefile
  "-Werror" を消す
vi zfsboottest.c
  "#include"を固めて書いてあるところで #include "libzfs.h" を入れる。

make && make DESTDIR=/tmp/zfs install
env PATH=$PATH:/tmp/zfs/usr/bin sh ./zfsboottest.sh rpool
...
The "mountpoint" property of dataset "rpool/root" should be set to "legacy".

前の方ではしれっと「レガシー」とか書かれていましたが、念のためレガシーなマウントにしておいた方がいいよ、と言われたからです。

リブート後

何も設定されていない状態です。
rootで入って sysinstall を実行します。

  • Configure/Packages -> どこかのサイトを開こうとする -> ネットワーク設定できてる? と聞かれるので NO -> 設定画面が出てくる
  • Configure/Root Password -> rootのパスワード設定
  • Configure/Console/Keymap -> Japanese 106 (jp106)に
  • Configure/Time Zone -> Asia/Japan (JST)に
  • Configure/Network -> sshを入れる(任意ですね)

ここまでやってリブートします。

まとめ

面倒なのと、キャッシュが実は理解できていないのですが、これでとりあえずフルZFSになりました (ブートパーティションとswapはZFSじゃないですが)。

こんなかんじになってたらできあがりです。

# zpool status
...
        NAME           STATE     READ WRITE CKSUM
        rpool          ONLINE       0     0     0
          raidz1-0     ONLINE       0     0     0
            gpt/disk0  ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0