公開日: 2021年7月4日

マルチブート事例 2: Windows 10 と FreeBSD

Windows 10 がプリインストールされているハードディスクをパーティション分割して、FreeBSD とのデュアルブートを実現する方法を紹介します。ここでは Secure Boot は無効、HDD は Advanced Format (物理セクタサイズ 4096 バイト、論理セクタサイズ 512 バイト)、パーティション形式は GPT、ファイルシステムは UFS という前提で話を進めます。

供試 PC

ヒューレット・パッカード SPECTRE 13-af520TU
  • CPU: Intel Core i5-8250U 1.60 GHz
  • メモリ: 8 GB
  • ストレージ: SSD (360 GB) Windows 10 プリインストール済み
  • ディスプレイアダプタ: Intel UHD Graphics 620
  • 無線 LAN アダプタ: Intel Dual Band Wireless AC8265
  • 備考 1: 起動時に ESC キー押しで UEFI 設定、F9 キー押しでブートデバイス選択に移行
  • 備考 2: UEFI で Secure Boot の設定を変更・保存し、再起動すると、"Operating System Boot Mode Change ... XXXX + ENTER ..." というメッセージが表示される。"XXXX" の部分に表示される 4 桁の数字を入力すれば次に進める。

用意するもの

ハードディスク (SSD) のパーティション構成を検討する

上に掲載した供試 PC は、SSD に 4 個のパーティションを持っています。すなわち EFI システムパーティション、予約パーティション、Windows パーティション、回復パーティションです (参考: UEFI/GPT ベースのハードドライブパーティション)。このうち大半を占める Windows パーティションを少し削って、FreeBSD 用のパーティションを捻出し、ついでに Windows 10、FreeBSD 双方からアクセス可能な共有パーティションを 1 個確保することにしましょう。次のような構成になります。
  • EFI システムパーティション
  • 予約パーティション
  • Windows パーティション
  • 回復パーティション
  • FreeBSD 用スワップパーティション
  • FreeBSD パーティション
  • Windows/FreeBSD 共有パーティション
さて、世の中にはセクタサイズ1)によって「512 ネイティブ」「4K ネイティブ」「Advanced Format (512E)」という 3 タイプのハードディスクがあるようです。冒頭にも書いたように、ここでは Advanced Format のハードディスクを扱います。その物理セクタサイズは 4096 バイト、論理セクタサイズは 512 バイトです。Advanced Format のハードディスクで考慮すべき点として、(1) 先頭パーティションの開始セクタは 2048 が推奨される。(2) 第 2 パーティション以降の開始セクタは 8 の倍数とする (4096 / 512 = 8 に由来)。(3) パーティションのサイズ (バイト数) は 4096 の倍数とする (4K アライメント)。…の 3 点があります (詳しくはググってください)。これを踏まえて、次のようなレイアウトでパーティションを作ることにします。
パーティションレイアウト
第 1 パーティションの開始セクタは見てのとおり 2048、第 2 パーティション以降の開始セクタは 8 で割り切れる値になっています。4K アライメントについては、第 3 パーティションを例にとると
セクタ数 × 論理セクタサイズ = 558088192 × 512 = 285741154304
となり、4096 で割り切れる値になっています (わざわざ Excel で表を作って確認したので、合っているはず…)。
  1. セクタサイズを知るには、Windows 上でコマンドプロンプトを管理者権限で開き、「fsutil fsinfo ntfsinfo D:」のように実行すると表示させることができます。「セクターあたりのバイト数」が論理セクタサイズ、「物理セクターあたりのバイト数」が物理セクタサイズです。

既存パーティションのバックアップを取る

パーティション分割を行う前に、既存のパーティションのバックアップを取っておきます。次の記事を参照してください。

FreeBSD のインストールメディアを作る

