今、メインのデスクトップPCではWindowsとUbuntuをデュアルブートさせているんですが、UbuntuをWindowsより後にインストールした際にGRUBブートローダも一緒にインストールされていて、デフォルトでUbuntuが起動するように設定されています。
IMG_5591
Ubuntuはたまに実験で使う程度で普段はWindowsしか使わないのですが、これの何が不便かと言うと、GRUBが起動した際にいちいちWindowsを10秒以内にキー操作で選ばないとUbuntuが起動してしまうという点です。特にWindows Updateで再起動するときに、再起動後10秒以内にWindowsを選択しないとUbuntuが勝手に起動するので、真夜中にWindows Updateが実行されるとUbuntuのログイン画面が表示されたまま朝を迎えてしまいます。
今までも「あー!またUbuntuが勝手に起動しやがった!」とか「あー!またOS選び間違えた!」なんてことが多発しているので、今回はGRUBブートローダの設定を変更し、デフォルトでWindowsが起動するようにしたいと思います。

目的

GRUBの設定を変更し、デフォルトでWindowsが起動するようにする。

使用環境

  • mouse H110M-SI01
  • OS
    • Windows10 Home 21H1(19043.1237 / 64bit)
    • Ubuntu 20.04.1 LTS (64bit)
  • CPU: Intel Core i5-6500 @ 3.20GHz
  • RAM: 16GB
  • ブートローダ: GNU GRUB version 2.04

現在の状態と実現したい状態

「デフォルトでWindowsが起動するように」なんて書きましたが、正確に言えば「デフォルトでGRUBブートローダからWindowsブートローダが起動するように」します。

現在の状態:

  • GRUBブートローダ
    • Ubuntu(既定)
    • Windows Boot Manager
      • Windows 10

実現したい状態:

  • GRUBブートローダ
    • Ubuntu
    • Windows Boot Manager(既定)
      • Windows 10

Windows Boot ManagerというのがWindowsのブートローダです。こいつが起動すれば自動的にWindows10を起動してくれます(複数のWindowsをデュアルブートしていると違ってくるかもしれませんが)。
ブートローダの構成や表示順序は面倒なので変更しません。あくまでもGRUBブートローダの既定の起動カーネルをWindows Boor Managerに変更するだけです。

GRUBの順序を見てみる

まずは現在のGRUBに登録されているカーネルの順序を見てみます。Ubuntuを起動し、端末で以下のコマンドを実行。

$ grep -e "^\(menuentry\)\|\(submenu\)" /boot/grub/grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-3d25245f-880e-4743-b276-6a80ae867393' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-3d25245f-880e-4743-b276-6a80ae867393' {
menuentry 'Windows Boot Manager (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-efi-A66D-E0B6' {
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {

上から優先順位順に表示されます。上の実行結果では Ubuntu, Advanced options for Ubuntu, Windows Boot Manager, …といった順序です。

ここで注意しなければならないのは、起動順序のインデックス値は1からではなく0から始まっていることです。実行結果を見てみると、既定のUbuntuが0番、Windows Boot Managerは2番。よって2番をデフォルトに設定します。

設定変更

/etc/default/grubを弄ります。sudoで実行しないと書き換えできないので注意(管理者パスワードが要求されます)。お好みのエディタでどうぞ。

$ sudo emacs /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

GRUB_DEFAULT=0となっているところをGRUB_DEFAULT=2に変更し保存します。

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=2                # ←ここ
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

設定を反映

/etc/default/grubを保存しただけでは設定が反映されません。
GRUBを更新しgrub.cfgに反映させます。

$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Linux イメージを見つけました: /boot/vmlinuz-5.8.0-48-generic
Found initrd image: /boot/initrd.img-5.8.0-48-generic
Linux イメージを見つけました: /boot/vmlinuz-5.4.0-48-generic
Found initrd image: /boot/initrd.img-5.4.0-48-generic
Linux イメージを見つけました: /boot/vmlinuz-5.4.0-47-generic
Found initrd image: /boot/initrd.img-5.4.0-47-generic
Found Windows Boot Manager on /dev/sda1@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings
完了

grub.cfgを表示し反映されたか確認してみます。

$ grep "set default" /boot/grub/grub.cfg
   set default="${next_entry}"
   set default="2"

デフォルトが2番に設定されていることが確認できました。

再起動

再起動してみます。
IMG_5592
よし、Windowsがデフォルトになってる!
画像では分かりにくいですが、起動して既定でWindows Boot Managerが選択されています。これで起動後いちいちキー操作しなくてもWindowsが起動するようになりました。

Windows Update

ちょうどWindows Updateが来ていたので、再起動させて何も操作せずに更新されるか確認。

…されました。GRUBの選択画面で10秒間何も操作しなければ勝手にWindowsが起動します。よって目的達成です!