FreeBSD9でFull ZFSシステム作成の実験[追記あり]

2017年6月14日NAS,パソコン・インターネット

FreeBSD勉強シリーズの一環です。

FreeBSDでの魅力と言えば、やはり、ZFS。色々調べていたら、bootパーティション以外を、ZFSにしてインストールする方法が出ていました。

大変参考になりました。ありがとうございます。

これらの資料を元に、FreeBSDインストールの実験をしました。実験と言うのは、Parallelsに、次のスペックの仮想マシンを作って、実際にインストールしました。

  • メモリ … 4GB
  • HDD0(SSD) … 9GB (システム、スワップ、ZIL用)
  • HDD1 … 1GB (データ用。RAIDZ)
  • HDD2 … 1GB (データ用。RAIDZ)
  • HDD3 … 1GB (データ用。RAIDZ)
  • HDD4 … 1GB (データ用。RAIDZ)
  • USBメモリ … 32GB (L2ARC用)

(追記 2014-03-30 20:31 実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。)

このスペックの仮想マシンに、とりあえずインストールしました。インストールして起動確認したまでで、使い込んではいないのですが、実験はできました。また、スワップ・パーティションの準備はしていないのですが、ファイルとしてZFSプールに置くつもりです。

インストールは、次の手順でした。一応、インストールから起動までは確認できたのですが、私がZFSを完全に理解している訳ではないので、間違った事を書いているかもしれません。その時は、お知らせください。

上記二つの資料を読んだ上で、私なりの改良を加えたシステムになっています。

  • ZILのサイズはメインメモリの半分にした
  • L2ARCのサイズは、メインメモリよりも大きくした
  • L2ARCはUSBメモリに置いた
    • ZIL/L2ARCはSSDに置くのが効果的だが、大容量のSSDは高い

(追記 2014-03-30 20:31 実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。)

ZIL/L2ARCについては、次の資料を参考にしました。ありがとうございます。

次の順序でインストールしました。

  1. システム用ディスクの準備
  2. L2ARC用のUSBを準備
  3. データ用ディスクの準備
  4. ZFSカーネルのロード
  5. システム用プール(rpool)の作成
  6. データ用プール(upool)の作成
  7. ZILとL2ARCの設定
  8. rc.confとloader.confの設定
  9. システム用プール(rpool)のマウントポイントの設定
  10. データ用プール(upool)のマウントポイントの設定
  11. システムのインストール

それでは、順に説明して行きます。

1. システム用ディスクの準備

まずは、つながっているデバイス名を調べ、GPTパーティションを切ります。boot用、システム用、ZIL用の3つです。

# dmesg | grep MB
# gpart destroy ada0
# gpart create -s gpt ada0
# gpart add -s 64k -t freebsd-boot ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart add -s 2G -t freebsd-zfs -l zil ada0
# gpart show
# gpart add -s 7G -t freebsd-zfs -l zroot ada0

最後の7Gが、システム用になります。実際には、"-s 7G"ではなく、"gpart show"で調べたサイズ、"-s 14679869″を指定しています。gpart showでfreeとなっている大きさを直接指定しています。

なお、2回目以降同じディスクに再インストールする場合、gpard destroyに失敗すると思います。"-F"オプションを付けると、強制的にdestroyできます。

2. L2ARC用のUSBを準備

l2arc用には、USBメモリを割当てています。本当はSSDに前提で組むのが良いですが、大容量のSSDは高いので、代わりにUSBメモリを使っています。壊れたら、買い直せば良いし。

(追記 2014-03-30 20:31 実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。)

# gpart destroy da0
# gpart create -s gpt da0
# gpart show
# gpart add -s 60532925 -t freebsd-zfs -l l2arc da0

3. データ用ディスクの準備

データプール用のディスクを初期化します。これは、機械的に作業を進めるだけです。

まずは、GPTを破壊します。

# gpart destroy ada1
# gpart destroy ada2
# gpart destroy ada3
# gpart destroy ada4

GPTパーティションテーブルを作ります。

# gpart create -s gpt ada1
# gpart create -s gpt ada2
# gpart create -s gpt ada3
# gpart create -s gpt ada4

ZFSとしてパーティションを作り、ラベル名を与えます。

# gpart add -t freebsd-zfs -l disk0 ada1
# gpart add -t freebsd-zfs -l disk1 ada2
# gpart add -t freebsd-zfs -l disk2 ada3
# gpart add -t freebsd-zfs -l disk3 ada4

4. ZFSカーネルのロード

ZFS関連のカーネルモジュールをロードします。これらのカーネルモジュールをロードしないと、zpool, zfsコマンドが使えません。

# kldload opensolaris
# kldload zfs

5. システム用プール(rpool)の作成

