登录 Tailscale 后,托盘图标一直停在 Starting

它像一位不断重复“马上开门”的前台,但门后其实没人能把保险柜打开。最开始我以为是网络、登录回调或者虚拟网卡出了问题,最后才发现:真正卡住的是 Tailscale 的本地状态文件,以及一把已经不被 TPM 承认的旧钥匙。

先看服务,不急着重装

先用 PowerShell 检查服务和进程:

Get-Service -Name Tailscale
Get-Process | Where-Object { $_.ProcessName -like '*tailscale*' }

当时服务状态是 Running,桌面前端也在运行。进程列表里还能看到两个 tailscaled.exe,乍看很像后台重复启动了。

进一步检查后确认,其中一个是 Windows 服务进程,另一个带有 /subproc 参数,是它正常拉起的子进程,并不是两个后台在抢方向盘。

再看网络配置,Tailscale 虚拟网卡已经存在。这说明安装和驱动至少不是完全失灵,问题更像是桌面前端与后台状态不同步。

普通终端只看见了“拒绝访问”

执行:

tailscale status
tailscale version

版本可以正常显示,但查询状态时提示无法访问本地 tailscaled。这是一个容易带偏方向的现象:普通权限终端可能没有权限访问后台服务使用的本地管道,它并不等于服务本身已经崩溃。

于是改用管理员 PowerShell 检查,并重启了一次服务:

Restart-Service -Name Tailscale
Start-Sleep -Seconds 3
tailscale status

这一次,后台终于不再只说“Starting”,而是把真正的问题交代了出来:

State store failed to initialize
failed to unseal state file
failed to unseal encryption key with TPM
TPM_RC_INTEGRITY: integrity check failed
unexpected state: NoState

原来是 TPM “不认旧钥匙”了

Tailscale 的设备状态保存在本地,某些版本会借助 TPM 封存加密密钥。如果升级 BIOS、更换主板或 TPM、迁移系统盘,或者虚拟机恢复过快照,TPM 的内部状态可能发生变化。

状态文件还在,钥匙看起来也还在,但 TPM 会冷着脸说:“这把钥匙不是我发的。”于是 Tailscale 无法解密原来的设备身份,后台进入 NoState,桌面前端只能一直卡在 Starting。

Windows:备份状态文件后重新登录

直接卸载重装未必有用,因为损坏的状态文件可能仍留在 ProgramData。相比整目录删除,更稳妥的办法是先把状态文件改名备份。

在管理员 PowerShell 中执行:

Stop-Process -Name 'tailscale-ipn' -Force -ErrorAction SilentlyContinue
Stop-Service -Name Tailscale -Force

Rename-Item `
  -LiteralPath 'C:\ProgramData\Tailscale\server-state.conf' `
  -NewName 'server-state.conf.tpm-broken.bak'

Start-Service -Name Tailscale
Start-Process 'C:\Program Files\Tailscale\tailscale-ipn.exe'

然后检查:

tailscale status

如果输出变成:

Logged out.

说明后台已经从“打不开旧保险柜”恢复成了一个干净、可初始化的状态。此时从托盘图标重新登录即可。

需要注意:这样会生成新的 Tailscale 设备身份。确认新设备连接正常后,可以到 Tailscale 管理后台删除旧的离线设备。备份文件包含设备状态信息,应妥善保管;确认不再需要恢复时再删除。

Linux:同样先备份,不要一上来就删

Linux 上遇到相同的 TPM 解封错误,也可以先停止服务并备份状态目录:

sudo systemctl stop tailscaled
sudo mv /var/lib/tailscale /var/lib/tailscale.tpm-broken.bak
sudo systemctl start tailscaled

随后重新登录:

sudo tailscale up

确认运行正常后,再决定是否清理备份目录。

最后复盘

这次故障最迷惑的地方,是三个表象同时存在:服务显示 Running、虚拟网卡已经创建、桌面端却一直 Starting。

真正有效的排查顺序是:

  1. 确认 Windows 服务和前端进程是否存在;
  2. 区分正常子进程与异常重复进程;
  3. 用管理员终端执行 tailscale status,绕过本地管道权限干扰;
  4. 根据 health check 找到 TPM_RC_INTEGRITY
  5. 备份无法解密的状态文件,让 Tailscale 重新生成设备身份。

所以,下次再看到 Tailscale 一直说“正在启动”,不妨去后台问一句:到底是网络没通,还是 TPM 突然失忆了?