2026年8月26日

クアッドブート with rEFInd (その 5/5): FreeBSD (×2) のインストール

Linux ×2、FreeBSD ×2 クアッドブート (with rEFInd) の最終回です。FreeBSD 15.1 を「普段使い用」と「事前評価用」の 2 本立てでインストールします。

なお本稿ではクアッドブートを実現することが目的なので、OS のインストールは最小限にとどめ、より進んだ設定などは別の機会にやりたいと思います。

前々回までのおさらい

ESP (nvme0n1p1) にはすでに rEFInd がインストールされています。また Zorin OS、Artix Linux、FreeBSD (×2) のうち、すでに Zorin OS と Artix Linux が nvme0n1p2 ~ p5 にインストールされている状態です。今回はその後ろに FreeBSD を 2 本追加し (以降、それぞれ「A 面」「B 面」とします)、rEFInd のエントリーを追加します。

インストール先のパーティションは次の 6 ヵ所です:

パーティション用途ディスクラベルファイルシステム備考
/dev/nvme0n1p6

/

freebsd-a-root

UFS

暗号化しない

/dev/nvme0n1p7

/home

freebsd-a-home

UFS

Geli 暗号化

/dev/nvme0n1p8

swap

freebsd-a-swap

Geli 暗号化

/dev/nvme0n1p9

/

freebsd-b-root

UFS

暗号化しない

/dev/nvme0n1p10

/home

freebsd-b-home

UFS

Geli 暗号化

/dev/nvme0n1p11

swap

freebsd-b-swap

Geli 暗号化

ルートパーティション (/) を暗号化しないのは、rEFInd から読み出せるようにするためです。/home とスワップパーティションは Geli で暗号化します。

インストールメディアの作成方法はその 1 の記事を参照してください。

A 面のインストール

過去の FreeBSD インストール記事では、すべての作業が bsdinstall (インストーラー) の GUI で完結していました。ですが今回は特定のパーティション (/home 用のパーティション) を Geli で暗号化したいので、途中で Shell モードに移ってコマンドを打ち込む必要があります。

キーマップの選択やホスト名の決定など

まずいつもどおりにインストールメディアから起動して図 1(a)) のような画面になったら、パーティション編集の手前までインストーラーの指示にしたがって進めます。

  1. Welcome 画面で [Install] を選択します (図 1(a))。
  2. Keymap Selecftion: 好きなキーマップを選択します (図 1(b))。
  3. Set Hostname: ホスト名を決めて入力します (図 1(c))。私は好きな食べ物の名前を付けることが多いです。
  4. Select Installation Type: [Packages (Tech Preview)] を選択します (図 1(d))。FreeBSD 15.0 あたりから?ベースシステムを packages からインストールできるようになったみたいです。
  5. Network or Offline Installation: [Offline (Limited Packages)] を選択します (図 1(e))。

で、Partitioning の画面 (図 1(f)) まできたら、普通は [Auto] とか [Manual] とかでいいと思うんですけど (過去の記事ではずっと Manual でやってました)、今回は /home とスワップを暗号化したいので [Shell] を選択します。

図 1
図 1

パーティション編集

Shell モードのプロンプトが表示されたら、まず暗号化したいパーティションを初期化します。このときパスフレーズの入力を求められるので、2 回入力します。OS 起動時などにこのパーティションをマウントするときに、ここで入力したパスフレーズが必要になります。

# geli init -e AES-XTS -l 256 -s 4096 /dev/nda0p7
Enter new passphrase:
Reenter new passphrase:

上の例では /home 用に確保した /dev/nda0p7 を指定しています。また、暗号化アルゴリズムとして AES-XTS、鍵長 256 ビット、セクタサイズ 4096 バイトを指定しています。セクタサイズは diskinfo -v コマンドの stripesize から判断しました (その 2 の記事 を参照)。各オプションの詳細は geli(8) のマニュアルを参照してください。

で、暗号化したパーティションをアタッチします。ここで早速パスフレーズの入力を求められます。

# geli attach /dev/nda0p7
Enter new passphrase:

アタッチした暗号化パーティションのデバイス名には「.eli」が付きます。この例の場合は「/dev/nda0p7.eli」となります。

