この記事は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を動かすことができますが、私の場合は下記のようにいろいろな問題が出たので使うのをやめました。
genie -sすると$PATHからWindows側のディレクトリが消失するやんけ…。
— 長男 (@ngmy) September 25, 2020
localeもぶっ壊れるな。
— 長男 (@ngmy) September 25, 2020
genieを使ってWSL 2でsystemdを動かしてますって人たち、$PATHとかlocaleとかどうしてるんだ?泥臭く自分で.login等を書いてるのか?
— 長男 (@ngmy) September 25, 2020
ログイン時に自動でcronを起動する
なおcronはPCをシャットダウンすると死ぬので、PCをシャットダウンして立ち上げるたびにcronの起動が必要になります。
これも面倒くさいので、私は.bash_profile
に下記を設定して、ログイン時にcronが死んでいたら起動するようにしています。
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ライフのお役に立てれば幸いです。