如果使用 INIT=/bin/sh 内核参数启动然后立即从 shell 退出,系统是否完全空闲?

如果使用 INIT=/bin/sh 内核参数启动然后立即从 shell 退出,系统是否完全空闲?

如果像这样启动怎么办:

通过GRUB命令行或类似方式将参数传递INIT=/bin/sh(or /bin/bash)给内核,然后启动;
一旦 shell 加载完毕,立即退出。然后电脑对按下的任何键都没有反应。

我很好奇地位此刻的系统。据我所知,这init是加载内核后将执行的第一个进程,并且其他进程都fork从中执行,似乎当/bin/sh按照上述方式执行而不是init使用正常的引导过程时,系统就不再有任何进程了。去做。

是不是像跑步一样闲着

while (1) {
    sleep(1);
}

或者还有什么?

感谢大家的建议。也许更多的信息有帮助,我曾经认为这是不必要的。

我最近在一台CentOS 7.2服务器上工作,有一个XFS磁盘分区不正常,在系统启动时花费了无尽的时间进行检查和恢复。我计划编辑/etc/fstab以关闭该分区的自动安装。由于正常的启动过程被卡住,我曾经init=/bin/bash使系统启动到bash。编辑后fstab,我exit不小心执行了shell,然后屏幕上对按下的任何键(包括 )都没有响应Ctrl-Alt-Del,并且没有任何信息提示内核恐慌(我无法判断CPU是否正在努力工作,因为那个房间很吵)。我认为这是闲着,无事可做。这个现象让我思考了我一开始写下的问题。

今晚我在我自己的装有 Debian 8 的笔记本电脑上做了一些测试。内核恐慌明显

答案1

我很惊讶。我的理解是终止PID 1导致内核恐慌。我可以告诉你那件事发生了什么。

恐慌行为是可配置的。使用默认选项,您将达到环形看起来和你说的一模一样。

使用的延迟函数是有记录的作为“忙等待”。这是不是预计会进入操作系统正常空闲时使用的省电 CPU 睡眠状态。

如果您查看恐慌打印的回溯,我想您会看到这一切都发生在sys_exit().我认为从技术上讲,PID 1 不会被破坏,它只是永远不会从系统调用中返回。首先停止任何其他 CPU。

(有一种东西叫做“启动空闲线程”。我没有看到它参与这个过程。 AFAICT 你永远看不到这个线程。如果您想将其理解为空闲线程,您还必须询问一旦其他 cpu 上线后,是什么为它们提供空闲线程)。

答案2

如果没有用户级进程运行,系统就无事可做,这是不正确的。系统有一堆内核线程,内核本身已经启动了。他们大部分时间都在睡觉,但会定期醒来执行任务。内核线程仅执行内核空间代码,即它们没有任何用户级内存映射。它们是独立的进程,因为它们是独立调度的并且具有唯一的进程 ID。

如果运行ps aux,您可以通过线程名称周围的方括号来识别内核线程。

答案3

系统没有任何进程在运行。因此,没有像您所写的那样的繁忙循环(CPU 利用率为 100%)。中断仍然可以由内核处理,但没有进程。 CPU 将处于空闲状态。

详细信息可以在此处找到kernel_init() 的来源,程序的执行方式与 类似execve()。这也意味着执行不会返回(请参阅 参考资料execve(3p))。

相关内容