パーティションをshellで設定してRoot on ZFSにFreeBSD11インストール

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

FreeBSD10の入ったZPOOLから別のディスクにリストアしようとしましたがうまくいかず、FreeBSD11をクリーンインストールしました。FreeBSD11をインストールする時、ディスクを丸ごと使うなら自動モードで簡単にZFSとして使えます。細かくパーティションを分けて使おうとすると、shellから自分で設定する必要があります。かなりハマったので、メモとして残しておきます。

インストールしたホストは、i7、メモリ16GB、SSD 512GBを使用しています。

[amazonjs asin="B004FA8NOQ" locale="JP"] [amazonjs asin="B01EW6WLY0" locale="JP"]
  1. インストールメディアの作成
  2. インストーラ起動
  3. GPTパーティション作成
  4. ZPOOL作成
  5. もろもろ設定
  6. 起動設定
  7. 再起動

1. インストールメディアの作成

まずは、FreeBSDのインストールメディアを作ります。USBメモリを使うのが便利です。次のウェブページからリンクをたどり、"…-amd64-memstick.img"をダウンロードします。例えば、"FreeBSD-11.0-RELEASE-amd64-memstick.img"です。

この後、ダウンロードしたイメージファイルをUSBメモリに書き込みます。ofで、USBメモリスティックを指定するのですが、これを間違うと既存のデータを破壊してしまいます。macOSの場合だと、diskutil listを、USBメモリを挿す前と挿した後で違いを見ればわかります。以下の例は、/dev/disk6だった場合です。

$ diskutil umountDisk /dev/disk6
$ sudo dd if=FreeBSD-11.0-RELEASE-amd64-memstick.img of=/dev/disk6 bs=512k
$ diskutil eject /dev/disk6

インストールメディアを作る時、最初私は、USBメモリに書き込むイメージファイルとして、DVD用イメージを使っていて、USBメモリから起動できずに困りました。

2. インストーラ起動

起動すると次の画面になるので、Installを選びます。

Install開始

次にキーボードを設定します。

キーボード選択

次にホスト名を設定します。

ホスト名設定

追加でインストールするパッケージを選びます。

オプション

3. GPTパーティション作成

この記事のメインイベント、Shell起動です。Shell起動後、以下の手順で、GPTパーティション作成とZPOOL作成を進めます。

Shell起動

まずは、GPTパーティションの作成です。

# gpart destroy ada0
# gpart create -s gpt ada0
# gpart add -a 4k -t freebsd-boot -s 512k ada0
# gpart add -a 4k -t freebsd-zfs -s 128G -l zroot ada0
# gpart add -a 4k -t freebsd-zfs -s 8G -l zil ada0
# gpart add -a 4k -t freebsd-zfs -l l2arc ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

使用中のディスクだとgpart destroyでエラーになります。その場合はdestroyの後に-Fオプションをつけて、強制的にdestroyできます。

まず、gpart createでGPTディスクにします。

その後、gpart addで、起動領域、データ領域、キャッシュ領域の確保をします。-a 4kをつける事で、4kアラインのAFTディスクに対応できます。freebsd-bootは512kで、設定可能な最大サイズにします。zil(ログ)領域を確保しておきます。この大きさは、メインメモリの半分にします。使用しているホストは16GBのメモリを載せているので、8GBを指定しています。残りの領域をl2arc用(キャッシュ)に確保しておきます。

gpart bootcodeでブートローダーを書き込みます。

4. ZPOOL作成

次に、ZPOOLの設定です。

# zpool create -R /mnt rpool gpt/zroot
# zfs create rpool/root
cannot mount '/mnt/rpool/root': failed to create mountpoint
filesystem successfully created, but not mounted
# zfs set mountpoint=/ rpool/root
# zpool export rpool
# zpool import -R /mnt rpool
# zfs create rpool/root/tmp
# zfs create rpool/root/var
# zfs create rpool/root/usr
# zfs create rpool/root/usr/local

まず、zpoolでZFSのプールを作成します。-R /mntで、/mntにマウントされる様にするのが肝です。

zfs createでrootと言う名前のデータセットを作り、この下に各データセットを作ります。2段構成にするのは、snapshotをsend/recvでリストアする時に簡単に出来るようにする為です。

ただ、この時点で、/mnt/rpool/rootを作れないと言うエラーになります。この為、set mountpoint=/を設定します。設定後、正しくマウントさせる為に、一旦exportして、再度importします。この時も-R /mntが必要です。

この後、var, tmp, usr, usr/localを作ります。この辺りはお好みで。

この設定が終わったら、ctrl+dで抜ます。

5. もろもろ設定

インストーラに戻ると、インストール(ディスクへの書き込み)が始まります。

インストール中

ディスクへの書き込み終了後、rootのパスワード設定になります。

rootパスワード設定

ネットワークを設定します。

ネットワーク設定

時間を設定します。必ず、UTCで設定してください。

時計設定

起動サービスを選びます。

起動サービス

セキュリティ関係の設定みたいですが、よくわかりません。

セキュリティ設定

root以外にユーザを追加する場合は、設定します。

ユーザ追加

心残りが無いか、聞かれます。

最終設定

6. 起動設定

最後に、shellを起動するか聞かれます。

Shell起動

インストール終了後、再起動の前にもう一度shellを起動するか聞かれますので、Yesを選んで、shellを起動します。そして、次のコマンドを入力します。

# zpool set bootfs=rpool/root rpool
# vi /mnt/etc/rc.conf

まず、起動システムとして、rpool/rootを使う設定をします。この設定をしないと、起動時に、"Can’t find /boot/zfsloader"と言うエラーになります。

zfsloader

そして、/mnt/etc/rc.confに次の行を追加します。

zfs_enable="YES"

これを追加しないと、zfs createで作ったデータセットをマウント出来なくて、例えば"can’t exec getty"と言うエラーになります。他のエラーも出ています。

getty

この設定が終わったら、ctrl+dで抜けて、インストーラに戻ります。

7. 再起動

再起動

Rebootを選んで再起動が成功すれば完成です。

参考にさせていただいたウェブページ

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

Posted by お市のかた