クアッドブート 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)) のような画面になったら、パーティション編集の手前までインストーラーの指示にしたがって進めます。
- Welcome 画面で [Install] を選択します (図 1(a))。
- Keymap Selecftion: 好きなキーマップを選択します (図 1(b))。
- Set Hostname: ホスト名を決めて入力します (図 1(c))。私は好きな食べ物の名前を付けることが多いです。
- Select Installation Type: [Packages (Tech Preview)] を選択します (図 1(d))。FreeBSD 15.0 あたりから?ベースシステムを packages からインストールできるようになったみたいです。
- Network or Offline Installation: [Offline (Limited Packages)] を選択します (図 1(e))。
で、Partitioning の画面 (図 1(f)) まできたら、普通は [Auto] とか [Manual] とかでいいと思うんですけど (過去の記事ではずっと Manual でやってました)、今回は /home とスワップを暗号化したいので [Shell] を選択します。
パーティション編集
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 に戻りましょう。
ネットワークの設定など
ここから先はネットワーク環境によって変わってくると思うので、適当に読み替えてください。
- Select System Conponents: とりあえずデフォルトのままでいきます (図 2(a))。
- システムコンポーネントのインストールが終わるまでしばらく待ちます (図 2(b))。
- root のパスワードを入力します (図 2(c))。
- Network Configuration: ここから先は、検出されたネットワークインターフェースや、選んだ選択肢によって変わると思われます。私の場合は iwlwifi0 が検出されました (図 2(d))。手動で設定するため [Manual] を選びます。
- Regdomain/country: 日本に変更したいので [Yes] を選択。 (図 2(e))。
- Regdomain selection: [JAPAN] を選択。(図 2(f))。
- Country selection: [JP Japan] を選択。 (図 2(g))。
- Wi-Fi のスキャンが始まります (図 2(h))。ANY 接続拒否設定になっている場合はスキップしても構いません。
- Network Selection:
- 自分ちのネットワークがあれば選択します (図 3(a))。ANY 接続拒否設定になっている場合は [Cancel] を選択します。
- ここは手動で設定したいので [Yes] を選択 (図 3(b))。
- SSID を入力 (図 3(c))。
- 暗号化方式を選択 (図 3(d))。
- WPA Setup: WPA2 パスフレーズを入力 (図 3(e))。
- IPv4 の設定を行うので [Yes] を選択 (図 3(f))。ここはなんでかよくわからないけど、コンソールの出力?が bsdinstall の画面に乱入してきます。
- DHCP による IP アドレスの動的割り当てを受けるので [Yes] を選択 (図 3(g))。
- IPv6 の設定は行わないので [No] を選択 (図 3(h))。
- DNS サーバの IP アドレスを入力 (図 3(i))。わが家は無線 LAN ルータにおまかせなので、その管理用 IP アドレスを入力します。
ここでちょっと休憩とします。YouTube で猫ちゃんが飼い主さんにケツをバシバシ叩かれ、恍惚として匍匐前進してしまう動画をみてきます……
タイムゾーンや一般ユーザーの追加など
すみません、再開します。
- Time Zone Selector: [Asia] を選択 (図 4(a))。
- Countries in Asia: [Japan] を選択 (図 4(b))。
- Confirmation: [Yes] を選択 (図 4(c))。
- Time & Date はあとで設定するので [Skip] (図 4(d), (e))。
- System Configuration と System Hardening はデフォルトのまま (図 4(f), (g))。
- FreeBSD Firmware Installation はそのまま [OK] を押す (図 4(h))。前節のようにネットワーク設定をやっておけば、ここで Wi-Fi やら何やらのファームウェアをダウンロードしてくれるみたいです。
- しばらく待ちます (図 5(a))。
- 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 (デフォルト)
- Final Configuration で [Finish] を、Manual Configuration で [No] を選択します (図 5(d), (e))。
本来はこれで作業終了です。が、今回は /home やスワップを暗号化する都合でまだ作業が残っているので、図 5(f)) の画面まで来たら [Reboot] を選択して再起動します。
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) に次の内容を追記します。
# 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 行を追記します。
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 にエントリーを追加します。
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」と書きます。
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
# 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
geom_eli_load="YES"
# cd
# umount /mnt
rEFInd に B 面のエントリーを追加する
方法 1: UFS ドライバはすでに組み込んであるので、あとは 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 にエントリーを追加するだけです。
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 のうち好きなほうを有効にしてください。
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 のメニュー画面は最終的にこうなりました。
おまけ 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 の行を追加しました。
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 をクリーンインストールし直したところ、ことなきを得ました。
関連記事
- クアッドブート with rEFInd (その 1/5): オリエンテーションhttps://retrotecture.jp/multiboot/quadboot_llff_1.html
- クアッドブート with rEFInd (その 2/5): パーティションを切るhttps://retrotecture.jp/multiboot/quadboot_llff_2.html
- クアッドブート with rEFInd (その 3/5): Zerin OS と rEFInd のインストールhttps://retrotecture.jp/multiboot/quadboot_llff_3.html
- クアッドブート with rEFInd (その 4/5): Artix Linux のインストールhttps://retrotecture.jp/multiboot/quadboot_llff_4.html
広告