# zpool create -o altroot=/media rpool /dev/gpt/zroot
# zfs create rpool/root
# zfs create rpool/root/tmp
# zfs create rpool/root/var
# zfs create rpool/root/usr
# zfs create rpool/root/usr/local
# zfs create -o compression=lzjb -o setuid=off rpool/root/usr/ports
# zfs create -o compression=off -o exec=off -o setuid=off rpool/root/usr/ports/distfiles
# zfs create -o compression=off -o exec=off -o setuid=off rpool/root/usr/ports/packages

/usr/portsは、圧縮をかける設定にしてみました。

6. データ用プール(upool)の作成

# zpool create upool raidz1 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 /dev/gpt/disk3
cannot mount '/upool': failed to create mountpoint
# zpool status -v upool

エラーは出たけれど、upool自体はできているみたいです。

(追記 2017-06-14 20:01 “/"がread onlyになっているため、"/upool"を作れなかったと言うエラーです。)

# zfs create upool/home
# zfs set mountpoint=/media/usr/home upool/home

mountするのは、2段目にします。スナップショットをzfs recvでリストアする時に簡単にする為です。詳しくは、次のページからダウンロードできるPDFの45ページ目をご覧下さい。(追記 2017-06-14 20:01 httpsでつなぐ時にセキュリティエラーがでます。接続はやめておいた方が無難かもしれません。)

7. ZILとL2ARCの設定

ZILとL2ARCは、データ用プール(upool)に対して効く様に設定します。

# zpool add upool cache gpt/l2arc
# zpool add upool log gpt/zil

8. rc.confとloader.confの設定

ZFSシステムを起動時にマウントする為の方法です。マウントには、zpool.cacheと言うファイルが必要だそうです。それを作る為の方法です。

# mkdir -p /media/root/boot
# mkdir -p /media/root/boot/zfs
# mkdir -p /media/root/etc
# echo 'zfs_enable="YES"' >> /media/root/etc/rc.conf
# echo 'zfs_load="YES"' >> /media/root/boot/loader.conf
# echo 'vfs.root.mountfrom="zfs:rpool/root"' >> /media/root/boot/loader.conf
# mount -t tmpfs tmpfs /tmp
# zfs umount -a
# zpool export rpool
# zpool export upool
# zpool import -o cachefile=/tmp/zpool.cache -o altroot=/media rpool
# zpool import -o cachefile=/tmp/zpool.cache -o altroot=/media upool
# cp /tmp/zpool.cache /media/root/boot/zfs/
# zfs umount -a
# umount /tmp

9. システム用プール(rpool)のマウントポイントの設定

今まで作って来たZFSファイルシステムの、マウントポイントを設定します。

# zpool set bootfs=rpool/root rpool
# zpool set cachefile="" rpool
# zfs set mountpoint=none rpool
# zfs set mountpoint=/ rpool/root
# zfs set mountpoint=/tmp rpool/root/tmp
# zfs set mountpoint=/var rpool/root/var
# zfs set mountpoint=/usr rpool/root/usr
# zfs set mountpoint=/usr/local rpool/root/usr/local
# zfs set mountpoint=/usr/ports rpool/root/usr/ports
# zfs set mountpoint=/usr/ports/distfiles rpool/root/usr/ports/distfiles
# zfs set mountpoint=/usr/ports/packages rpool/root/usr/ports/packages
# zfs get -r mountpoint rpool

“zfs get"コマンドで確認するそうです。私の場合、次の様になっていました。

システム用プール

10. データ用プール(upool)のマウントポイントの設定

同様に、データ用プール(upool)のマウントポイントを設定します。

# zpool set cachefile="" upool
# zfs set mountpoint=none upool
# zfs set mountpoint=/usr/home upool/home
# zfs get -r mountpoint upool

“zfs get"コマンドの結果は、次の様になっていました。

データ用プール

11. システムのインストール

いよいよ、システムのインストールです。私の場合、なぜか、いったんexportしてから再importしないと、ディスクが見えませんでした。

# zpool export rpool
# zpool export upool
# zpool import -o altroot=/media rpool
# zpool import -o altroot=/media upool

ファイルを展開します。

# tar xzpvf /usr/freebsd-dist/base.txz -C /media
# tar xzpvf /usr/freebsd-dist/src.txz -C /media
# tar xzpvf /usr/freebsd-dist/kernel.txz -C /media
# tar xzpvf /usr/freebsd-dist/ports.txz -C /media

ファイルを展開し終わったら、再起動します。正しく設定できていたら、起動するはずです。rootへのパスワードさえも設定していませんので、再設定が必要です。

(追記 2013-08-04 01:02)

データ用プールの名前を、"hpool"から"upool"に変更しました。手順そのものは変わりません。

(追記 2013-09-26 22:10)

ラベル名の付け方が気持ち悪かったので、修正しました。手順そのものは変わりません。

(追記 2014-03-30 20:31)

実際のシステムでは、L2ARCにSSDを割り当てています。USBメモリは使っていません。USBメモリを使おうとした所、上手く行かなかった事が主な理由です。

[amazonjs asin="B00Y32OHNM" locale="JP"]

Posted by お市のかた