🦥

WSL2の時刻がずれる原因と対処方法

に公開

はじめに

Docker環境やAPIが時刻ずれている旨のエラーによって失敗することがあり、対処方法を調べました。
WSLの時刻ずれについていくつか記事がありますが、詳しい原因をまとめている記事が少なかったので自分なりにまとめました。

WSL2の時刻がずれる原因と対処方法

対処方法

対処方法だけ知りたい方向けに先に記載しておきます。

一時対応

WSL2上で以下のコマンドを実行する。

sudo hwclock -s

このコマンドによって、WSLの時刻を強制的にWindowsのローカルタイムと同期させることが出来ます。

恒久対応

systemd-timesyncd を有効にする

1.systemd 有効化
/etc/wsl.confを開いて(なければ作成して)以下をコピペ

[boot]
systemd=true
  1. 設定後、WSLを完全に再起動
wsl --shutdown
  1. systemd-timesyncd を有効化
sudo timedatectl set-ntp true

原因

WSL2は「軽量な仮想マシン」

WSL2は、Windows上でLinuxを動かせる仕組みですが、その中身は「軽量な仮想マシン(VM)」です。つまり、1台のPCの中に、もう1台別のLinuxマシンが動いているような状態になります。

この「別のマシン」という構造が、時刻がズレる主な原因です。

原因①:ホストとゲストでクロックが分離されている

WSL2は独立した仮想マシンなので、Windows(ホストOS)とは別のシステムクロック(時計)を持っています。
そのため、Windows側の時刻が変わっても、WSL2側ですぐに反映されないことがあります。

原因②:スリープ時に時刻が止まっている

PCをスリープ状態などにすると、その間WSL2側の時間も止まってしまう場合があり、再開すると時刻がズレているという場合があります。

原因③:時刻の同期が標準で動いていない

多くのLinuxシステムは、インターネット上の「時刻サーバー(NTP)」と定期的に通信して、時刻を自動修正します。しかし、WSL2ではNTPによる自動修正が動作していないケースが多いです。

原因④:長時間稼働でジワジワ時計が狂う

WSL2はVM内部の仮想クロックを使っていますが、これはホストと完全には同期していません。そのため、長時間稼働させていると少しずつ誤差が蓄積し、結果的に時刻がズレます。

Discussion