それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

EFIでマルチブートを作ると区別できない。(全部Ubuntuで区別つかん)

EFI パーティションデュアルブートを作りました。

EFIパーティションには、OSごとにブートを設定を書くことができます。

EFIパーティションを使うように grub をインストールする。

sudo grub-install --target=x86_64-efi

細かく指定すると

grub-install --target=x86_64-efi --boot-directory=/boot --recheck /dev/sda

UbuntuUbuntuデュアルブートを作ると区別できない

頑張っても以下のように、同名で登録されてしまう。

takuya@spare:~$ sudo efibootmgr -v
BootCurrent: 0002
Timeout: 0 seconds
BootOrder: 0000,0002,0007,0008,0005,0006
Boot0000* ubuntu       HD(1,GPT,c80c6849-859c-4251-99d1-085d5b56fdf3,0x800,0x10000)/File(\EFI\UBUNTU-MAIN\SHIMX64.EFI)
Boot0002* ubuntu       HD(5,GPT,3fdd0e27-fad1-4afc-9534-5dfbab47c8d4,0x10800,0x10000)/File(\EFI\UBUNTU-SPARE\SHIMX64.EFI)
Boot0005* Generic Usb Device    VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0006* CD/DVD Device VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)

ubuntu 多すぎて区別できねぇ

ESP を複数作って区別してみた。

ESPを2つ作ったら、行けた

ESP(EFI System Partition)を複数作って、Grubの設定で名前を変えた。

root@livaz:/home/takuya# efibootmgr -v
BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0000,0002
Boot0000* ubuntu-main   HD(1,GPT,c80c6849-859c-4251-99d1-085d5b56fdf3,0x800,0x10000)/File(\EFI\ubuntu-main\shimx64.efi)
Boot0002* ubuntu-spare  HD(5,GPT,3fdd0e27-fad1-4afc-9534-5dfbab47c8d4,0x10800,0x10000)/File(\EFI\UBUNTU-SPARE\SHIMX64.EFI)

再現方法

最初に次のような、パーティションを用意した

/dev/sda1 # ESP for ubuntu-main
/dev/sda2 # ESP for ubuntu-spare
/dev/sda3 # ubuntu-main root fs
/dev/sda4 # ubuntu-spare root fs

2つのシステムパーティションと2つのESPを用意した。Ubuntursyncでコピーした。

GRUBの設定をする。

sudo su
echo GRUB_DISTRIBUTOR="Ubuntu main" >> /etc/default/grub
update-grub
grub-install --target=x86_64-efi

もう一つのOSはchroot で入って。

## 
sudo mount /dev/sda4 /mnt
sudo mount /dev/sda2 /mnt/boot/efi
##
cd /mnt
sudo mount -t proc proc proc/
sudo mount -t sysfs sys sys/
sudo mount -o bind /dev dev/
sudo mount -t devpts pts dev/pts/
## 
sudo chroot /mnt

grub を設定

echo GRUB_DISTRIBUTOR="Ubuntu spare" >> /etc/default/grub
update-grub
grub-install --target=x86_64-efi
exit

efi を確認する。

EFIを確認する。

root@ubuntu-main:/home/takuya# efibootmgr -v
BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0000,0002
Boot0000* ubuntu-main   HD(1,GPT,c80c6849-859c-4251-99d1-085d5b56fdf3,0x800,0x10000)/File(\EFI\ubuntu-main\shimx64.efi)
Boot0002* ubuntu-spare  HD(5,GPT,3fdd0e27-fad1-4afc-9534-5dfbab47c8d4,0x10800,0x10000)/File(\EFI\UBUNTU-SPARE\SHIMX64.EFI)

EFPが2つあれば、Ubuntuが2つあっても別々のEFIを使えることがわかった。

GRUB_DISTRIBUTOR

GRUB_DISTRIBUTOR を指定すると、Grubのメニューで設定される名前やEFIに書かれるファイルが異なるように指定できる。

ただし、'ubuntu/main'のようなスラッシュ区切りの名前を指定すると、EFIパーティションディレクトリ階層が深くなってしまい、起動できなくなる。

以下は、間違ってスラッシュを指定したときの例。

Boot0000* ubuntu-main   HD(1,GPT,xxx)/File(\EFI\UBUNTU\MAIN\SHIMX64.EFI)

階層が深くなりすぎている。

EFI の問題点(Ubuntu複数)

ESPが一つではだめな理由。

EFI は ESPをgrub を インストールにするのだが、Ubuntuが複数あると厄介になる。

Ubuntu2つ(便宜上 main / spare とする) が、それぞれを同じEFIの名前の箇所に設定を書いてしまう。

ubuntu-main も ubuntu-spareも「同じファイル」を書き込みに行く。

\EFI\UBUNTU\SHIMX64.EFI
\EFI\UBUNTU\GRUB.CFG

このため、Ubuntuデュアルブートするときは、EFIを固定ができない。

EFIから起動するGrubデュアルブートを担当することになる。

GRUB設定でOS_PROBEを有効にしておくとデュアルブートEFIではなくGrubで実行できる。

GRUBでは厄介な問題が出てくる。

grub を使う場合、grububuntu-main の /boot なのか、ubuntu-spare の /boot なのか全くわからない。

