Linux 启动过程

Linux 启动过程

这是我最近在 Slashdot 的评论中提出的一个问题。我并没有得到太多的回应,所以我决定把它带到我最初应该去的地方。

我想组装一个启动速度非常快的 Linux 系统,它只包含运行 BusyBox 之类的程序所需的最低限度的组件。我不是那种对启动时间很在意的人,我主要从学术角度感兴趣,并尝试使用它来进一步了解 Linux 的工作原理。

我已经搜索了此主题,并从头开始找到了诸如Linux,但我可以在其中构建的任何软件,您需要启动的所有内容,即启动文件系统,initrd,in Initrd,and the Userland软件,然后再读过我想要的事实。我只打算在我的计算机上使用它,以获得一些乐趣。

是否有任何网站包含启动 Linux 所需的最少物品清单?

答案1

发行观察站点上有很多 Linux 发行版参考资料。
您似乎对轻量级(加载内容较少)安装感兴趣
DamnSmallLinux版本可能是一个选择。
不过,我建议你查找发行版

答案2

有关一般计算机启动过程的更多信息,尤其是Linux的启动过程,请查看Gustavo Duartes-的这些帖子 -

计算机如何启动内核启动过程

虽然有点过时,但你也可以拿一份“理解 Linux 内核”为了让更多的内在架构内部瞥见,包括启动过程。

答案3

确实,如果您编译 HD 驱动程序,则不需要 initrd。

但另一种方式更有趣,只使用内核和 initrd,不使用其他卷。

我用 busybox 做过几次这样的事,要么是因为它是一个非常小的盒子而且我希望它不需要 HD,要么是因为它是一个存储集群,其中每个节点都有 4 个驱动器全部用于存储(当时是 PATA,因此很难连接超过 4 个),我设置了一个 PXE 服务器来提供内核和 initrd。

它非常有趣并且很有教育意义。

答案4

“ ... linux to Boot”(您可能需要澄清一下 - Linux可以在没有Userland工具的情况下“启动”)

基本 CLI:将 ash/dash/sh 放入 initramfs 中的 /bin 中,并在内核命令行上设置 init=/bin/sh

从我的实验来看,简单的 init.c 可以进入桌面:http://murga-linux.com/puppy/viewtopic.php?p=590822#590822

#include <unistd.h>
#include <sys/mount.h>
#include <stdlib.h>

//these could be functions but gcc complains less this way 
#define EGGSACK(a)  ({if((fork())==0) execvp(a[0],a);})

int main(int argc, char** argv) {
static char **X={ "Xvesa", "-screen", "800x600x16", "-nolisten", "tcp", "-tst", NULL }
EGGSACK(X);

mount("/proc", "/proc", "proc", MS_MGC_VAL, NULL);
mount("/sys", "/sys", "sys", MS_MGC_VAL, NULL);
mount("/dev", "/dev", "devtmpfs", MS_MGC_VAL, NULL);
mount( "/dev/pts", "/dev/pts", "devpts", MS_MGC_VAL, NULL ); 
putenv("PATH=/bin");
putenv("HOME=/");
putenv("TERM=rxvt");
putenv("PS1=# ");
putenv("SHELL=/bin/sh");
putenv("DISPLAY=:0");

static char **jwm={ "jwm", "-display", ":0", NULL }
EGGSACK(jwm);

while(1) sleep(1); /*keep init alive*/
}

注意:除非你分别需要 mdev、top/ps 和终端,否则 /sys /proc 和 /devpts 不是绝对必要的。如果你计划使用静态 /dev 树(包含在链接中,以及最小的 .config 和文件系统 tarball 以使我们的内置initramfs ) 您通常只需要向内核添加您想要支持的内容,而不需要删除太多内容 - 该 .config 是引导到具有终端仿真器支持的 X 环境的最低要求。干净退出可能比循环退出更合适 - 我试图尽量减少资源使用,但 fork exec 等待 jwm(或您最喜欢的 wm),然后 execvp “sh” 就足够了。

/*here is a macro for a fork exec wait */
#define EGGSACKWEIGHT(a) ({int s,p;if((p=fork())==0){execvp(a[0],a);}else{while(wait(&s)!= p);}})

相关内容