Ubuntu 20.04.4 とWindows10でデュアルブートをする

grubを再インストールした際にUbuntuとWindowsのデュアルブートの設定をやり直したので、そのメモ。
最終的なゴールはPC起動時に以下のような画面を表示させ、UbuntuかWindowsを選べるようにします。ほっといたらWindowsが起動されるようにも設定します。
![Screenshot from 2022-05-07 14-46-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/797e3f6c-64e9-5a89-0089-54f18273762e.png)

Windows, Ubuntuはどちらもすでにインストールされている前提です。
Ubuntuのバージョンは **20.04.4 LTS** です。

自分はUbuntuとWindowsの組み合わせでやりましたが、grubをブートローダとして使用していればCentOS等でも同じやり方で同じことができると思います。

# Ubuntuの起動優先順位を上げる

上の画像は、右上にも書いてあるとおりUbuntuのブートローダであるgrubの画面です。流れとしては

* PCを起動
* Ubuntuがインストールされているディスクからgrubを読み込む
* grubが起動するOSをユーザが選ぶ
* 選ばれたOSが起動する

となります。ですのでUEFIの設定でUbuntuのディスクの起動優先順位をWindowsよりも上にしておく必要があります。

# grubにWindowsを認識させる

普通にUbuntuを起動しても上のような画面は表示されると思いますが、Windows Boot Managerの表示が無いと思います。これはUbuntuのブートローダであるgrubがWindowsの存在を知らないからです。grubにWindowsを認識させるためには以下のコマンドを使用します。

```
$ sudo update-grub
```
以下のような出力が得られるはずです。

```
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.13.0-40-generic
Found initrd image: /boot/initrd.img-5.13.0-40-generic
Found linux image: /boot/vmlinuz-5.13.0-37-generic
Found initrd image: /boot/initrd.img-5.13.0-37-generic
Found linux image: /boot/vmlinuz-5.11.0-43-generic
Found initrd image: /boot/initrd.img-5.11.0-43-generic
Found Windows Boot Manager on /dev/sdd2@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings
done
```
下から3行目のFound Windows Boot Managerという所でgrubがWindowsの存在を認識しています。
再起動すれば記事トップの写真のようにWindowsも含めた選択肢が出てきて、それを選べばちゃんとWindowsが起動するはずです。

# Windowsをデフォルトの選択肢にする

現時点ではWindowsが選択肢として表示されているものの、カーソルは最初Ubuntuに向いており、放置していると勝手にUbuntuが起動してしまいます。

Ubuntuをよく使う人であればそれでいいでしょうが、Windowsをメインに使うのであればWindowsを起動するために毎回選択するのは面倒です。そこで、デフォルトの選択肢をUbuntuからWindowsに変更し、放置しておけばWindowsが自動起動されるように設定します。

私の環境ではgrubの起動選択画面でWindows Boot Managerは上から3番目に表示されていました。grubではデフォルトで起動するOSをこの選択肢の番号で指定します。一番上の選択肢が0番なので、上から3番目をデフォルトにするためには **2**番を指定してやればいいわけです。もしWindows Boot Managerの表示されている位置が異なる場合は、それに合わせて以下の設定番号を適宜変えてください。

grubの設定ファイルは `/etc/default/grub` にあります。ただしこの設定ファイルの場所や名前はバージョンやディストリビューションによって違う可能性があります。

この設定ファイルを以下のように書き換えます。

```
GRUB_DEFAULT=0
↓
GRUB_DEFAULT=2
```

編集が終われば再度 `update-grub` を実行し設定の変更を適用します。

なお、`GRUB_TIMEOUT`の値を変更することでデフォルトの選択肢が自動的に選ばれるまでの時間を変更したりもできます。

再起動すればWindows Boot Managerがデフォルトの選択肢になっており放置しておけば自動的に起動されるようになったと思います。

# UbuntuとWindowsの時刻合わせ

多くの人はUbuntuをインストールした際に設定することかと思うのですが、grubを再インストールした際にこちらの設定もリセットされてしまったので合わせて書いておきます。

Ubuntuを起動した後にWindowsを起動すると、時刻が大きくずれていることに気づくかと思います。

以下のコマンドを実行すれば直ります。

```
sudo hwclock --systohc --localtime
```

時刻のずれが起こる原因としてはLinuxとWindowsのハードウェアクロックの取り扱い方にあるようです。

PCにはマザーボード上の時計であるハードウェアクロックと、OSが使用する時計のシステムクロックがあります。システムクロックは電源が切られている間は当然動かないので、電池で常に動き続けているハードウェアクロックを基準として起動時に設定されます。

この際Windowsはハードウェアクロックをそのままシステムクロックとして使用しますが、LinuxはハードウェアクロックをUTCの時刻として認識し、そこからタイムゾーンの補正を入れてシステムクロックを初期化するそうです。

同時に、LinuxはNTPサーバから取得したUTCの時刻でハードウェアクロックを上書きしてしまうため、次にWindowsを起動するとUTCで上書きされたハードウェアクロックをシステムクロックとして使用してしまい日本時間とずれが発生します。

これを修正するためにLinuxでもハードウェアクロックをそのままシステムクロックとして使用するように設定するのが上のコマンドです。
--systohcをつけることで現在のハードウェアクロックの時刻をシステムクロックの値で上書きし、
--localtimeをつけることでハードウェアクロックをローカルタイム(日本時間)として扱うように設定します。

これによりLinux, Windowsの双方がハードウェアクロックを日本時間で取り扱うようになったので時刻ズレが解消されます。

# 参考サイト

[Windows 10とUbuntu 18.04 デュアルブートする方法](https://www.pc-koubou.jp/magazine/35542)

[GRUB起動メニューのタイムアウト時間、起動するOSの変更](http://nao-yu-ki-pc.blogspot.com/2018/05/grub2.html)

[デュアルブート時のLinuxとWindowsの時刻のズレを解消する](https://dlrecord.hatenablog.com/entry/2020/06/13/112553)

[パソコンの時計　ハードウェア クロックとシステム クロック](http://park12.wakwak.com/~eslab/pcmemo/clock/index.html)

[Man page of HWCLOCK](https://linuxjm.osdn.jp/html/util-linux/man8/hwclock.8.html)