次にルート用パーティション、/home 用パーティションをそれぞれ UFS でフォーマットします。-L オプションでラベルを付けておくと、あとで「/dev/ufs/<ラベル名>」で参照できるみたいです。

# newfs -U -L freebsd-a-root /dev/nda0p6
# newfs -U -L freebsd-a-home /dev/nda0p7.eli

両パーティションが bsdinstall から見えるように、/mnt 以下にマウントします。

# mount /dev/ufs/freebsd-a-root /mnt
# mkdir /mnt/home
# mount /dev/ufs/freebsd-a-home /mnt/home

これで Shell モードでの作業は終わりです。exit コマンドで bsdinstall に戻りましょう。

ネットワークの設定など

ここから先はネットワーク環境によって変わってくると思うので、適当に読み替えてください。

  1. Select System Conponents: とりあえずデフォルトのままでいきます (図 2(a))。
  2. システムコンポーネントのインストールが終わるまでしばらく待ちます (図 2(b))。
  3. root のパスワードを入力します (図 2(c))。
  4. Network Configuration: ここから先は、検出されたネットワークインターフェースや、選んだ選択肢によって変わると思われます。私の場合は iwlwifi0 が検出されました (図 2(d))。手動で設定するため [Manual] を選びます。
  5. Regdomain/country: 日本に変更したいので [Yes] を選択。 (図 2(e))。
  6. Regdomain selection: [JAPAN] を選択。(図 2(f))。
  7. Country selection: [JP Japan] を選択。 (図 2(g))。
  8. Wi-Fi のスキャンが始まります (図 2(h))。ANY 接続拒否設定になっている場合はスキップしても構いません。
  9. Network Selection:
    1. 自分ちのネットワークがあれば選択します (図 3(a))。ANY 接続拒否設定になっている場合は [Cancel] を選択します。
    2. ここは手動で設定したいので [Yes] を選択 (図 3(b))。
    3. SSID を入力 (図 3(c))。
    4. 暗号化方式を選択 (図 3(d))。
  10. WPA Setup: WPA2 パスフレーズを入力 (図 3(e))。
  11. IPv4 の設定を行うので [Yes] を選択 (図 3(f))。ここはなんでかよくわからないけど、コンソールの出力?が bsdinstall の画面に乱入してきます。
  12. DHCP による IP アドレスの動的割り当てを受けるので [Yes] を選択 (図 3(g))。
  13. IPv6 の設定は行わないので [No] を選択 (図 3(h))。
  14. DNS サーバの IP アドレスを入力 (図 3(i))。わが家は無線 LAN ルータにおまかせなので、その管理用 IP アドレスを入力します。
図 2
図 2
図 3
図 3

ここでちょっと休憩とします。YouTube で猫ちゃんが飼い主さんにケツをバシバシ叩かれ、恍惚として匍匐前進してしまう動画をみてきます……

タイムゾーンや一般ユーザーの追加など

すみません、再開します。

  1. Time Zone Selector: [Asia] を選択 (図 4(a))。
  2. Countries in Asia: [Japan] を選択 (図 4(b))。
  3. Confirmation: [Yes] を選択 (図 4(c))。
  4. Time & Date はあとで設定するので [Skip] (図 4(d), (e))。
  5. System Configuration と System Hardening はデフォルトのまま (図 4(f), (g))。
  6. FreeBSD Firmware Installation はそのまま [OK] を押す (図 4(h))。前節のようにネットワーク設定をやっておけば、ここで Wi-Fi やら何やらのファームウェアをダウンロードしてくれるみたいです。
  7. しばらく待ちます (図 5(a))。
  8. Add User Accounts で一般ユーザのアカウントをひとつ作っておきます (図 5(b), (c))。
    • Username: miji
    • Full name: mijinco
    • Login group: miji (デフォルト)
    • Login group is miji. Invite miji into other groups?: wheel operator (空白文字で区切って複数指定可)
    • Login class: default (デフォルト)
    • Shell: tcsh (あとで zsh に変更しようと思う)
    • Home directory: /home/miji (デフォルト)
    • Home directory permissions: (空欄)
    • Use password-based authentication?: yes (デフォルト)
    • Use an empty password?: no (デフォルト)
    • Use a random password?: no (デフォルト)
    • Enter password: (パスワード入力)
    • Enter password again: (パスワード再入力)
    • Lock out the account after creation?: no (デフォルト)
  9. Final Configuration で [Finish] を、Manual Configuration で [No] を選択します (図 5(d), (e))。