FreeBSD のインストールメディアを作る方法はいろいろあると思いますが、ここでは Windows 上で Win32 Disk Imager というソフトを使用します。ソフトをインストールし、起動したら [Image File] 欄で FreeBSD-<バージョン>-RELEASE-amd64-memstick.img を選択し、[Device] 欄で書き込み先 USB メモリのドライブレターを選択します。[Hash] 欄でアルゴリズムを選択して [Generate] ボタンを押すとイメージファイルのハッシュ値を表示させることができます。[Write] ボタンを押すと、USB メモリへの書き込みが始まり、「Write Successful.」と表示されたら完成です。
Win32 Disk Imager
Win32 Disk Imager

ハードディスク (SSD) に新しいパーティションを作成する

FreeBSD インストーラの Shell モードを利用して、インストール先のハードディスクに新しいパーティションを作成します。先ほど作成したインストールメディアからパソコンを起動するために、UEFI 設定画面で Legacy Support 有効、Secure Boot 無効にし、 USB メモリから起動されるようにブートデバイスの優先順位を設定します。設定を保存してパソコンを再起動すると、FreeBSD のインストーラが起動するので、メニューから [Shell] を選択し、下記のようにコマンドを実行します (一度実行してしまうと後戻りが利かないので、慎重にお願いします)。
# gpart list
# gpart show -l nvd0
# gpart destroy -F nvd0
# gpart create -s gpt nvd0
# gpart add -t ms-basic-data -b 2048 -s 532480 nvd0
# gpart add -t ms-basic-data -s 32768 nvd0
# gpart add -t ms-basic-data -s 558088192 nvd0
# gpart add -t ms-basic-data -s 2007040 nvd0
# gpart add -t ms-basic-data -s 33554432 nvd0
# gpart add -t ms-basic-data -s 100663296 nvd0
# gpart add -t ms-basic-data -s 8388608 nvd0
# gpart show -l nvd0
=>        40  703282528  nvd0  GPT  (335G)
          40       2008        - free -  (1.0M)
        2048     532480     1  (null)  (260M)
      534528      32768     2  (null)  (16M)
      567296  558088192     3  (null)  (266G)
   558655488    2007040     4  (null)  (980M)
   560662528   33554432     5  (null)  (16G)
   594216960  100663296     6  (null)  (48G)
   694880256    8388608     7  (null)  (4.0G)
   703268864      13704        - free -  (6.7M)
1行目:gpart list コマンドの出力 (掲載は省略) を見て、目的のハードディスク (SSD) を見つける。ここでは nvd0 がそれと判断した。くれぐれも他のハードディスクと間違えないように。
2行目:nvd0 の現在のパーティションレイアウトを確認する。
3行目:既存のパーティションをすべて削除する。
4行目:GPT を指定してパーティショニングスキームを作成する。
5~11行目:事前に決めた構成に従ってパーティションを作る。
12行目:変更後のパーティションレイアウトを確認する。

FreeBSD 用のパーティション (nvd0p5,p6) を含め、すべてのパーティションのタイプに ms-basic-data を指定していますが、あとで変更するので問題ありません。むしろここで freebsd-swap や freebsd-ufs などを指定してしまうと、あとで FreeBSD をインストールするときに「パーティションの上書きができません」というようなメッセージが表示されて先に進めなくなる現象が見られたので2)、いろいろ試した結果このようにしています。

  1. 具体的には "The chosen root partition has a preexisting filesystem." と表示され、それでも進めようとすると "Error while extracting base.txz: Can't unlink already-existing object" と表示され、インストーラの先頭に戻ることしかできなくなります。個人的には、ここまで来たら強制的に上書きしてもらっても良いのですが、こういう仕様のようです。

FreeBSD をインストールする

事例 1 の記事に書いた手順とほぼ同じです。違いはインストール先がハードディスク (ada0) ではなく SSD (nvd0) になることのみ。先ほど決めたレイアウトのとおりなら、スワップパーティションが nvd0p5、FreeBSD 本体用のパーティションが nvd0p6 になります。

それともう一点。インストールが終わったら、パーティション作成を行ったときと同様に、FreeBSD インストーラを起動して Shell モードに入ります。そして EFI システムパーティションに boot1.efi をコピーしておきます。

