为什么 Fuchsia 设备会重新启动

本文档列出了 Fuchsia 设备可能重启的原因。有些一目了然,有些则需要一些额外的背景信息。

大纲:

术语

非正常重启

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

安全重启

正常重新启动是指由用户空间进程发起的重新启动。该进程可能会因错误而启动重启,例如当设备温度过高时,但 Fuchsia 应该有机会进行有序关机。

列出的重启原因

内核崩溃

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

系统内存不足

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

冷启动

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

Brownout

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

硬件监控定时器超时

Zircon 会设置一个硬件看门狗计时器,如果该计时器未在指定时间内重置,则会重新启动设备。

软件监控计时器超时

如果有人设置了软件看门狗计时器,该计时器可能会重启设备。

短暂断电

如果设备在短时间内断电(例如用户拔下设备电源线并快速重新插上),设备可能无法确定重启是冷重启,而会认为重启是短暂断电所致。请务必注意,简短没有量化衡量标准,并且取决于硬件。

关机期间自发重启

安全关停已启动,并且设备在 Zircon 能够将其停止之前(例如,在驱动程序被拆除时)重新启动。

用户硬重置

用户按住电源按钮将其硬重置。

用户请求

设备的最终用户明确请求重启设备。

开发者请求

开发者启动了重新启动,通常是通过 shell 命令或类似接口(包括在自动化测试中)。

系统更新

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

重试系统更新

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

ZBI 交换

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

最高温度

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

会话失败

如果会话管理器无法重启崩溃的会话,或者会话确定其已发生不可恢复的故障,设备会重启。

关键组件故障

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

严重驱动程序故障

如果关键驱动程序崩溃,设备会重新启动。

恢复出厂设置

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

根作业终止

如果用户空间根作业终止(例如,由于其某个关键进程崩溃),设备会重新启动。

通用优雅

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

未知

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

在哪里可以找到重启原因

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

原因

由特定组件中的错误导致的重启具有崩溃签名,这些签名会将该组件归因为重启的原因。它们遵循一个通用模式,即结合重启原因和被视为导致重启的组件(即罪魁祸首)。

重新启动的原因 FIDL Cobalt 事件 崩溃签名
内核崩溃 KERNEL_PANIC KernelPanic 导致崩溃的函数,与用户空间崩溃报告完全相同
系统内存不足 SYSTEM_OUT_OF_MEMORY SystemOutOfMemory fuchsia-oom 或 fuchsia-oom-$CULPRIT
冷启动 COLD Cold 不适用*
Brownout 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
关机期间自发重启 SPONTANEOUS_REBOOT_DURING_SHUTDOWN SpontaneousRebootDuringShutdown fuchsia-brief-power-loss-during-shutdown**
用户硬重置 USER_HARD_RESET UserHardReset fuchsia-hard-reset-user-requested
用户请求 USER_REQUEST UserRequest 不适用*
开发者请求 DEVELOPER_REQUEST DeveloperRequest 不适用*
系统更新 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-failure 或 fuchsia-reboot-$CULPRIT-terminated
严重驱动程序故障 CRITICAL_DRIVER_FAILURE CriticalDriverFailure fuchsia-critical-driver-failure
恢复出厂设置 FACTORY_DATA_RESET FactoryDataReset 不适用*
根作业终止 ROOT_JOB_TERMINATION RootJobTermination fuchsia-root-job-termination 或 fuchsia-reboot-$CULPRIT-terminated
通用优雅 graceful 字段设置为 true GenericGraceful fuchsia-undetermined-userspace-reboot
未知 未设置 graceful 字段 Unknown fuchsia-reboot-log-not-parseable

* 不是车祸。\

** 前缀取决于产品如何解读自发重启,例如,在将自发重启解读为硬重置的产品上,前缀为 fuchsia-hard-reset-during-shutdown。