またgrub はUSBシリアルコンソールを使えないので、リモートからどちらをブートさせるかを明示的に選ぶことが不可能だった。

grub にはデフォルトでどのメニュー項目を選ぶ設定がある

grub デフォルト選択を指定して再起動

たとえば、メニュー項目4番で起動するように設定してみると

sudo grub-reboot 4

この設定を永続化するとか

sudo grub-set-default 0

最後に選択したGrub項目を常にデフォルトにするとか

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

これらは一見すると便利そうに見えるが、grub が複数あるとすげえ不便である。

ubuntu-spare で起動して、apt upgrade をかけたときに grub が更新されてしまったり。

これを固定するには、OS_PROBEを設定した上で、GRUB_DEFAUTを固定する

GRUB_DEFAULT="ubuntu-main"

さらに、/bootをルートファイルシステムから切り離して共有してしまえばスッキリするのだが。

cryptsetup で LUKSしているとOS_PROBEする前にかならず cryptsetup open をしておかないといけないのでとても面倒である。

efiの場合はすごく簡単

EFIの場合は、次に起動するOSを選ぶのが簡単。

ブートの番号を指定して next boot に指定するだけ。

efibootmgr --bootnext 0002

ブートの番号は、次のように簡単に確認できる。

efibootmgr
BootCurrent: 0004
Timeout: 1 seconds
BootOrder: 0004,0005,0001,0002,0003
Boot0001* UEFI:CD/DVD Drive
Boot0002* UEFI:Removable Device
Boot0003* UEFI:Network Device
Boot0004* Ubuntu
Boot0005* Debian

デフォルトのブート順を変更することも可能

efibootmgr -o 0005,0004,0001

順序を簡単に触れるし確実に変更ができる。

同じOSをデュアルブートするのが難しい。

ところが、同じ名前のOSがあるとこれが面倒になる。

またEFIパーティション(ESP)が一つだけだと、前述の通り上書きされてしまう。よってESPが2つ必要になるが、それでもやっぱりめんどくさい。

EFIでOS選択起動するのであれば、ESPを複数用意する。

grubからOS選択起動するのであれば、OS更新時に順番が変わってしまう。

EFIBIOS/UEFIからも閲覧できる

EFIを設定ミスって消しちゃったたりした場合。 ESPはBIOS/UEFIから、フォルダを探索して、指定することができる。

このとき、次のファイルがあるが shimx64.efi を選ぶのが一般的である。

BOOTX64.CSV  fbx64.efi  grub.cfg  grubx64.efi  mmx64.efi  shimx64.efi

shimx64.efi は署名チェックのブートなので今どきはこれを使う。

  • shimx64 はセキュアブート用。通常はこっちを使う
  • grubx64.efiは非セキュアブート用、CSM無効でセキュアブート無効ときに使う。
  • CSM有効にするとBIOS互換(Legacy)になるので、ESP(EFI system partition)が使われない。

起動したら、grub-install で再度作り直し。

grub.cfg は grub 起動時に、読み込まれる

takuya@debian:~$ sudo cat /boot/efi/EFI/debian/grub.cfg
search.fs_uuid daf1dc18-4abc-4d18-b2ee-6996b190e96e root hd0,gpt4
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

grubgrub を探す。EFIからGrubを起動してその設定に従って、/boot/grubをさがしそっちのGrubに処理を移す。再帰的なのでちょっとわかりにくい。

ESPを作るときの謎

これはESPを作っていて謎だったんだけど

以下のファイルが無いとUEFIが反応しなかった。

boot/efi/EFI/BOOT/
boot/efi/EFI/BOOT/BOOTX64.EFI
boot/efi/EFI/BOOT/fbx64.efi
boot/efi/EFI/BOOT/mmx64.efi

initramfsからブートするする

initramfsで止まったときも、自分で何とかすることができる。

(initramfs) cryptsetup luksOpen /dev/sda3 dm_crypt-0
(initramfs) mount /dev/mapper/vg-lv /root
(initramfs) exec swich_root /root /sbin/init

結論、OSを分ける。

電車での移動時などに、散々考えた結果、Ubuntuデュアルブートは非常にめんどくさい。DebianDebianでも同じ。同じディストリビューションデュアルブートは超めんどくさいという結論に達した。

そこで、ESPを1つににして、debian / ubuntuデュアルブートにした。

デュアルブートはちょっと便利。

デュアルブートを仕掛けておくと、任意のタイミングでOSを切り替えて起動ができる

これで、確実に指定したOSから起動するようになる。

efibootmgr --bootnext 0002

チェックディスクを掛けたいときや、ディスクの容量変更したいときに、メンテナンスにはデュアルブートを仕掛けておくと、リモートから行えるので便利だと思う。

remount で read only にしてもいいと思うんだけど、docker や lxc や systemdが複雑にマウントを使ってる現代のLinuxで read only で動かすのは超めんどくさい。

ちょっとディスクのリサイズをしたいときにUSBをぶっ刺しに行くのも面倒だし、リモートからSSHだけで操作が完結するようなメンテナンス方法を模索してるが、シリアルコンソールが使えない場合はデュアルブートがベターなんだろうなと思ってる。