PCをスリープするとWSL 2の日時がずれるバグとそのワークアラウンド


この記事はWSL Advent Calendar 2020の3日目です。

はじめに

この記事の執筆時点で、PCをスリープするとWSL 2の日時がずれるバグが存在します。

WSL2 date incorrect after waking from sleep

Issueを読むと修正プログラムがリリースされたようですが、直った人と直っていない人がいて、まだ完全に修正されたわけではなさそうです。

私も過去最大で3日くらい日時がずれたことがあり、気づかずにgit commitしてコミット日時が盛大にずれてしまったり、apt updateが通らなくなって小一時間ハマったりしました。

hwclockを実行して日時のずれを修正する

ずれた日時の修正は簡単でhwclockを実行するだけで良いです。

hwclock --hctosys

もちろんntpdateでも良いですが、Ubuntu 20.04 LTSには最初からはntpdateが入っていないので、その場合はsudo apt install ntpする必要があります。

cronで定期的に日時のずれを修正する

ずれに気づくたびにコマンドを実行するのは面倒くさいので、私はrootユーザのcrontabに下記を設定して、毎分コマンドを実行するようにしています。

* * * * * /usr/sbin/hwclock --hctosys

cronを起動します。

sudo service cron start

cronではなくsystemdを使いたいかもしれませんが、WSL 2ではsystemdが動きません。
genieを使えばsystemdを動かすことができますが、私の場合は下記のようにいろいろな問題が出たので使うのをやめました。

ログイン時に自動でcronを起動する

なおcronはPCをシャットダウンすると死ぬので、PCをシャットダウンして立ち上げるたびにcronの起動が必要になります。

これも面倒くさいので、私は.bash_profileに下記を設定して、ログイン時にcronが死んでいたら起動するようにしています。

bash_profile
if ! service cron status > /dev/null 2>&1; then
  echo "Firing up cron daemon..." >&2
  sudo service cron start > /dev/null 2>&1
  if service cron status > /dev/null 2>&1; then
    echo "cron now running." >&2
  else
    echo "cron failed to start!" >&2
  fi
else
  echo "cron already running." >&2
fi

これでPCをスリープした際のWSL 2の日時のずれが自動で修正されるようになりました。

おわりに

PCをスリープするとWSL 2の日時がずれるバグとそのワークアラウンドについて書きました。
少しでもみなさんのWSLライフのお役に立てれば幸いです。