UEFI環境でFAT領域を無くす

ここに記載するコマンドは非常に危険で、スペルミスや大文字/小文字を間違えただけで取り返しのつかない事態となります。全て、自己責任でお願いします。また、ここで示すbios_grubによる対応は決してメジャーな方法ではありません。マザーボード/BIOSによっては対応できないものもあります。

         キーワード:bios_grub

UEFI方式が出現し10年以上経過していますが、未だに壊れやすいFAT領域 512MB以上 を必要としている点には疑問を感じます。マウントしない対応や、ReadOnlyでマウントすることも可能ですが、アップデート時にrwマウントするのを忘れ、トラブルとなるケースもあります。

これを打開する方法として、bios_grubという1MBの小さなパーティションを設けることで、UEFIシステムで従来のMBR方式で起動させる対応があります。この対応は、ChatGPT先生でも誘導してあげないと正しいガイドをしてくれないので、ここで整理します。以下、Ubuntu22.04では動作確認済みです。

パーティションの作成は、gpartedというGUIツールを使えばマウス操作だけでも可能で、実際、私もしばらくはgpartedを使って調整していました。しかし、M.2 SATAも普及しUEFIへの対応場面が増え、GUI操作がうっとおしくなってきたので、コマンド対応にしました。コマンドは sgdisk を使います。

## 環境に合わせて・・・
SSD=/dev/nvme0n1
SSDp2=/dev/nvme0n1p2

## パーティションテーブルを作る。以下、状況に合わせて・・・
sgdisk --clear $SSD ## 既存のパーティションデータを消去
sgdisk -Z $SSD ## 上記でエラーの場合は根こそぎクリア
sgdisk -g $SSD ## MBRをGPTに変更する場合(元データは消えない)
sgdisk -G $SSD ## もしクローンしたSSDならGUID(固有値)を変える

sgdisk -L ## [参考] ef02, 8300などのtypeの説明を表示

## パーティションを区切る。bios_grubは+1MでもOK。
## EF02の区画にはgrub-installでcore.img(MBR/i386)が入る。

sgdisk -n 0:0:+2M -t 0:ef02 -c 0:"bios_grub" $SSD
sgdisk -n 0:0:0 -t 0:8300 -c 0:"ROOTFS" $SSD

## ROOTFS区画をフォーマット
mkfs.ext4 -L ROOTFS $SSDp2
tune2fs -c0 -i0 $SSDp2   ## ディスクチェック無効化
e2label $SSDp2 ROOTFS    ## LABEL付与はmkfsでやる

## マウント
mount LABEL=ROOTFS /mnt

こうして作ったパーティションは下記のようにFAT32領域が無しとなります。このシンプルなパーティションで、下記では/dev/sdh2にユーザランドをコピーすれば、UEFIマザーボードでUbuntu22.04が起動します!

--

以下は、LinuxのクローンSSDを作成するときの実施例(ご参考)です。ここでのrootfsのコピー実施方法はケースバイケースでノウハウも必要です。ここではあえて明記しませんが、コピー元の/bootや/homeが別パーティションになっている場合には、それらの内容もROOTFS(/mnt)に全部コピーする必要があります。

## rootfsのコピー . . . . . (割愛)

## chrootの準備
mount -t proc proc /mnt/proc
mount -obind /dev /mnt/dev
mount -obind /dev/pts /mnt/dev/pts
mount -obind /sys /mnt/sys
chroot /mnt

## chrootの新技!
apt install arch-install-scripts     ## 新技を仕込む
cp /mnt/etc/fstab /mnt/etc/fstab_org ## backup
genfstab
-L /mnt > /mnt/etc/fstab    ## 新技①
arch-chroot /mnt                     ## 新技②

vi /etc/defaults/grub   ## 下記4行を追加(任意)
GRUB_RECORDFAIL_TIMEOUT=5
GRUB_DISABLE_OS_PROBER=true
GRUB_DISABLE_LINUX_UUID=true
GRUB_DEVICE="LABEL=ROOTFS"

## /etc/fstabの編集(上記の新技①で作ってあれば不要)
## 例)LABEL=ROOTFS ext4 defaults 0 1


## chroot環境でのオペ
findmnt /   ## SSDバイスsdh,nvme0n1 などを確認
         # 指定するのはパーティションではなくデバイス ↓↓
grub-install --target=i386-pc /dev/nvme0n1

update-grub ## Debian/Ubuntu系での対応
grub2-mkconfig -o /boot/grub2/grub.cfg ## RHEL系での対応(未確認)

## マシンIDを更新。忘れないで!
rm -f /etc/machine-id
systemd-machine-id-setup
exit

 

参考になったページ:
GRUB/ヒントとテクニック - ArchWiki 
ArchLinuxのページですが、
Ubuntuでもほぼ同じです。core.imgの説明がとても参考になりました。



なお、bios_grubに対応できないマザーボード/BIOSについてはFAT領域を作るしかありません。その場合の対応例も示しておきます。パーティションは3つにしてみます。ここでは省略しますが、スクリプトにする場合はcopilot等を使ってエラー処理をちゃんと入れてくださいね。

SSD=/dev/nvme0n1
SSDp1=/dev/nvme0n1p1
SSDp2=/dev/nvme0n1p2

SSDp3=/dev/nvme0n1p3

sgdisk --clear $SSD
sgdisk -n 0:0:+512M -t 0:ef00 -c 0:"efi"    $SSD
sgdisk -n 0:0:-1G   -t 0:8300 -c 0:"rootfs" $SSD
sgdisk -n 0:0:0     -t 0:8300 -c 0:"log"    $SSD

mkfs.vfat -F 32 $SSDp1   ## /boot
fatlabel $SSDp1 BOOT

mkfs.ext4 -L ROOTFS $SSDp2 ## /
tune2fs -c0 -i0 $SSDp2

mkfs.ext4 -L LOG $SSDp3    ## /var/log
tune2fs -c0 -i0 $SSDp3

mount LABEL=ROOTFS /mnt
mount LABEL=BOOT   /mnt/boot
mount LABEL=LOG    /mnt/var/log

## ユーザランド(/)の作成 <省略>

genfstab -L /mnt/ > /mnt/etc/fstab
arch-chroot /mnt

mount -a
grub-install --target=x86_64-efi --removable /dev/nvme0n1
update-grub

rm -f /etc/machine-id
systemd-machine-id-setup
exit

 

その他: