BIOS, UEFI両方で起動可能なdebianインストールUSBメディアを作る

概要

EFIブートするUSBメモリでdebianをインストールにおいてEFIブートするUSBメモリを作成してDebianをインストールする手順を説明したが、少し内容が古くなってしまっていてうまく適用できない。 新しい手順を作るついでにBIOS、UEFIの両方で起動するUSBメディアを作ってインストールすることにした。

前提

母艦となるLinuxマシンが必要。 EFI起動のLinuxでないとダメなので注意。 ない場合はVirtualBoxなどでDebianを用意する。 というか自分はそうした。 以下の手順ではDebian 9.2を利用した。

手順

パーティション作成

まずはgdiskを使ってパーティションを作成する。 今回の例では某会議でもらったProceedingsが入っている8GBのディスク(ただしMacでFATで初期化済み)を用いることとする。

USBメディアは /dev/sdb にあるとする。 sudo dmesg などで確認しておくこと。

まずは現在の状態を確認。

sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************


Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.
Disk /dev/sdb: 15728640 sectors, 7.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 15728606
Partitions will be aligned on 8-sector boundaries
Total free space is 22 sectors (11.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              56        15728639   7.5 GiB     0700  Microsoft basic data

なにやらおかしいとエラーが出てるが気にしない。 消えてもらうぜ。

sudo gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.

Command (? for help): d
Using 1

BIOS boot partitionを作成するという人もいるようだが、その領域を空けていれば特に問題ないので作成しないこととする。 セクタ2047までは空けておくこと。

EFI Systemパーティションを作成。 サイズは適当に256Mとした。

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-15728606, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-15728606, default = 15728606) or {+-}size{KMGTP}: +256M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI System'

続いてインストールメディアやgrubファイルを置くためのパーティション。 ディスクサイズが小さいので残り全部。 SSDを使って同じようなインストールメディアを作ったときは8GBのパーティションとした。

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-15728606, default = 526336) or {+-}size{KMGTP}:
Last sector (526336-15728606, default = 15728606) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 0700
Changed type of partition to 'Microsoft basic data'

これで完成。 確認して書き込み。

