EFI パーティションにデュアルブートを作りました。
EFIパーティションには、OSごとにブートを設定を書くことができます。
EFIパーティションを使うように grub をインストールする。
sudo grub-install --target=x86_64-efi
細かく指定すると
grub-install --target=x86_64-efi --boot-directory=/boot --recheck /dev/sda
Ubuntu とUbuntuのデュアルブートを作ると区別できない
頑張っても以下のように、同名で登録されてしまう。
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を用意した。Ubuntuはrsyncでコピーした。
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 を使う場合、grubが ubuntu-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更新時に順番が変わってしまう。
EFI はBIOS/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
で再度作り直し。
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
grubがgrub を探す。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のデュアルブートは非常にめんどくさい。DebianxDebianでも同じ。同じディストリビューションのデュアルブートは超めんどくさいという結論に達した。
そこで、ESPを1つににして、debian / ubuntu のデュアルブートにした。
デュアルブートはちょっと便利。
デュアルブートを仕掛けておくと、任意のタイミングでOSを切り替えて起動ができる
これで、確実に指定したOSから起動するようになる。
efibootmgr --bootnext 0002
チェックディスクを掛けたいときや、ディスクの容量変更したいときに、メンテナンスにはデュアルブートを仕掛けておくと、リモートから行えるので便利だと思う。
remount で read only にしてもいいと思うんだけど、docker や lxc や systemdが複雑にマウントを使ってる現代のLinuxで read only で動かすのは超めんどくさい。
ちょっとディスクのリサイズをしたいときにUSBをぶっ刺しに行くのも面倒だし、リモートからSSHだけで操作が完結するようなメンテナンス方法を模索してるが、シリアルコンソールが使えない場合はデュアルブートがベターなんだろうなと思ってる。