本来はこれで作業終了です。が、今回は /home やスワップを暗号化する都合でまだ作業が残っているので、図 5(f)) の画面まで来たら [Reboot] を選択して再起動します。

図 4
図 4
図 5
図 5

Geli 暗号化設定

bsdinstall が再起動したら、また Shell モードに入ります (パーティションを切ったときと同じやり方)。

で、まずスワップを初期化します。onetime を指定すれば、使い捨てのキーで暗号化されるのでパスフレーズの入力などをせずに済むみたいです。

# geom eli onetime -d /dev/nda0p8

で、暗号化したパーティションをマウントするための設定を /etc/fstab を書きます。ルートパーティションを /mnt にマウントして、

# mount /dev/ufs/freebsd-a-root /mnt

vi 等で /mnt/etc/fstab (本番環境での /etc/fstab) に次の内容を追記します。

/mnt/etc/fstab (/etc/fstab)
# Device            Mountpoint  FStype  Options Dump    Pass#
/dev/nda0p6         /           ufs     rw      1       1
/dev/nda0p7.eli     /home       ufs     rw      2       2
/dev/nda0p8.eli     none        swap    sw,ealgo=AES-XTS,keylen=128,sectorsize=4096      0       0

/mnt/boot/loader.conf (本番環境での /boot/loader.conf) にも次の 1 行を追記します。

/mnt/boot/loader.conf (/boot/loader.conf)
geom_eli_load="YES"

ちなみにスワップが暗号化できているかは、OS 起動後に swapinfo コマンドの出力でわかります。

% swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/nda0p8.eli   8388608        0  8388608     0%

ルートパーティションをアンマウントします。

# cd
# umount /mnt

これで FreeBSD A 面のインストールは完了です。最後に A 面のエントリーを rEFInd に追加します。

rEFInd に A 面のエントリーを追加する

rEFInd から FreeBSD を起動する方法は、今回のケースでは 2 通り考えられます。

  • 方法 1:  /boot にインストールされた loader.efi から起動する
  • 方法 2:  ESP にコピーした loader.efi から起動する

方法 1 は rEFInd が UFS にある /boot を読めなくてはならないので、UFS ドライバを組み込む必要があり、やや面倒です。しかし方法 2 に見られるようなディスク番号のずれ問題とは無縁です。どちらかといえばこちらが正攻法かなあと思います。

方法 2 は ESP にコピーした loader.efi からカーネルをロードするので、rEFInd が UFS を知っている必要はなく、したがって UFS ドライバが不要です。しかしルートパーティションのディスク番号とパーティション番号を refind.conf にハードコードする必要があり、OS 起動時に USB メモリが挿さっていたりするとディスク番号がずれて、指定したディスクからカーネルをロードできない事態に陥る懸念があります (一応対処法はあります、後述)。その点はいまいちですが、特殊なドライバを追加せずに済むのは補って余りある利点じゃないかなと個人的には思います。

まあ後学のために両方のやり方を書き留めておきます。

方法 1: /boot にインストールされた loader.efi から起動する

この方法は rEFInd に UFS ドライバを組み込む必要があります。ここでは FreeBSD のインストールメディアを使って作業しますが、基本的にはネットから .efi ファイルをひとつゲットして ESP にコピーするだけなので、それができればどんな環境でもかまいません。

まず、例によって FreeBSD インストーラーの Shell モードに入ります。おまけ 1 の手順でインターネットに接続したら、ESP を /mnt などの適当なマウントポイントにマウントし、rEFInd のドライバがあるディレクトリに移動します。

# mount_msdosfs /dev/nda0p1 /mnt
# cd /mnt/EFI/refind/drivers_x64/

そのディレクトリに UFS ドライバをダウンロードします。

# fetch https://github.com/pbatard/efifs/releases/download/v1.12/ufs2_x64.efi

