16 May 2020

UEFIでのデュアルブートのUbuntu 18.04と20.04のgrubの設定

Ubuntu 18.04がインストールされているPC(UEFIブート)に、20.04を別パーティションにインストールしたときの、grub設定の方法。

検証環境
・ThinkCentre M720q Tiny (Core i3-8100T, B360 chipset, UHD graphics 630)
・Windows 10 , Ubuntu 18.04 , Ubuntu 20.04 マルチブート

Ubuntu 20.04インストール直後の状態

EFIブートマネージャーのエントリーと起動フラグ

$ sudo efibootmgr
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0000,000A,0006,0007,0004,0005
Boot0000* Windows Boot Manager
Boot0001* ubuntu
Boot0004* Generic Usb Device
Boot0005* CD/DVD Device
Boot0006* UEFI: PXE IPV4 Intel(R) Ethernet Connection (7) I219-V
Boot0007* UEFI: PXE IPV6 Intel(R) Ethernet Connection (7) I219-V
Boot000A* ubuntu
 
$ sudo efibootmgr -v
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0000,000A,0006,0007,0004,0005
Boot0000* Windows Boot Manager	HD(1,GPT,8263c8c9-00b6-457e-a668-ac716e57875b,0x800,0x82000)/File(\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...s................
Boot0001* ubuntu	HD(1,GPT,8263c8c9-00b6-457e-a668-ac716e57875b,0x800,0x82000)/File(\EFI\UBUNTU\SHIMX64.EFI)
Boot0004* Generic Usb Device	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0005* CD/DVD Device	VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)
Boot0006* UEFI: PXE IPV4 Intel(R) Ethernet Connection (7) I219-V	PciRoot(0x0)/Pci(0x1f,0x6)/MAC(98fa9b6acb1d,0)/IPv4(0.0.0.00.0.0.0,0,0)..BO
Boot0007* UEFI: PXE IPV6 Intel(R) Ethernet Connection (7) I219-V	PciRoot(0x0)/Pci(0x1f,0x6)/MAC(98fa9b6acb1d,0)/IPv6([::]:<->[::]:,0,0)..BO
Boot000A* ubuntu	HD(1,GPT,8263c8c9-00b6-457e-a668-ac716e57875b,0x800,0x82000)/File(\EFI\UBUNTU\GRUBX64.EFI)..BO

パーティションの状況

$ sudo lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  vfat   SYSTEM      947F-F17C                            /boot/efi
├─sda2                                                          
├─sda3  ntfs   Windows     786685CD66858C96                     
├─sda4  ntfs   WinRE_DRV   BC02870B0286CA3A                     
├─sda5  swap               046944a6-e95a-4774-bdea-ed92ac2e72c2 [SWAP]
├─sda6  ext4   ubuntu18.04 a04269a9-79f4-4c67-ad4c-f6d5278612d2 
├─sda7  ext4   ubuntu20.04 55e586a6-358d-4c98-8ef8-7f7d3652201b /
├─sda8                                                          
├─sda9  ntfs   TEMP        DE0E157E0E15513F
├─sda10 ntfs   DATA        C61EC4391EC42471                     
├─sda11 ntfs   VM-NTFS     30B4DD69B4DD3258                     
└─sda12 ext4   vm-ext4     3a6a63bb-b5d9-40d0-ba63-682b5e35ab04 

Ubuntu 20.04をインストールする前は、Ubuntu 18.04のgrubブートメニューが表示されていたが、20.04インストール後は20.04のgrubブートメニューが表示されるようになる。

どちらのgrubブートメニューが表示されるかは、EFIパーティションにあるgrub.cfgで選択するようになっている。

UEFIブート → EFIパーティションのgrug.cfg → OSパーティションのgrub.cfg

という順に読み込まれていく

$ mkdir /tmp/sda1
$ sudo mount /dev/sda1 /tmp/sda1       ← まず、EFIパーティションをマウントする
 
$ sudo ls -la /tmp/sda1/EFI/ubuntu
合計 4200
drwx------ 2 root root    4096  5月 15 22:44 .
drwx------ 5 root root    4096  8月 25  2019 ..
-rwx------ 1 root root     108  5月 15 12:50 BOOTX64.CSV
-rwx------ 1 root root     194  5月 15 22:44 grub.cfg
-rwx------ 1 root root 1677176  5月 15 12:50 grubx64.efi
-rwx------ 1 root root 1269496  5月 15 12:50 mmx64.efi
-rwx------ 1 root root 1334816  5月 15 12:50 shimx64.efi
 
$ sudo cat /tmp/sda1/EFI/ubuntu/grub.cfg
search.fs_uuid 55e586a6-358d-4c98-8ef8-7f7d3652201b root hd0,gpt7 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

Ubuntu 18.04のgrubブートメニューに変更する

EFIパーティションのgrub.cfgを、Ubuntu 18.04のパーティションのUUIDを指すように変更する。

[EFIパーティション] /EFI/ubuntu/grub.cfg 変更前
search.fs_uuid 55e586a6-358d-4c98-8ef8-7f7d3652201b root hd0,gpt7 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
[EFIパーティション] /EFI/ubuntu/grub.cfg 変更後
search.fs_uuid a04269a9-79f4-4c67-ad4c-f6d5278612d2 root hd0,gpt6 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

grubブートメニューのデフォルトOS名にバージョン番号を付ける方法

Ubuntu 18.04のgrubブートメニューでは、次のように表示される

*Ubuntu       ← これに、バーション番号を表示させたい (例 : Ubuntu 18.04)
 Advanced options for Ubuntu
 Windows Boot Manager (on /dev/sda1)
 Ubuntu 20.04 LTS (20.04) (on /dev/sda7)
 Advanced options for Ubuntu 20.04 LTS (20.04) (on /dev/sda7)
 UEFI System setup

grub設定ファイルを次のように変更する (変更前、変更後)

/etc/grub.d/10_linux (変更前)
 〜 略 〜
 
linux_entry ()
{
  os="$1"
  version="$2"
  type="$3"
  args="$4"
 
  if [ -z "$boot_device_id" ]; then
      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
 
 〜 略 〜
 
      fi
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi      
  if [ "$quick_boot" = 1 ]; then
      echo "	recordfail" | sed "s/^/$submenu_indentation/"
  fi
 
 〜 略 〜

赤で着色した部分を次のように書き換える

      fi
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      version_ubuntu="`lsb_release -r -s`"
      title="$(gettext_printf "%s %s" "${os}" "${version_ubuntu}")"
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi      
  if [ "$quick_boot" = 1 ]; then

grub-update

設定ファイルの修正や、カーネルのアップデートがあった場合は、

$ sudo grub-update

を実行することで、ブートするパーティションごとに設定ファイルを読み込んで grub.cfg を作成できる。

つまり、Ubuntu 18.04パーティションのgrub-updateコマンドは、 18.04パーティションの/etc/grub.dや/etc/defaults/grub という設定ファイルを読み込んでしょりするだけでなく、 20.04パーティションの各設定ファイルを読み込んで、それぞれのOS用のmenuentryを作成してくれる。