WSL2 Ubuntu 時間は、locatime を計算するために間違った TZ を使用していますか?

WSL2 Ubuntu 時間は、locatime を計算するために間違った TZ を使用していますか?

私は Windows 10 で Ubuntu 18.04 WSL2 マシンを実行していますが、時々、WSL2 マシンの時間が同期されないという奇妙な問題が発生します。私のタイムゾーンは東部標準時 (-5) ですが、以下に示すように、WSL は 5 時間未来になっています。何らかの理由で、私の WSL マシンはローカル時間を UTC として解釈し、その情報に基づいて計算を行っているようです。

WSL2

$ date 
Fri Jan 22 03:13:28 EST 2021
$ cat /etc/timezone
America/Toronto
$ date +"%Z %z"
EST -0500

パワーシェル

> date
Thursday, January 21, 2021 10:13:31 PM
> Get-TimeZone


Id                         : Eastern Standard Time
DisplayName                : (UTC-05:00) Est (É.-U. et Canada)
StandardName               : Est
DaylightName               : Est (heure d’été)
BaseUtcOffset              : -05:00:00
SupportsDaylightSavingTime : True

試してみましたsudo dpkg-reconfigure tzdataが、効果はありませんでした。

編集: スクリーンショットを追加します。時間は前に述べた時間とは一致しませんが、スクリーンショットには正しい現地時間とタイムゾーンが表示されます。

ここに画像の説明を入力してください

答え1

私は Windows 10 で Ubuntu 18.04 WSL2 マシンを実行していますが、時々、WSL2 マシンの時間が同期されないという奇妙な問題が発生します。私のタイムゾーンは東部標準時 (-5) ですが、以下に示すように、WSL は 5 時間未来になっています。何らかの理由で、私の WSL マシンはローカル時間を UTC として解釈し、その情報に基づいて計算を行っているようです。

これは WSL2 の既知の問題です:システムの日付が Windows と一致しません (WSL 2) #4245

WSL2 インスタンス内で次のコマンドを実行する必要があります。

sudo hwclock -s

代わりに次の PowerShell コマンドを実行することもできます。

wsl -u root sh -C "hwclock -S"

次の PowerShell コマンドも実行する必要があります。

wsl --shutdown

このコマンドを実行した後、WSL インスタンスを再起動する必要があります。

このソリューションでは、以下のオプションをコメントアウトした状態でChronyを使用する必要があります。/etc/chrony/chrony.conf

# Stop bad estimates upsetting machine clock.
# maxupdateskew 100.0

まだ使用していない場合:

sudo apt-get update && sudo apt-get install -y chrony && sudo chronyd

別の解決策としては、.bashrc に以下を追加します。

# WSL2 clock skew hack
__customprompt() {
  NOW=$(date +%s)
  if (( NOW > WSL_NEXT_CLOCKSYNC )); then
    echo "$(date -Iseconds) - hwclock [$WSL_NEXT_CLOCKSYNC : $NOW]" >> ~/.wsltimesync
    nohup wsl.exe -u root -c 'hwclock -s' &>/dev/null &
    export WSL_NEXT_CLOCKSYNC=$(date --date='+5 minutes' +%s)
  fi
}

ソース:

別の代替ソリューションとしては、ログに記録された特定のイベントの検出に基づいて、Windows 内で自動的に処理する方法があります。

これは次の PowerShell スクリプトで処理できます。

function Log($message) {
    $output = (Get-Date).ToUniversalTime().ToString("u") + "`t$message"
    Add-Content -Path "~/.wsl-clock.log" -Value $output
}

Log "********************************"
Log "*** Update WSL clock starting..."

$runningDistroCount = wsl --list --running --quiet |
        Where-Object {$_ -ne ""} |
        Measure-Object |
        Select-Object -ExpandProperty Count

if ($runningDistroCount -eq 0){
    Log "No Distros - quitting"
    exit 0
}

$originalDate=wsl sh -c "date -Iseconds"

Log "Performing reset..."
$result = wsl -u root sh -c "hwclock -s" 2>&1
$success = $?
if (-not $success){
    Log "reset failed:"
    Log $result
    exit 2
} else {
    $newDate=wsl bash -c "date -Iseconds"
    Log "clock reset"
    Log "OriginalDate:$originalDate"
    Log "NewDate:     $newDate"
    exit 0
}

ソース:WSL 2 でクロック スキューを修正する

使用することもできますwsl-クロック

追加リソース:

答え2

次のコマンドを発行しました:

sudo hwclock -s

私の場合はうまくいきました。このコマンドは説明どおりに問題を解決しましたここ

私が使用していた環境は次のとおりです。

  • オペレーティング システム: Windows 10
  • Ubuntu 22.04.2 LTS を実行する WSL

関連情報