UEFI boot 専用 Arch Linux Live USB を作った話
ここで使われている BIOS はブートかファームウェアのどちらかを指しています.
適宜, 括弧などで補っていますがもしかしたらわかりづらいかもしれません
あと, Live USB の作成は Ubuntu 20.04 環境で作成しています.
背景
2, 3 日前あたりに時間ができた (ほんまか?) ので, Arch Linux を入れようとして奮闘した 本題はここじゃないんで飛ばす
まあ, この X240, 元々 SVP かかってたわけでして
そもそも持ってたフォロワーも中古で買ったらしいのでそこらへん知らなかったっぽい
仕方なし…
運良く Secure Boot は Disable, UEFI boot は Enable になってた
けれども, Legacy Boot も Enable で, 優先順位が Legacy > UEFI だった
Legacy Boot はいわゆる昔の BIOS による boot です
そのため, Arch Linux の iso を焼き付けた USB が Legacy の方で起動されてしまった
UEFI で起動するようにしたいので UEFI boot 専用の Live USB を作った
前述の SVP のせいで優先順位が変更できなかったので…
UEFI で boot する理由はインストール先の PC で UEFI boot するには Live USB を UEFI で起動する必要があったため
ブートローダに GRUB を使うと, grub-mkconfig のときに EFI の変数を見に行く /sys/firmware/efi/efivars にあるやつとか
Legacy Boot だとそんなものはない (画像略)
詳しいことはドキュメント読んでほしい (詳しくないので…)
Q. UEFI じゃなくて BIOS (Legacy) boot でもええやん?
A. それはそう
いやマジで正論です…
まあ, なんで UEFI にこだわったかというとロマンですよね UEFI 対応マザボあったら UEFI にしたいじゃん?
(書いてて気づいたけど背景長い)
本題
iso の起動までのプロセスは大雑把に言ってこんな感じ
1. BIOS (マザーボードのファームウェア) が POST プロセスを送る
3. Linux カーネル起動
4. Arch Linux 起動
この中で UEFI boot かどうか決まるのはマザボのファームウェア (1. の部分)
まずは mount -t iso9660 -o loop <iso ファイル> <マウント先> で iso をマウントさせる
中身は EFI/, arch/, isolinux/, loader/, shellx64.efi となっている
arch/ isolinux/ 以外は UEFI に関するものである
arch/ はカーネルなど (超大雑把) を含めたフォルダ
isolinux/ は Live CD 起動用 (syslinux に含まれる, 今回は関係ない)
BIOS で起動するときは arch/boot/syslinux/syslinux.cfg, UEFI のときは loader/loader.conf が読み込まれる設定ファイル (だと思う)
前半はさておき, 後半は何故これだとわかったのかと言うとただ単純に loader/entries/archiso-x86_64.conf が UEFI に関する設定と書いてあって, それ読み込んでるのがさっきのやつだからってだけ
ファイルの中身はこれ:
code:loader/entries/archiso-x86_64.conf
#
# SPDX-License-Identifier: GPL-3.0-or-later
title Arch Linux install medium (x86_64, UEFI)
linux /arch/boot/x86_64/vmlinuz-linux
initrd /arch/boot/intel-ucode.img
initrd /arch/boot/amd-ucode.img
initrd /arch/boot/x86_64/archiso.img
options archisobasedir=arch archisolabel=ARCH_202009
とりあえず, UEFI boot で USB を起動させたいので, USB 差して gdisk /dev/sda で GPT パーティションを作る
/dev/sda のデバイス部分は fdisk -l などで確認してください
パーティションのシステムは EFI System (ef00) で設定
GPT であることが重要で fdisk /dev/sda で MBR パーティション作ると Legacy boot で起動してしまう
余談だけど, マウントした iso を gdisk で見るとエラーで一部分しか見れない
iso は 2 つパーティション持ってて fdisk で見ると一つは EFI System, もう一つは空 (ID: 00) という表示
マウントしたときに見れるファイルは空の方
gdisk で見れるのは EFI System の方
表示は ISO Hybrid になってる
まあ, Legacy boot できるようにしてあるので, 見れないのは当然っちゃ当然
MBR パーティションテーブルなので, GPT ではないしまず読めないのはそれはそう
FAT32 でさっきのパーティションをフォーマット
mkfs.vfat -F32 /dev/sda1
マウントさせる
mount /dev/sda1 <マウント先>
iso の中身を全部マウントした USB にコピー
cp -a <iso のマウント先>/* <USB のマウント先>
もしかしたら, arch/boot/syslinux と isolinux/ 入れないでもいいかもしれない
これらは UEFI でかつ USB での起動には関係ないはずなので
できた USB を X240 にぶっ刺し, F12 で boot メディアを USB からにする
これで, "少なくとも" UEFI で起動できた
まあ, この後に問題があったということです…
本来なら起動後に zsh が起動するはずだが, 起動しない で, ArchWiki やら色々探って原因を特定した
起動するにはラベルか UUID で起動するパーティションを選択する必要があります。デフォルトでは ARCH_2017XX というラベルが使われます (ラベルの文字列はリリース年月になります)。そのため、gparted を使うなどしてパーティションのラベルを正しく設定しなければなりません。また、/mnt/usb/arch/boot/syslinux/archiso_sys.cfg (BIOS ブートの場合) や /mnt/usb/loader/entries/archiso-x86_64.conf (UEFI ブートの場合) の archisolabel=ARCH_2017XX で終わる行を変更することで使用するラベルは変更できます。UUID を使用したい場合、archisodevice=/dev/disk/by-uuid/YOUR-UUID と置き換えてください。UUID は blkid -o value -s UUID /dev/sdXn で確認することができます。
パーティションにラベルをつけてなかった
今回使った iso は archlinux-2020.09.01-x86_64.iso
なので, ラベル ARCH_202009 を先ほどのパーティション /dev/sda1 につける
FAT ファイルシステムでは mlabel /dev/sda1 ::ARCH_202009 でラベルをつけれる
ラベルは, syslinux.cfg, archiso-x86_64.conf にも書いてあるのでそれ見ても良い
archisolabel=ARCH_202009 の部分です
そのあともう一回起動したら zsh に入ったので UEFI での起動に成功
まとめ
1. USB のパーティションを GPT で作成 & FAT32 でフォーマット
2. ラベルをつける
3. iso の中身を全部ぶっこむ
4. 起動
おおまかに以上の手順で Arch Linux の Live USB の作成と起動ができる
最後の二つは syslinux の一部設定とフラグをつけること
これらは Legacy boot の際に必要なことなので今回は関係ない
普通にこれで丸一日潰れてしまったのでつらい
けど, ある程度そこらへんの知識は詳しくなれた気がする