refind.conf にエントリーを追加します。

ESP の /EFI/refind/refind.conf
menuentry "FreeBSD-A" {
    volume freebsd-a-root
    loader /boot/loader.efi
}

ESP をアンマウントして再起動します。

# cd
# umount /mnt
# reboot

パソコンが再起動したら rEFInd のメニューを確認しましょう。「Boot FreeBSD-A from freebsd-a-root」というエントリーが追加されていれば OK です。

方法 2: ESP にコピーした loader.efi から起動する

こちらの方法も FreeBSD のインストールメディアを使って作業します。インストーラーの Shell モードに入ったら、ESP を適当なマウントポイントにマウントします。

# mount_msdosfs /dev/nda0p1 /mnt

そして ESP の中に /EFI/FreeBSD/ というようなわかりやすい名前のディレクトリを作成し、そこにインストールメディアの /boot から loader.efi をコピーします。

# mkdir -p /mnt/EFI/FreeBSD/
# cp /boot/loader.efi /mnt/EFI/FreeBSD/

refind.conf にエントリーを追加します。今しがた ESP にコピーした loader.efi を loader に指定します。また、rootdev にルートパーティションを指定します。ルートパーティションが /dev/nda0p6 なら「rootdev=disk0p6」と書きます。

ESP の /EFI/refind/refind.conf
menuentry "FreeBSD-A" {
    loader /EFI/FreeBSD/loader.efi
    options "rootdev=disk0p6"
}

ESP をアンマウントして再起動します。

# cd
# umount /mnt
# reboot

パソコンが再起動したら rEFInd のメニューを確認しましょう。「Boot FreeBSD-A from xxx MiB FAT volume」というエントリーが追加されていれば OK です。

ここで要注意なのが、ディスク番号は外付けハードディスクなどの有無によって変わってくるという点です。例えばたまたま USB メモリが挿さっていたりすると、そっちが disk0 になり、内蔵ストレージがあおりを食って disk1 になってしまいます。

そういう場合の対処法としては、単に USB メモリを抜いてからパソコンを起動するようにします。あるいはディスク番号が誤っていると OS の起動に失敗して「OK」というプロンプトが表示されるので、次のように手動で正しいディスクとパーティションを指定することもできます。

まず、lsdev コマンドで現在のディスク番号がどうなっているか確認します。

OK lsdev
disk devices:
    disk0:    15141504 X 512 blocks (removable)
      disk0s1: Unknown
      disk0s2: FreeBSD
        disk0s2a: FreeBSD UFS
    disk1:    2000409264 X 512 blocks
      disk1p1: EFI
      ...
      disk1p6: FreeeBSD UFS
      disk1p7: FreeeBSD UFS
      disk1p8: FreeeBSD swap
      ...

この例では disk0 が USB メモリ、disk1 が内蔵ストレージになっています。もともとは内蔵ストレージが disk0 だったんですが、USB メモリが追加されたせいで disk1 に追いやられています。

次に show コマンドで currdev の値がどうなっているか確認します。

OK show currdev
disk0p6

ここは refind.conf に書いたとおりに設定されています。で、これを現状に合わせて disk1p6 に変更します。

OK set currdev=disk1p6
OK show currdev
disk1p6

あとは boot コマンドで OS の起動を続行します。

OK boot

B 面のインストール

B 面へのインストールは、インストール先のパーティション番号を読み替えれば、ほぼほぼ A 面と同じでいけます。違うところだけかいつまんでやります。

キーマップの選択やホスト名の決定など:   A 面と同じ

パーティション編集:

# geli init -e AES-XTS -l 256 -s 4096 /dev/nda0p10
# geli attach /dev/nda0p10
# newfs -U -L freebsd-b-root /dev/nda0p9
# newfs -U -L freebsd-b-home /dev/nda0p10.eli
# mount /dev/ufs/freebsd-b-root /mnt
# mkdir /mnt/home
# mount /dev/ufs/freebsd-b-home /mnt/home
# exit

ネットワークの設定など:   A 面と同じ

タイムゾーンや一般ユーザーの追加など:   A 面と同じ

Geli 暗号化設定:

