玩式草子─ソフトウェアとたわむれる日々

第79回 Plamo LinuxのGPT/UEFI対応[その3]

この記事を読むのに必要な時間:およそ 5.5 分

DVDからのUEFI起動

USBメモリは小さなHDDと見なせるのでUEFIへの対応は比較的簡単なものの,CDやDVDからUEFIモードで起動するにはもう一工夫が必要です。というのも,Plamo Linuxのインストール用DVDでは,syslinux由来のisolinux.binを使ってSystem BIOSから起動する形にしており,そのままではUEFIに対応できないためです。

さてどうしたものか,とあれこれ調べたところ,mkisofsでDVDイメージを作成する際に-eltorito-alt-bootオプションで複数のブートイメージを指定できることに気づきました。

El ToritoはISO9660形式のメディアからブートするために定められた規格です。この規格では一枚のCDでさまざまなOSに対応するため,CD中に複数のブートイメージを置くことが可能になっており,-eltorito-alt-bootはデフォルトとは異なるブートイメージを指定するオプションです。

UEFIから起動する場合,この-eltorito-alt-bootオプションで指定したブートイメージがESPとして認識されるので,このブートイメージの中に\EFI\BOOTディレクトリを作ってbootx64.efiを置けばUEFIはそれをOSのブートローダとして認識してくれそうです。

El Torito用のブートイメージは仮想的なFDとして作成するので,まずはddコマンドでFDサイズ(1.44MB)のファイルを作り,そのファイルをFAT形式にフォーマットします。

$ dd if=/dev/zero of=efiboot.img bs=1k count=1440
$ /usr/sbin/mkfs.msdos -F 12 -M 0xf8 efiboot.img
mkfs.fat 3.0.26 (2014-03-07)
$

次にこのefiboot.imgをループバックでマウントし,必要なディレクトリを作ってブートローダをコピーします。

$ mkdir /tmp/loop
$ sudo mount efiboot.img /tmp/loop -o loop
$ sudo mkdir -p /tmp/loop/EFI/BOOT
$ sudo cp bootx64.efi /tmp/loop/EFI/BOOT
$ sudo umount /tmp/loop

DVDイメージはmkisofsを用いて作成します。mkisofsは指定したディレクトリにある全てのファイルをDVDイメージに書き込むので,作業用ディレクトリ(DVD_contents)にPlamo-6.x用のisolinuxディレクトリを持ってきて,そこに先ほど作ったefiboot.imgを置くことにします。

$ mkdir DVD_contents
$ cp -av /mnt2/Plamo-6.x/x86_64/isolinux ./DVD_contents/
$ cp efiboot.img ./DVD_contents/isolinux/

今回利用しているbootx64.efiはUSBメモリ用に作成したものを流用しているので,設定ファイルは/EFI/BOOT/grub.cfgを読むことになります。bootx64.efiはefiboot.img中の/EFI/BOOT/ディレクトリに置くものの,この仮想FDはUEFIがブートローダを探すためにのみ用いられbootx64.efiからは見えません。そのためgrub.cfgはDVDイメージの中の/EFI/BOOT/に置く必要があります。

$ mkdir -p ./DVD_contents/EFI/BOOT
$ cat << 'EOF' > ./DVD_contents/EFI/BOOT/grub.cfg
menuentry "UEFI Plamo Linux install from DVD" {
  linux (cd0)/isolinux/vmlinuz root=/dev/ram0 rw nomodeset vga16 unicon=eucjp vt.default_utf8=0 kbd=usbkbd
  initrd (cd0)/isolinux/initrd.gz
}
EOF

必要なファイルが揃ったのでmkisofsを実行します。最初の2行がデフォルト(1つめ)のブートイメージの指定で,System BIOSから起動すると,ここで指定したisolinux.binを利用します。3行目が2つめのブートイメージの指定で,UEFIから起動するとefiboot.imgを用いることになります。

$ sudo mkisofs -v -J -r -b isolinux/isolinux.bin -c isolinux/boot.cat \
      -no-emul-boot -boot-load-size 4 -boot-info-table \
      -eltorito-alt-boot  -eltorito-platform efi -eltorito-boot isolinux/efiboot.img \
      -V UEFI-test -o UEFI-test.iso DVD_contents
Setting input-charset to 'UTF-8' from locale.
3.01 (x86_64-unknown-linux-gnu)
Scanning DVD_contents
Scanning DVD_contents/isolinux
Excluded by match: DVD_contents/isolinux/boot.cat
Writing:   Initial Padblock                        Start Block 0
Done with: Initial Padblock                        Block(s)    16
...
75.29% done, estimate finish Wed Feb 24 16:29:21 2016
94.12% done, estimate finish Wed Feb 24 16:29:21 2016
Total translation table size: 2048
Total rockridge attributes bytes: 1690
Total directory bytes: 4096
Path table size(bytes): 26
Done with: The File(s)                             Block(s)    26390
Writing:   Ending Padblock                         Start Block 26425
Done with: Ending Padblock                         Block(s)    150
Max brk space used 0
26575 extents written (51 MB)
$

なお,手元のisolinuxディレクトリにはefiboot.img以外にも下記のようなファイルを置いています。これらのうち,isolinux.binc32の拡張子を持つファイルはsyslinuxに由来し,isolinux.binの起動を補助します。isolinux.cfgはisolinux.bin用の設定ファイルです。その他はPlamo Linuxで作成したファイルで,vmlinuzSystem.mapはカーネルとシンボルテーブル,initrd.gzがインストーラの入ったミニLinux環境,plamo[46]1.lssはisolinux起動時に表示されるスプラッシュイメージ,sample.msgは起動時に表示されるメッセージ,boot.catはmkisofsが生成するEl Torito用のカタログファイルになります。

$ ls DVD_cotents/isolinux/
System.map  efiboot.img  isolinux.bin  ldlinux.c32   libutil.c32  plamo61.lss  vesamenu.c32
boot.cat    initrd.gz    isolinux.cfg  libcom32.c32  plamo41.lss  sample.msg   vmlinuz

こうして作ったDVDイメージ(UEFI-test.iso)は,UEFI環境から起動するとgrubが,System BIOS環境から起動するとisolinuxがそれぞれ起動し,起動環境に応じてインストールできるようになりました。

図2 UEFIから起動したgrub.cfgの起動画面

図2 UEFIから起動したgrub.cfgの起動画面

図3 System BIOSから起動したisolinux.cfgの起動画面

図3 System BIOSから起動したisolinux.cfgの起動画面


今回紹介したような形で,Plamo-6.xは一枚のDVDでUEFIとSystem BIOSに対応できるようになったものの,DVDイメージをベタ書きしたUSBメモリはSystem BIOSからしか起動できないようです。DVDイメージの中身をUSBメモリにコピーしてやればUEFIからも起動できるものの,USBメモリからUEFIブートする場合のみ手順が異なるのは気になるところです。DVDイメージには--uefiオプションを指定してisohybrid処理をしているので,本来はUEFIからでもベタ書きしたUSBメモリを起動できるはずですが,このあたりはもう少し修行が必要なようです。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html