Command (? for help): p
Disk /dev/sdb: 15728640 sectors, 7.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 15728606
Partitions will be aligned on 2048-sector boundaries
Total free space is 0 sectors (0 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          526335   256.0 MiB   EF00  EFI System
   2          526336        15728606   7.2 GiB     0700  Microsoft basic data

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

念のため確認。

sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdb: 15728640 sectors, 7.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 15728606
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          526335   256.0 MiB   EF00  EFI System
   2          526336        15728606   7.2 GiB     0700  Microsoft basic data

FAT32でフォーマットする。 mkfs.vfat がないという人は sudo apt-get install dosfstools する。

sudo mkfs.vfat -F32 /dev/sdb1
sudo mkfs.vfat -F32 /dev/sdb2

なお、EFI SystemパーティションはFATにしないとダメだが、インストールメディアやgrubファイルを置くためのパーティションは別にFATにする必要はない。 ただ、ファイルを書き換えるときに楽というだけの話。 変更したい場合は↑でパーティションを作成するときにGUIDもちゃんと変更すること。

grubのインストール(MBR編)

grub-pc をインストールする。 grub-efi が一旦アンインストールされるが気にしたら負け。

sudo apt-get install -y grub-pc

インストールメディアやgrubファイルを置くためのパーティションをマウントして、bootディレクトリを指定してインストール。 blocklistsが何たらとエラーになるので、 --force を付けて実行する。

sudo mount /dev/sdb2 /mnt
sudo grub-install --target=i386-pc --boot-directory=/mnt/boot --force /dev/sdb
Installing for i386-pc platform.
grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible.
grub-install: warning: Embedding is not possible.  GRUB can only be installed in this setup by using blocklists.  However, blocklists are UNRELIABLE and their use is discouraged..
Installation finished. No error reported.

何か色々と言われるが、 No error reported. なのできっと問題ないだろう。 これで /mnt/boot/grub に色々なファイルができてるはず。

grubのインストール(EFI編)

grub-efi を再び導入する。 grub-pc はアンインストールされる。

sudo apt-get install -y grub-efi

マウントポイントが足りないので、EFI用ディレクトリを作ってEFI Systemパーティションをマウントして使う。

sudo mkdir /mnt/boot/efi
sudo mount /dev/sdb1 /mnt/boot/efi
sudo grub-install --target=x86_64-efi --efi-directory=/mnt/boot/efi --boot-directory=/mnt/boot
Installing for x86_64-efi platform.
Installation finished. No error reported.

grub-installではremovable media用にいい感じのEFIブートファイルを作ってくれないのでコピーする。

sudo mkdir /mnt/boot/efi/EFI/BOOT
sudo cp /mnt/boot/efi/EFI/debian/grubx64.efi /mnt/boot/efi/EFI/BOOT/BOOTX64.EFI

これで /mnt/boot/efi の下はこんな感じのディレクトリ構成になるはず。

ls -FR /mnt/boot/efi
/mnt/boot/efi:
EFI/

/mnt/boot/efi/EFI:
BOOT/  debian/

/mnt/boot/efi/EFI/BOOT:
BOOTX64.EFI*

/mnt/boot/efi/EFI/debian:
grubx64.efi*

アンマウントして完成。

sudo umount /mnt/boot/efi
sudo umount /mnt

インストールメディアとインストーラカーネルの配置

ここまで来たら自分はMacで作業している。 /dev/sdb2 をFAT32でフォーマットしているので、Macに接続すると NO NAME というボリュームが現れるので、ISOイメージとカーネル、ルートイメージを配置する。

ISOイメージとカーネル、ルートイメージは インターネット経由の Debian のインストール から取得する。 「小さな CD または USB メモリ」のamd64をダウンロードし、そのISOファイルを NO NAME ボリュームにコピーする。 これを書いている時点では debian-9.2.1-amd64-netinst.iso が最新の模様。

カーネル類は「ネットワークブート」のamd64から hd-media の中の vmlinuzinitrd.gz を取得して NO NAME ボリュームの boot ディレクトリにコピーする。

あとは以下のような grub.cfg を作成して NO NAME ボリュームの boot/grub ディレクトリに配置する。 (hd0,gpt2)boot が入っているディスク、パーティションを指定している。 パーティション番号が↑と違う場合は適宜書き換える。

それと、マシンによっては video=efifb ではうまく表示できないかもしれない。 手元にあるHP EliteBook 820では video=vesafb でないとインストーラ起動後に表示が崩れた。

# Load Graphical modules
insmod efi_gop
insmod efi_uga

# Load Font module
insmod font


# Setup GFXTERM along with loading unicode.pf2 font file

if loadfont ${prefix}/fonts/unicode.pf2
then
   insmod gfxterm
   set gfxmode="auto"
   set gfxpayload=keep
   terminal_output gfxterm

   set color_normal=light-blue/black
   set color_highlight=light-cyan/blue
fi

insmod part_gpt
insmod part_msdos
insmod fat
insmod ext2

# Timeout for menu
set timeout=5

# Set default boot entry as Entry 0
set default=0

menuentry "Debian Install (expert mode)" {
  set root=(hd0,gpt2)
  linux /boot/vmlinuz root=/dev/sda1 ro video=efifb agp=off priority=low ipv6.disable=1
  initrd /boot/initrd.gz
}
menuentry "Debian Install" {
  set root=(hd0,gpt2)
  linux /boot/vmlinuz root=/dev/sda1 ro video=efifb agp=off ipv6.disable=1
  initrd /boot/initrd.gz
}

このメディアのいいところは、grubを更新せずとも新しいインストールイメージを導入できるところ。 ISOとカーネル類のみ新しいものに入れ替えればOK。

なお、testingをインストールする場合はdaily build版を ここ から取得すると良い。