公開日: 2021年7月4日

マルチブート事例 1: Windows 10 と FreeBSD と FreeBSD (前編)

Windows 10 と FreeBSD、さらにはバージョンが異なるもう一つの FreeBSD を共存させる方法を紹介します。次のようなケースを想定しています。
  • 1 台目のハードディスクに Windows 10 がプリインストールされている。
  • 2 台目のハードディスクにバージョンが異なる二つの FreeBSD を共存させる。
なお、ここでは Secure Boot は無効、HDD は Advanced Format (物理セクタサイズ 4096 バイト、論理セクタサイズ 512 バイト)、パーティション形式は GPT、ファイルシステムは UFS という前提で話を進めます。

供試 PC

ドスパラ GALLERIA SG (KTC10/B365ITX)
  • CPU: Intel Core i7-9700F 3.00 GHz
  • メモリ: 16 GB
  • ストレージ 1 台目: SSD (512 GB) Windows 10 プリインストール済み
  • ストレージ 2 台目: HDD (2 TB)
  • ディスプレイアダプタ: Palit NE6208S019P2-180F (GeForce RTX 2080 SUPER)
  • NIC: Intel Ethernet Connection l219-V
  • 備考: 起動時 Del キー押しで UEFI 設定、F11 キー押しでブートデバイス選択に移行

用意するもの

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

増設したハードディスクにバージョン違いの FreeBSD を共存させます。それぞれのパーティションを「A 面」「B 面」としておきましょう。こうしておけば RELEASE 版で安定運用しつつ、STABLE 版でいろいろ試したりといった使い方が可能になります。このハードディスクには、元々 NTFS でフォーマットされたパーティションが 1 個だけ存在し、今のところ SSD にプリインストールされた Windows 10 から D ドライブとしてマウントされています。このパーティションをいったん削除して、そこに次のように 5 つのパーティションを作ることにします。
  • Windows 10 のユーザデータ用パーティション
  • FreeBSD 用スワップパーティション (A 面、B 面共通)
  • FreeBSD パーティション (A 面)
  • FreeBSD パーティション (B 面)
  • 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 アライメントについては、第 1 パーティションを例にとると
セクタ数 × 論理セクタサイズ = 2699067392 × 512 = 1381922504704
となり、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

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

FreeBSD インストーラの Shell モードを利用して、インストール先のハードディスクに新しいパーティションを作成します。先ほど作成したインストールメディアからパソコンを起動するために、UEFI 設定画面で CSM (Compatibility Supported Module) と Secure Boot を無効にし、 USB メモリから起動されるようにブートデバイスの優先順位を設定します。設定を保存してパソコンを再起動すると、FreeBSD のインストーラが起動するので、メニューから [Shell] を選択し、下記のようにコマンドを実行します (一度実行してしまうと後戻りが利かないので、慎重にお願いします)。
# gpart list
# gpart show -l ada0
# gpart destroy -F ada0
# gpart create -s gpt ada0
# gpart add -t ms-basic-data -b 2048 -s 2699067392 ada0
# gpart add -t ms-basic-data -b -s 67108864 ada0
# gpart add -t ms-basic-data -b -s 536870912 ada0
# gpart add -t ms-basic-data -b -s 536870912 ada0
# gpart add -t ms-basic-data -b -s 67108864 ada0
# gpart show -l ada0
=>        40  3907029088  ada0  GPT  (1.8T)
          40        2008        - free -  (1.0M)
        2048  2699067392     1  (null)  (1.3T)
  2699069440    67108864     2  (null)  (32G)
  2766178304   536870912     3  (null)  (256G)
  3303049216   536870912     4  (null)  (256G)
  3839920128    67108864     5  (null)  (32G)
  3907028992         136        - free -  (68K)
1行目:gpart list コマンドの出力 (掲載は省略) を見て、目的のハードディスクを見つける。ここでは ada0 がそれと判断した。くれぐれも他のハードディスクと間違えないように。
2行目:ada0 の現在のパーティションレイアウトを確認する。
3行目:既存のパーティションをすべて削除する。
4行目:GPT を指定してパーティショニングスキームを作成する。
5~9行目:事前に決めた構成に従ってパーティションを作る。
10行目:変更後のパーティションレイアウトを確認する。

FreeBSD 用のパーティション (ada0p2 から p4) を含め、すべてのパーティションのタイプに 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" と表示され、インストーラの先頭に戻ることしかできなくなります。個人的には、ここまで来たら強制的に上書きしてもらっても良いのですが、こういう仕様のようです。