# geom eli onetime -d /dev/nda0p11
# mount /dev/ufs/freebsd-b-root /mnt
/mnt/etc/fstab (/etc/fstab)
# Device            Mountpoint  FStype  Options Dump    Pass#
/dev/nda0p9         /           ufs     rw      1       1
/dev/nda0p10.eli    /home       ufs     rw      2       2
/dev/nda0p11.eli    none        swap    sw,ealgo=AES-XTS,keylen=128,sectorsize=4096      0       0
/mnt/boot/loader.conf (/boot/loader.conf)
geom_eli_load="YES"
# cd
# umount /mnt

rEFInd に B 面のエントリーを追加する

方法 1:   UFS ドライバはすでに組み込んであるので、あとは refind.conf にエントリーを追加するだけです。

ESP の /EFI/refind/refind.conf (差分)
 menuentry "FreeBSD-A" {
     volume freebsd-a-root
     loader /boot/loader.efi
 }

+menuentry "FreeBSD-B" {
+    volume freebsd-b-root
+    loader /boot/loader.efi
+}

方法 2:   loader.efi はすでに ESP にコピーしてあるので、あとは refind.conf にエントリーを追加するだけです。

ESP の /EFI/refind/refind.conf (差分)
 menuentry "FreeBSD-A" {
     loader /EFI/FreeBSD/loader.efi
     options "rootdev=disk0p6"
 }

+menuentry "FreeBSD-B" {
+    loader /EFI/FreeBSD/loader.efi
+    options "rootdev=disk0p9"
+}

rEFInd 最終形態

これで Zorin OS、Artix Linux、FreeBSD (A/B) のインストールがすべて終了したので、パソコンを再起動して各 OS がちゃんと起動するか確認しましょう。

refind.conf は最終的にこうなりました。FreeBSD のところは方法 1、2 のうち好きなほうを有効にしてください。

ESP の /EFI/refind/refind.conf (最終形)
timeout 0
textonly
scanfor manual

menuentry "Zorin OS" {
    volume zorin-boot
    loader /vmlinuz
    initrd /initrd.img
    options "root=/dev/mapper/nvme0n1p3_crypt rw quiet splash"
}

menuentry "Artix Linux" {
    volume artix-boot
    loader /vmlinuz-linux-lts
    initrd /initramfs-linux-lts.img
    options "cryptdevice=UUID=<nvme0n1p5 の UUID>:root root=/dev/mapper/root rw"
}

menuentry "FreeBSD-A" {
    # op1: run loader from /boot on nda0p6 (UFS driver required)
    #volume freebsd-a-root
    #loader /boot/loader.efi
    # op2: run loader from the ESP
    loader /EFI/FreeBSD/loader.efi
    options "rootdev=disk0p6"
}

menuentry "FreeBSD-B" {
    # op1: run loader from /boot on nda0p9 (UFS driver required)
    #volume freebsd-b-root
    #loader /boot/loader.efi
    # op2: run loader from the ESP
    loader /EFI/FreeBSD/loader.efi
    options "rootdev=disk0p9"
}

rEFInd のメニュー画面は最終的にこうなりました。

図 6: お疲れさまでした
図 6: お疲れさまでした

おまけ 1: Shell モードでインターネットに接続する

インストールメディアの Shell モードでインターネットに接続できると何かと便利なので、ここにメモしておきます。

本機の場合は、OS インストール時に画面に表示されていた情報から、無線 LAN のデバイスドライバが iwlwifi0 とわかりました。で、FreeBSD の Wi-Fi は、iwlwifi0 をそのまま使うのではなく、より一般的なインターフェースである wlen0 を通して使うしくみになっているらしいです。そこで次のようにします。

# ifconfig wlan0 create wlandev iwlwifi0

wpa_supplicant の設定ファイルを作ります。

# wpa_passphrase "自分のSSID" "自分のパスフレーズ" > /tmp/wpa.conf

/tmp/wpa.conf を編集します。わが家は ANY 接続拒否設定になっているので、scan_ssid=1 の行を追加しました。

/tmp/wpa.conf (差分)
 network={
         ssid="自分のSSID"
+        scan_ssid=1
         #psk="自分のパスフレーズ"
         psk=自分のパスフレーズを暗号化
 }

