【Linux】32bit版ブートローダ(bootia32.elf)作成手順

IT関連
スポンサーリンク

今回は、別件(お遊び)で、32bitUEFIのみ対応しているが、64bitアーキテクチャに対応しているハードウェア(※以下、本ハード)に対してのブート用に、ブートローダをmakeしたので、その際のメモを作成しました。

本件の内容は、「ブートまでは上手くいった」(※1)内容となります。

(※1)ブート出来ても、カーネルが起動するとは限りません。

事前準備として、「CentOS系」のライブUSBを用いて、本ハードで起動できるか確認取ってから試すと良いと考えています。

CentOS系は、32bit64bit両方のブートローダ(※2)に対応しています。

(※2)あくまでもブートに対応しているだけで、32bitカーネルが提供されている訳ではありません。

作業前提について

今回は、インストール用USBを作成する前提で記載しています。

32bitUEFIブートローダ入り、64bit版インストールUSBの作成手順

カンタンに手順を纏めると、以下が必要になります。

  • 64bit版のインストーラを用意する
  • 32bit版のブートローダを用意する ※Ubuntu系は必要。CentOS系は不要。
  • grub.cfgを書き換える

64bit版のインストーラの用意

各種、任意のLinux(ディストリビュージョン)のインストーラを用意します。

ここでは、仮に「Ubuntu」を例に記載します。

※実際にメインで検証したのは「Lubuntu 20.04 LTS」となります。

インストールISOイメージをダウンロードし、USBメモリに書き込みます。

Windows から書き込みには「Rufus」等のソフトウェアを使えば書き込みできます。

Linux系なら、ddコマンドで書き込めます。

32bit版のブートローダを用意

UEFI32bitでブートするために「bootia32.efi」が必要です。

ここでは、ソースコードからmakeする際の手順を纏めています。

※なお、「CentOS」系の場合は不要です。(インストーラに「bootia32.efi」が組み込まれています)

ブートローダ( 「bootia32.elf」 )作成手順

まず、Linux環境を用意してください。

今回は、仮想環境にインストール済の「Lubuntu 20.04 LTS」を使用しました。

※インストール方法は、以下の記事に記載しています。

以下、ターミナルで以下を実行していく。

※インストール(apt-get)しているパッケージについては、試行錯誤してたので、不要なパッケージが含まれているかもしれません。(不要だと判断できる方は、適時判断してください。)

$ mkdir tmp_efi32bit
$ cd ./tmp_efi32bit
$ sudo apt-get update -y
$ sudo apt-get install -y git build-essential
$ sudo apt-get install -y bison libopts25 libselinux1-dev autogen m4 autoconf help2man libopts25-dev flex libfont-freetype-perl automake autotools-dev libfreetype6-dev texinfo
$ sudo apt-get install -y autoconf automake libtool autoconf-doc libtool-doc shtool pkg-config

$ git clone git://git.savannah.gnu.org/grub.git
$ cd grub
$ ./bootstrap
$ ./autogen.sh
$ ./configure --with-platform=efi --target=i386 --program-prefix=''
$ make
$ cd grub-core/
$ sudo ../grub-mkimage -d . -o bootia32.efi -O i386-efi -p /boot/grub/ ntfs hfs appleldr boot cat efi_gop efi_uga elf fat hfsplus iso9660 linux keylayouts memdisk minicmd part_apple ext2 extcmd xfs xnu part_bsd part_gpt search search_fs_file chain btrfs loadbios loadenv lvm minix minix2 reiserfs memrw mmap msdospart scsi loopback normal configfile gzio all_video efi_gop efi_uga gfxterm gettext echo boot chain eval
$ ls -l bootia32.efi
-rw-r--r-- 1 root root 737280 11月 14 19:05 bootia32.efi
$
USBメモリに「 bootia32.elf 」を配置

コピペが終わったら、32bitのブートイメージ「bootia32.efi」を「EFI/BOOT」配下にコピーします。

「grub.cfg」の書き換え

インストール対象のCPUによって、カーネル起動オプションを変更する必要がある。

※「Bay-Trail」など、フレームバッファに関する問題があり、カーネルモードセッティング(KMS)を無効化する必要がある様子。(i915.modeset=0を追加する)

menuentry "Ubuntu (safe graphics)" {
	set gfxpayload=keep
	linux	/casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed maybe-ubiquity quiet splash nomodeset i915.modeset=0---
	initrd	/casper/initrd
}
デバッグ出力

なお、デバッグ出力する際は「grub.cfg」に以下を追加します。

# デバッグログを1ページ単位で表示(moreコマンドと同等)
set pager=1
# デバッグ出力を有効化する
set debug=all

まとめ

調査した限りの内容を纏めてみましたが、カーネル起動に失敗するハードウェア(Q584/H等)もあり、そして、その原因は明確に分からない事が多いと感じています。

(デバッグ出力したとしても、ソースコード上の特定行で止まったとしても、その根本原因は不明等、カーネルに関する詳細知識が無いと、歯が立たない印象)

コメント

タイトルとURLをコピーしました