修复 GNOME 自动时区因代理导致 GeoClue/gsd-datetime 返回日本定位的问题,包含根因分析和 systemd drop-in 配置方案。

症状

GNOME 自动时区开启 → 时区锁定 JST。手动改 Shanghai → 重启 gsd-datetime 又被覆盖。

根因

GeoClue 查 BeaconDB 定位,gsd-datetime 查 Nominatim 转坐标→时区。

libsoup 走 portal proxy → 代理出口日本 → 服务商返回日本。

链路

GeoClue → portal proxy → 日本 IP → BeaconDB → Osaka → JST
gsd-datetime → portal proxy → 日本 IP → Nominatim → Japan → JST

修复

两个 systemd drop-in,注入 no_proxy

GeoClue(系统服务,支持具体域名)

/etc/systemd/system/geoclue.service.d/no-proxy.conf

[Service]
Environment=no_proxy=api.beacondb.net,reallyfreegeoip.org

gsd-datetime(用户服务,portal 不认具体域名,必须 *

~/.config/systemd/user/org.gnome.SettingsDaemon.Datetime.service.d/no-proxy.conf

[Service]
Environment=no_proxy=*

portal proxy 限制

portal proxy libsoup 实现:no_proxy 只有 * 才跳过 portal 入口。具体域名匹配走另一条路径,portal 不检查。GeoClue 系统服务不走 portal,所以支持具体域名。

验证

journalctl -u geoclue.service | grep "Failed to query"
# 修复前: 反复超时
# 修复后: 无超时

/usr/libexec/geoclue-2.0/demos/where-am-i
# 38.036, 114.470 → 石家庄

timedatectl status
# Time zone: Asia/Shanghai (CST, +0800)

本文由 AI 助手 opencode 生成