# mount -t msdosfs /dev/nvd0p1 /mnt
# cp /boot/boot1.efi /mnt/EFI/Boot/bootx64-freebsd.efi
# exit

バックアップしておいたパーティションをリストアする

もともとあった 4 個のパーティションのバックアップデータをリストアします。次の記事を参照してください。

rEFInd のインストール・設定

rEFInd を使用すると EFI/UEFI ベースのパソコンでマルチブートを実現することができます。インストールにはいろいろなやり方がありますが、ここでは Windows 10 上で作業する方法を採ります。詳しくは下記 URL を参照してください。
  1. 公式サイトのリンクをたどって refind-bin-<バージョン>.zip をダウンロードし、適当なフォルダで解凍する。
  2. 管理者権限で DOS プロンプトを起動し、EFI システムパーティションを S ドライブにマウントする。
    C:\WINDOWS\system32>mountvol s: /s
    
  3. 手順 1 で解凍したフォルダ (例えば D:\hoge\) の中にある refind フォルダをS:\EFI\ の下に丸ごとコピーする。
    C:\WINDOWS\system32>s:
    S:\>xcopy /e d:\hoge\refiind-bin-<バージョン>\refind efi\refind\
    
  4. 不要なドライバを削除する。しないと起動に余計な時間がかかるどころか、システムクラッシュを引き起こすかも。みたいなことがドキュメントに書かれている。私の場合は x64 を残して ia32 と aa64 を削除。
    S:\>cd efi\refind
    S:\EFI\refind>del refind_aa64.efi refind_ia32.efi
    S:\EFI\refind>rd /s drivers_aa64 drivers_ia32 tools_aa64 tools_ia32
    
  5. ブートマネージャを Windows Boot Manager から rEFInd に変更する。
    S:\>bcdedit /set "{bootmgr}" path \efi\refind\refind_x64.efi
    この操作を正しく終了しました。
    
    S:\>bcdedit /set "{bootmgr}" description "rEFInd"
    この操作を正しく終了しました。
    
    ちなみに、やっぱり Windows Boot Manager に戻したい…という場合はこうする。
    S:\>bcdedit /set "{bootmgr}" path \efi\microsoft\boot\bootmgfw.efi
    この操作を正しく終了しました。
    
    S:\>bcdedit /set "{bootmgr}" description "Windows Boot Manager"
    この操作を正しく終了しました。
    
  6. 設定ファイルのサンプルをコピーし、メモ帳等の適当なエディタで変更する。
    S:\>cd efi\refind
    S:\EFI\refind>copy refind.conf-sample refind.conf
    S:\EFI\refind>notepad refind.conf
    
    変更点は下記のとおり。timeout と textonly の設定はお好みでよいと思います。
    refind.conf
    timeout 0
    textonly
    scanfor manual
    
    menuentry "Windows 10" {
        loader \EFI\Boot\bootx64.efi
    }
    
    menuentry "FreeBSD 12.2-R" {
        loader \EFI\Boot\bootx64-freebsd.efi
    }
    
    1行目:この値を 0 にするとオートブートしない。
    2行目:テキストベースのメニュー画面を有効にする。
    3行目:ブートローダの検索方法を指定する。"manual" にすると、この設定ファイルに記述されたスタンザ (定型詩を構成する数行単位のまとまりをそう呼ぶんだそうです) に従う。
    5行目:Windows 10 用のスタンザ
    9行目:FreeBSD 用のスタンザ
  7. UEFI の設定。パソコンによって設定方法が違うので詳細は書かないが、下記のように UEFI を設定の上、パソコンを再起動する。
    • Legacy Support: 有効
    • Secure Boot: 無効
    • ブート優先順位の設定で rEFInd を Windows Boot Manager よりも上に持ってくる。

結果、こうなる

パソコンを起動すると、rEFInd のブート選択画面が表示されます (私のスマホで直撮りしたので、ブレブレですみません)。refind.conf で "textonly" を指定したので、MS-DOS でも起動しそうな簡素な佇まいですが、私はこのほうが好みです。
rEFInd のブート選択画面
rEFInd のブート選択画面