ネットに接続し、IP アドレスを動的に取得して、接続を確認します。

# wpa_supplicant -B -i wlan0 -c /tmp/wpa.conf
# dhclient wlan0
# ping www.freebsd.org

おまけ 2: FreeBSD のインストールメディアを使って rEFInd をインストールする

前回の記事にも書きましたが、本稿では rEFInd はすでにインストール済みであるものとして話を進めました。その rEFInd は前々回の記事で Zorin OS からインストールしたものです。じゃあ Zorin OS がなかったらどうなるの?てなことになるかもしれないので、おまけとして書いておきます。rEFInd のインストールは基本的に ZIP ファイルを解凍して中身を ESP にコピーするだけなので、特定の OS やツールに依存することはありません。それゆえ、この文章もほぼ前回の記事のコピペです (笑)。以下かいつまんで説明しますが、詳しくは公式サイトの Installing rEFInd Manually Using Linux などを参照してください。

インストールメディアから起動して Shell モードに入ったら、おまけ 1 を参考にインターネットに接続します。

で、rEFInd をダウンロードして解凍します。

# cd /tmp
# fetch https://sourceforge.net/projects/refind/files/0.14.2/refind-bin-0.14.2.zip
# unzip refind-bin-0.14.2.zip

ESP を FAT32 でフォーマットして、適当なマウントポイントにマウントします。

# newfs_msdos -F 32 -c 1 /dev/nda0p1
# mount_msdosfs /dev/nda0p1 /mnt

ESP に rEFInd 関連のファイルを置くためのディレクトリを作って、ZIP を展開した中から必要なファイルをコピーします (ここは公式サイトのやり方からちょっと外れているので、気になる方は公式のほうを確認してください)。

# mkdir -p /mnt/EFI/refind/drivers_x64/
# cd /tmp/refind-bin-0.14.2.zip/refind/
# cp refind_x64.efi /mnt/EFI/refind/
# cp drivers_x64/ext4_x64.efi /mnt/EFI/refind/drivers_x64/
# cp -r tools_x64/ /mnt/EFI/refind/tools_x64/

refind_x64.efi をデフォルト/フォールバックブートパス (EFI/BOOT/) にもインストールします。

# mkdir -p /mnt/EFI/BOOT/
# cp refind_x64.efi /mnt/EFI/BOOT/bootx64.efi

参考: Arch Wiki

FreeBSD の場合は、上のほうに書いた「 rEFInd に A 面のエントリーを追加する」などのセクションを参考に、/boot/loader.efi を ESP へコピーするか、UFS ドライバを組み込むかを忘れずに。

あとは refind.conf を作成し、/mnt をアンマウントして再起動します。

環境によっては UEFI 設定画面でブートエントリーを編集する必要があるかもしれません。その場合は前々回の記事を参照してください。

おまけ 3: 「zio_read error: 5」というメッセージが出たときの対処法

あまりお目にかかることはないと思いますが、rEFInd のメニューから FreeBSD を起動しようとしたら「zio_read error: 5」というメッセージが延々と出つづける症状に見舞われました。ZFS 関係のエラーらしいですが、FreeBSD のインストール中、ZFS には一切絡んでいなかったので困惑……。

と思ったのですが、インストールする前の検討段階で ZFS の採用を模索しており、そのときに ZFS のメタデータがインストール先のパーティションに残ってしまっていたようです。試しにインストールメディアの Shell モードで確認したところ

# zpool import
  pool: zpool-old
  ...
    zpool-old   ONLINE
      nda0p6    ONLINE

  pool: zroot
  ...
    zroot       ONLINE
      nda0p7    ONLINE

てな感じで、UFS にしたはずなのになんか「ONLINE」なんて表示されてしまいました。で、ChatGPT に相談して次のように残骸を削除しまして、

# zpool labelclear -f /dev/nda0p6
# zpool labelclear -f /dev/nda0p7

生き残っていないか確認。

# zpool import
no pools available to import

そのうえで FreeBSD をクリーンインストールし直したところ、ことなきを得ました。

関連記事

広告