我对 Linux 很感兴趣并且已经研究了一段时间了。我刚刚学会了从源代码编译 Linux 内核并使用 Grub 启动它,这会给你带来内核的 shell。
现在,一旦内核加载到内存中,它就会搜索来init
加载它。我的议程是启动一个 shell(普通用户可以使用 - 就像bash
)。
那么,如何才能将其带入呢?
我是否需要配置 init 来加载 bash shell 或者我可以做些什么?
我正在构建自己的发行版,我只需要发行版有一个 shell (bash),别无其他。
答案1
唔。这实现起来应该不复杂,但也非常复杂:)
你可以简单地按照亚历山大的建议去做(init=/bin/bash
),你会做得很好。
init进程是内核调用的,它启动全部您的用户空间。包括登录终端。如果你的 init 只是生成 bash 终端,那就没问题。但如果该终端崩溃或退出,init 应该进行清理。如果您从终端启动的某些进程死亡,则需要进行清理。如果他们死了,那么他们的孩子们需要一个新的父进程,它将是你的 init。
我强烈建议您花 10 分钟阅读本文,它非常友好地概述了以下内容init
:
http://tilde.town/~elly/userland.txt
然后您将更深入地了解运行您自己的 init 需要什么。
该链接的相关部分说:
我们只需要做一件事:提供一个初始二进制文件以在以下任意路径启动:/sbin/init、/etc/init、/bin/init 或 /bin/sh。该进程 (init) 以 pid 1 运行。
init进程需要做两件事:
永不退出(如果 init 退出,内核会发生恐慌)
收获僵尸进程
文本的其余部分将实现一个简单的 init。
答案2
“终端”(物理计算机)和“bash”(外壳)完全不同。我不完全确定你在问什么,但你可以添加init=/bin/bash
到内核命令行以便直接启动到 bash。
答案3
bash
不是终端,是外壳。
init
一旦启动过程完成并且机器在纯文本运行级别(因此没有 X Windows)下运行,该过程将最终getty
调用login
.这是负责显示登录提示并允许用户登录的进程。这是所有 Linux 发行版中都会发生的情况。
您想要做的只是定义bash
为用户的默认登录 shell(假设您想要一个多用户环境)。