VirtualBoxでUEFI+GPTな環境にNetBSD/amd64をインストール

新調したPCことHP p6-2210jpがUEFI+GPTという環境になっていたんで、さてどうやってNetBSDを入れようかということでVirtualBoxで試したらなんとかなったというメモ。

以下ポイント。

  • ブートローダーはArchLinuxからgrub2-efiだけ拝借して使用する。NetBSD標準のブートローダは使用しない
  • BSD disklabelも使用せず。2TBの壁もあるし(2TB超のディスクなんて持ってないけど)
  • Arch Linuxを使用したのは"grub2 efi"でGoogle先生に尋ねたら最初にでてきたから。ぶっちゃけEFI対応のGRUB2があれば何でもよし。

まずは用意するものとして、NetBSD/amd64、ArchLinux(grub2インストール用)、GParted Live CD(パーティション設定用)を用意。実際に使ったファイル名は以下の通り。

  • NetBSD-6.99.11-amd64.iso
  • archlinux-2012.09.07-dual.iso
  • gparted-live-0.13.1-2.iso

VirtualBoxに新しい仮想マシンを作成し、CDから起動できるようにする。なお、VirtualBoxUEFIが今一微妙なのか単に使い方が悪いだけなのか、CDからうまく起動できないのでしばらくEFIはOFFにしておくこと。

仮想マシンが作成できたらまずはGParted Live CDを起動する。

Gpartedメニューから「デバイス(D)」→「パーティションテーブルの作成(C)...」とすると『警告:この作業は「ディスク /dev/sda 上の全データを削除します』と出るので、「詳細」から「パーティションテーブルの形式を選択」デ「gpt」を選択して「Apply」。
テーブルの作成が終わったら、ツールバーの「New」でまず最初にEFI領域を作成するためfat32パーティションをディスクの先頭に作成する。容量やラベルは適当でOK。残りの領域は好きなように。どうもufsは選択できないので「未フォーマット」にでもしておく。
全て完了したら「Apply」で完了。
今回はこんな感じで、先頭にEFIパーティション、残りは全部NetBSDパーティション

本当はGUIDも設定したいけれども設定方法がわからず。とりあえず設定しなくても大丈夫そうなのでとりあえず進める。(GUIDについては米WikipediaGUID_Partition_Tableを参照)

次にNetBSDをインストールする。なおNetBSDインストーラはGPTを認識できないようでご覧の通り238(0xEE)のパーティションが1つあるだけにしか見えない。仕方がないのでシェルに落ちて手動で展開する。

GPTパーティションはdkデバイスとして認識されるらしいので、まずは正しく認識されているか確認する。

#dmesg | grep dk
dk0 at wd0: 78a10e7a-3ee5-448c-8afe-33fbd4083fa1
dk0: 524288 blocks at 2048, type:
dk1 at wd0: 12cae2aa-aa0c-4137-82d7-0ce1a6502546
dk1: 16248832 blocks at 526336, type:

対象がdk1として認識できているようなので、newfsでフォーマット。WARNINGは気にしない(おぃ

# newfs -I -O 2 dk1
cprng sysctl: WARNING pseudorandom rekeying.
/dev/rdk1: 7934.0MB (16248832 sectors) block size 16384, fragment size 2048
        using 43 cylinder groups of 184.52MB, 11809 blks, 22912 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 378048, 755936, 1133824, 1511712, 1889600, 2268488, 2645376, 3023264,
...............................................................................

後はマウントして必要なものを展開する。

# mount -t ffs /dev/dk1 /targetroot
# cd /targetroot
# tar zxpf /amd64/binary/sets/base.tgz
  (以下略)

必要なら /targetroot/etc/以下を適当に編集して完了。ブートローダーにはgrubを使うのでinstallbootの出番はなし。

最後にArch Linuxを起動してgrub2-efiをインストールさせる。

なおgrub2のインストールは基本的には「https://wiki.archlinux.org/index.php/GRUB2」の通り。
まずはgrub-efi-x86_64をインストールする。

root@archiso ~ # pacman -yS grub-efi-x86_64

EFIパーティションを/boot/efiへマウント。

root@archiso ~ # mkdir -p /boot/efi
root@archiso ~ # mount -t vfat /dev/sdxx /boot/efi

grubをインストールする。モジュールやらもEFIパーティションに入れたいので--boot-directory=/boot/efi/EFIを指定しておく。

root@archiso ~ # modprobe dm-mod
root@archiso ~ # grub-install --target=x86_64-efi --efi-directory=/boot/efi \
                              --bootloader-id=arch_grub --boot-directory=/boot/efi/EFI \
                              --recheck --debug
root@archiso ~ # mkdir -p /boot/efi/EFI/grub/locale
root@archiso ~ # cp /usr/share/locale/en@quot/LC_MESSAGES/grub.mo /boot/efi/EFI/grub/locale/en.mo

PC起動時に実行させるため/EFI/BOOT/bootx64.efigrubをコピー。

root@archiso ~ # mkdir -p /boot/efi/EFI/BOOT
root@archiso ~ # cp /boot/efi/arch_grub/grubx64.efi /boot/efi/EFI/BOOT/bootx64.efi

/boot/efi/EFI/grub/grub.cfgを以下のように設定する。rootで指定するのはgrubが認識しているデバイス(hd0,gpt2)で、knetbsdで指定するのはNetBSDが認識するデバイス名なのでdk1になる。

# Timeout for menu
set default=5

menuentry "NetBSD" {
	insmod efi_gop
	set root=(hd0,gpt2)
	knetbsd /netbsd --root=dk1
	boot
}

なお、"insmod efi_gop"はつけ忘れると以下のようなメッセージがでてそれ以降なにも表示されなくなる。

error: no suitable video mode found.
Booting in blind mode

これでインストール作業は全て完了。仮想マシン設定でEFIを有効にして起動させるとGLUB2のメニューが面が表示される。

"NetBSD"を選んでEnter(他に選択肢はないが)すると数秒後に起動。

おつかれさまでした。