ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL 时间同步修复实战:从休眠时钟回拨到时区配置生效

WSL 时间同步修复实战:从休眠时钟回拨到时区配置生效 WSL 时间同步修复实战从休眠时钟回拨到时区配置生效【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL给同事推代码前git log里你的提交时间戳比宿主机早了 47 分钟——笔记本睡眠了一整晚WSL 时间同步还停在睡前。WSL 的时钟由虚拟机内核自己走而时区靠 init 进程里的 src/linux/init/timezone.cpp 从 Windows 侧拉取两条线一脱节时间戳就会各说各话。速查卡30 秒先修好WSL 内跑date宿主 PowerShell 跑Get-Date先看差多少一次性校时钟sudo sntp -sS 0.asia.pool.ntp.org持久校时钟systemd 发行版timedatectl set-ntp true确认时区开关grep -A1 ^\[time\] /etc/wsl.conf没写就是默认启用改过/etc/wsl.conf必须wsl --shutdown再重开分发版否则不生效原理速览时区同步如何生效因果链一句话宿主侧wslservice.exe读取 Windows 系统时区用 ICU 把 Windows 区域名映射成 IANA 标识如Asia/Shanghai在分发版启动时发给 guest 内的 initinit 收到后重建/etc/localtime软链、写入/etc/timezone。注意这条链路只管时区时钟一秒都不碰它跟随虚拟机内核走。涉及的两处源码各一句话src/windows/common/helpers.cpp 负责宿主侧的 Windows 时区到 IANA 映射src/linux/init/timezone.cpp 是 guest 侧真正落盘/etc/localtime和/etc/timezone的文件。分场景实操时钟偏移与时区错配的排查场景一休眠恢复后时钟回拨现象合盖睡眠或休眠数小时后WSL 里date比宿主慢同样的时长WSL1 直接共享宿主时钟不会这样只有 WSL2 中招。先确认偏差幅度在 WSL 内执行date timedatectl 2/dev/null || true执行后你应看到当前系统时间如果timedatectl输出里NTP synchronized: no说明没有任何服务在管时钟偏差不会自己恢复。这里第一次跑校时命令大概率报sntp: command not found那是没装客户端先装再校sudo apt-get install -y sntp sudo sntp -sS 0.asia.pool.ntp.org执行成功时无任何输出退出码为 0再跑date与宿主Get-Date对比差值应在 1 秒以内。场景二改了 Windows 时区WSL 时区不生效现象Windows 区域设置里从上海切到东京WSL 的date偏移量还是旧的。先看当前落盘状态执行ls -l /etc/localtime cat /etc/timezone执行后你应看到软链指向/usr/share/zoneinfo/下的某个区域名如果还指向旧区域说明同步没发生或开关被关了。检查/etc/wsl.conf这里容易踩坑正确的写法是[time]段下的useWindowsTimezone源码中该 key 定义见 src/linux/init/WslDistributionConfig.h把它加到文件末尾[time] useWindowsTimezone true然后回到 PowerShell 执行wsl --shutdown再重新打开 WSL图形的话也可以从 WSL 设置应用里的分发版管理页重启。重进 WSL 后cat /etc/timezone应显示新的 IANA 名date的时区偏移与 Windows 一致。场景三精简发行版里同步被静默跳过现象开关确认是开的但/etc/localtime常年指向 UTC怎么重启都不变。init 重建软链前会先检查目标文件是否存在先验证 tzdata 是否在位ls /usr/share/zoneinfo/Asia/Shanghai 2/dev/null || echo tzdata missing输出tzdata missing就命中了此时 init 只记一条 Is the tzdata package installed? 的警告就跳过不会给你任何弹窗。装上 tzdata 再重启分发版# Debian/Ubuntu sudo apt-get install -y tzdata # Alpine 用这条 # sudo apk add tzdata执行后重进 WSLls -l /etc/localtime应指向/usr/share/zoneinfo/下的区域文件date显示正确偏移。横向对照三种校时手段怎么选手段解决什么持久性副作用适用场景sntp手动校时时钟漂移一次性重启失效需能连外网应急修复timedatectl set-ntp true时钟漂移每次开机自动依赖 systemd常驻开发机内置时区同步useWindowsTimezone时区不一致每次启动生效不改系统时钟宿主换时区后选型建议时钟和时区是两条独立问题线——用 timesyncd 管住时钟靠内置同步管住时区显示手动sntp只留给应急。边界与反直觉点文档没写的坑拼错的配置项会被静默忽略init 解析/etc/wsl.conf时带CFG_SKIP_UNKNOWN_VALUES标志见 src/linux/init/WslDistributionConfig.cppkey 写错不报错、不警告功能按默认值继续跑你会误以为已经禁用了其实根本没生效。规避改完配置用重启后date是否变化来验证别只盯文件内容。时区同步从头到尾不碰时钟UpdateTimezone只做三件事——检查 zoneinfo 文件、重建/etc/localtime软链、写/etc/timezone系统时间一个字节都不会被修改。规避时区显示正确但时间仍偏直接走场景一校时钟别在时区配置上耗时间。安全模式下时区同步被强制关掉WSL2 安全模式LX_WSL2_SAFE_MODE1会无条件禁用AutoUpdateTimezone同样见 src/linux/init/WslDistributionConfig.cpp 末尾的安全模式覆盖段。规避排障时若是在安全模式里启动的分发版先退出安全模式再下结论。把这次的对照基线记一下宿主Get-Date与 WSLdate的差值外加wsl --version里的 Kernel 和 WSL 版本号。下次升级后只要这两个字段变了就重跑一遍场景一的对比命令确认 WSL 时间同步行为没有回归。【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表