WSL環境でスリープ復帰時に時刻がずれる問題を Windows 側から修正する
久しぶりに WSL2 環境で開発をしていると時刻がずれていることに気づく。以前は起こっていなかった、スリープ復帰時に WSL 側の時計がずれる問題が発生してしまうようになってしまったようだ。
古くからある問題で、昨日の Insider Preview のLinuxカーネルで修正済みなのでWindows 10 21H1 では直りそうだけど、現状問題が起きたままだ。
Linux 側で hwclock --hctosys
で直るのだけど、いちいちコマンドを叩くのが面倒だし、WSL2 側での定期実行、たとえば cron.d を動かすのはいがいと厄介。なので、Windows 側で wsl 側を叩く以下のようなバッチファイルを用意して、それを Windows のタスクスケジューラで実行する。
wsl.exe -u root --exec /usr/sbin/hwclock --hctosys
スリープ復帰時にコマンド実行するタスクスケジューラはググるといくつか出てくるので割愛する。これで問題なくなった。と、ここまで書いた所で、ちょうどissues のコメントに同様のことを一行でやる方法が。
schtasks /Create /TN wsl-clock /TR "wsl.exe -u root sh -c hwclock -s" /SC ONEVENT /EC System /MO "*[System[Provider[@Name='Microsoft-Windows-Kernel-Power'] and (EventID=107 or EventID=507)]]" /F
なるほど、schtasks でタスクスケジューラに登録できるのね。というわけで、このコマンドで簡単にスリープ復帰の時刻ズレ問題を修正できるのであった。