reboot 流程

本文深入剖析了Linux系统中reboot命令的工作流程,从应用层的systemd管理到内核层面的系统调用,详细解释了每个阶段的任务,包括服务停止、依赖处理、系统状态变更、硬件复位等步骤,最后探讨了不同重启命令的实现差异。

前言

        对于生在智能时代的我们,对关机和重启这两个概念肯定不会陌生,尤其经历早期Android智能机的人们,印象最深恐怕就是重启,当然现在不会了,还没有改过来的都被淘汰了。在Linux系统中我们使用reboot完成这个动作,下面以rk px30 linux4.4.194为例,分析这个过程。

应用层

        重启reboot基本上都是通过一条命令实现,之所以聊一下应用层,主要是新的系统中reboot shutdown halt 等,这些操作被systemd统一管理了,也就是说reboot,shutdown,halt等命令是指向systemctl的软链接,执行reboot相当于执行 systemctl reboot,systemctl reboot 会切换到 reboot.target.

 下面使用systemd进行系统关闭/重启的依赖关系图:

                                  (conflicts with  (conflicts with
                                    all system     all file system
                                     services)     mounts, swaps,
                                         |           cryptsetup
                                         |          devices, ...)
                                         |                |
                                         v                v
                                  shutdown.target    umount.target
                                         |                |
                                         \_______   ______/
                                                 \ /
                                                  v
                                         (various low-level
                                              services)
                                                  |
                                                  v
                                            final.target
                                                  |
            _____________________________________/ \_________________________________
           /                         |                        |                      \
           |                         |                        |                      |
           v                         v                        v                      v
systemd-reboot.service   systemd-poweroff.service   systemd-halt.service   systemd-kexec.service
           |                         |                        |                      |
           v                         v                        v                      v
    reboot.target             poweroff.target            halt.target           kexec.target
### OpenWRT 系统的重启流程 在 OpenWRT 中,`reboot` 命令用于重新启动系统。其具体实现涉及多个阶段和组件交互,以下是详细的描述: #### 1. **BusyBox 的 `init/halt.c` 文件** 当用户执行 `reboot` 命令时,实际调用的是 BusyBox 提供的功能[^1]。此功能位于 `init/halt.c` 文件中,负责处理关机和重启的核心逻辑。 - 如果未指定 `-f` 参数,则通过 init 进程完成关机操作。 - 参数选项解释如下: - `-w`: 仅记录当前用户的使用情况至 `/var/log/wtmp` 或类似的日志文件,不执行任何硬件级别的操作。 - `-n`: 不同步磁盘缓存(即跳过 `sync()` 函数),这可能导致数据丢失。 - `-f`: 强制重启而不经过正常的关闭路径。 #### 2. **Procd 处理机制** `reboot` 命令会触发 Procd 守护程序进入特定的状态序列[^2]。这一过程类似于系统的初始化 (`sysinit`) 流程,但入参设置为 `shutdown` 而不是 `start`。 - 首先,Procd 执行 `/etc/rc.d/K* shutdown` 脚本集合来停止服务和其他必要的清理工作。 - 接着,状态从 `STATE_SHUTDOWN` 切换到 `STATE_HALT`,标志着即将进行最终的硬件重置或断电动作。 #### 3. **Kernel 层面的行为** 一旦到达 `STATE_HALT`,控制权交还给 Linux 内核以完成最后的操作[^3]。内核内部定义了一个名为 `kernel_init` 的函数,在这里可以观察到具体的停机指令被传递到底层驱动器或者 BIOS/UEFI 固件接口处。 #### 4. **Hotplug Event 和网络环境调整** 值得注意的是,在某些情况下,如果存在动态 IP 地址分配或其他类型的联网变动事件发生之前可能已经激活了相应的 hotplug handler 来响应这些改变[^4]。尽管这部分主要关注于正常运行期间而非重启过程中发生的活动,但它仍然构成了整个生态系统的一部分值得提及一下。 #### 5. **Preinit 及后续引导链路恢复** 对于那些基于自定义镜像构建出来的设备而言,预初始(pre-init)阶段扮演重要角色因为它包含了加载根文件系统之前的准备工作[^5]。虽然严格来说这不是标准意义上的 rebootscope ,但在讨论完整的生命周期管理时还是有必要提一句。 ```bash exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd ``` 上述代码片段展示了如何切换到真正的 init 程序并继续常规开机步骤。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值