文書の過去の版を表示しています。


Legacy/GPTブートのFreeBSD環境をUEFI/GPTブートに移行する

FreeBSD 9.0-BETA3の時にレガシーGPTブートでRoot on ZFS環境を作ってから早8年が過ぎた。その間、OSの更新しつつ使い続けてきたが、2019年にもなってLegacyブートもなかろうと思いUEFIブート環境に切り替えることにした。

手動でFreeBSD UEFIブート環境をインストールしたり、bsdinstallで作ったUEFI環境と見比べたりして確立した方法なので、FreeBSDが想定する正しいUEFI環境になってる保証はない。ご利用はas-isでオナシャス。

  • FreeBSD 12.0-RELEASE-p4
    • Legacy/GPT/ZFSブート環境: gptzfsbootを使ってGPTのストレージから古のBIOSで起動する方法。UEFI非対応時代のRoot on ZFS環境で用いられてきた。
    • ada0が起動ストレージ
  • FreeBSD専用マシン

やることはESPを作ってEFI用のブートローダを置くだけだったりする。

起動ストレージにESP1)を作る。ここにUEFIブートローダを入れるわけだが、この確保が最大の難関。

ディスクに空きがあればいいのだが、なければデバイスを交換する他ない。この際、新デバイスをミラー構成でプールに追加し、作業完了後に古いデバイスをdetachすればデータ同期の手間が省けて便利である。各人工夫して、どうにかしてESPを確保してくだしあ。

# gpart add -a 4k -t efi -s 200m ada0

容量はお好みで。参考までにFreeBSDのインストーラは200MBで作る模様。

自分の場合、UEFI移行を見据えて512MBで確保しておいたもの(ada0p1)があるので、それを使う。

> gpart show ada7
=>        34  1099999933  ada0  GPT  (525G)
          34           6        - free -  (3.0K)
          40     1048576     1  efi  (512M)
     1048616        1024     2  freebsd-boot  (512K)
     1049640   251658240     3  freebsd-zfs  (120G)
   252707880     8388608     4  freebsd-zfs  (4.0G)
   261096488     8388608     5  freebsd-zfs  (4.0G)
   269485096     8388608     6  freebsd-zfs  (4.0G)
   277873704   629145600     7  freebsd-zfs  (300G)
   907019304   125829120     8  freebsd-zfs  (60G)
  1032848424    41943040     9  freebsd-zfs  (20G)
  1074791464    25208503        - free -  (12G)

ESPをFAT32で初期化。

512バイトセクタの場合
# newfs_msdos -F 32 -S 512 -c 4 ada0p1
/dev/ada0p1: 1044464 sectors in 261116 FAT32 clusters (2048 bytes/cluster)
BytesPerSec=512 SecPerClust=4 ResSectors=32 FATs=2 Media=0xf0 SecPerTrack=63 Heads=16 HiddenSecs=0 HugeSectors=1048576 FATsecs=2040 RootCluster=2 FSInfo=1 Backup=2

4kセクタの場合
sudo newfs_msdos -F 32 -S 4096 -c 1 nvd0p1
/dev/nvd0p1: 130812 sectors in 130812 FAT32 clusters (4096 bytes/cluster)
BytesPerSec=4096 SecPerClust=1 ResSectors=4 FATs=2 Media=0xf0 SecPerTrack=63 Heads=255 HiddenSecs=0 HugeSectors=131072 FATsecs=128 RootCluster=2 FSInfo=1 Backup=2

作成したESPをマウントする。

$ mkdir /tmp/esp
# mount -t msdosfs /dev/ada0p1 /tmp/esp

UEFIのブートローダを置く。

$ mkdir -p /tmp/esp/efi/boot
$ cp /boot/boot1.efi /tmp/esp/efi/boot/BOOTx64.efi

起動用のUEFIスクリプトを書く。

$ echo 'BOOTx64.efi' >> /tmp/esp/efi/boot/startup.nsh

ESPの中が以下のような構造になっていればOK

$ cd /tmp/esp/
$ find .
.
./efi
./efi/boot
./efi/boot/BOOTx64.efi
./efi/boot/startup.nsh

ESPを必ずアンマウント

$ cd
# umount /tmp/esp

システムを再起動

# reboot

マシンのBIOSでブート環境をUEFIにする。マザボごとに設定箇所や項目名が異なるので頑張ってどうにかしてくだしあ。

BIOSの設定を保存し再起動するとUEFI環境でFreeBSDが立ち上がるハズ。

上図のような「FreeBSD EFI boot block」といったブート画面が出てれば多分OK。


1)
EFI System Partition
  • freebsd/migrate_freebsd_legacy_gpt_boot_to_uefi.1568983503.txt.gz
  • 最終更新: 2019-09-20 21:45
  • by Decomo