本文档列出了 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。