为什么 Fuchsia 设备会重新启动

本文档列出了 Fuchsia 设备可能会重新启动的原因。有些方法不言自明,而有些则需要一些额外的背景信息。

概述:

术语

异常重新启动

非正常重新启动是指由内核为响应错误(如内核崩溃)而发起的重新启动,或由硬件在无软件干预(例如硬件监控计时器超时)的情况下执行的重新启动。

安全重新启动

安全重新启动是指由用户空间进程发起的重新启动。该进程可能会为了响应错误而启动重新启动(例如当设备温度过高时),但 Fuchsia 应该有机会有序关闭。

已列出重启原因

内核崩溃

如果内核无法从内部错误中恢复,该错误会被视为严重错误,系统将重新启动。

系统内存不足

如果内核检测到可用物理内存量低于阈值,则会重新启动。内核不会在重新启动之前终止进程以尝试回收内存,这意味着单个进程可能会导致系统级内存不足,并强制设备重新启动。

冷启动

如果设备在关机和重新启动之间的断电时间足够长,系统会将其确定为冷启动。

断电

当设备电压下降到可接受的阈值以下时,设备会变为棕色。只有在设备的电源或其电源相关硬件出现问题时,才会出现这种情况。

硬件监控计时器超时

Zircon 会设置一个硬件监控计时器,该计时器会在设备未在指定时间段内重置的情况下重新启动。

软件监控计时器超时

如果有人设置了软件监控计时器,那么软件监控计时器可能会重新启动设备。

短暂断电

如果设备在短时间内断电(例如,当用户拔下设备,然后快速重新插入电源时),可能无法确定重启是冷启动,并将重启视为短暂断电。请务必注意,无法量化什么内容是否依赖于硬件。

用户请求

由用户或代表用户的组件(例如 SL4F 或 RCS)确定有必要重新启动。

系统更新

负责系统更新的组件必须更新无法临时更新的一个或多个软件包。这些软件包从规范上称为基础软件包。

重试系统更新

负责系统更新的组件无法应用更新,因此设备会重新启动以重试(或者可能还原更新)。

ZBI 交换

交换 Zircon 启动映像后,设备会重新启动以应用更改。

最高温度

负责电源管理的组件检测到设备的温度过高,且系统无法通过限制 CPU 或降低音频音量来充分降低设备的温度。

会话失败

如果会话管理器无法重启崩溃的会话,或会话确定其已失败且无法恢复,则设备会重新启动。

严重组件故障

如果标记为 "on_terminate": "reboot" 的组件崩溃,设备会重新启动。

恢复出厂设置

在恢复出厂设置后,设备会重新启动。

根作业终止

如果用户空间 root 作业因某个关键进程崩溃而终止,设备会重新启动。

通用优雅

平台可以知道重新启动是否正常,但无法区分软件更新、用户请求或某个将设备检测到过热的更高级别组件。平台只知道重新启动会很正常。

未知

在某些情况下,平台无法确定具体的重新启动原因,也无法确定重新启动是正常还是不正常。

在哪里查看重新启动原因

Fuchsia 通过 FIDL 公开设备上次(重新启动)的原因,并在 Cobalt 和崩溃服务器上跟踪此原因。

罪魁祸首

因特定组件中的错误而导致的重新启动具有崩溃签名,该组件将该组件视为导致重新启动的原因。它们遵循将重新启动原因和被视为会导致重新启动的组件(也称为问题原因)相结合的一般模式。

重新启动的原因 FIDL Cobalt 事件 崩溃签名
内核崩溃 KERNEL_PANIC KernelPanic 负责崩溃的函数,与用户空间崩溃报告完全相同
系统内存不足 SYSTEM_OUT_OF_MEMORY SystemOutOfMemory fuchsia-oomfuchsia-oom-$CULPRIT
冷启动 COLD Cold 不适用*
断电 BROWNOUT Brownout fuchsia-brownout
硬件监控计时器超时 HARDWARE_WATCHDOG_TIMEOUT HardwareWatchdogTimeout fuchsia-hw-watchdog-timeout
软件监控计时器超时 SOFTWARE_WATCHDOG_TIMEOUT SoftwareWatchdogTimeout fuchsia-sw-watchdog-timeout
短暂断电 BRIEF POWER LOSS BriefPowerLoss fuchsia-brief-power-loss
用户请求 USER_REQUEST UserRequest 不适用*
系统更新 SYSTEM_UPDATE SystemUpdate 不适用*
重试系统更新 RETRY_SYSTEM_UPDATE RetrySystemUpdate fuchsia-retry-system-update
ZBI 交换 ZBI_SWAP ZbiSwap 不适用*
最高温度 HIGH_TEMPERATURE HighTemperature fuchsia-reboot-high-temperature
会话失败 SESSION_FAILURE SessionFailure fuchsia-session-failure
严重组件故障 CRITICAL_COMPONENT_FAILURE CriticalComponentFailure fuchsia-critical-component-failurefuchsia-reboot-$CULPRIT-terminated
恢复出厂设置 FACTORY_DATA_RESET FactoryDataReset 不适用*
根作业终止 `ROOT_JOB_TERMINATION RootJobTermination fuchsia-root-job-terminationfuchsia-reboot-$CULPRIT-terminated
通用优雅 graceful 字段设置为 true GenericGraceful fuchsia-undetermined-userspace-reboot
未知 未设置 graceful 字段 Unknown fuchsia-reboot-log-not-parseable

* 并非崩溃。\