Linux启动过程


3

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

我想组建一个非常快速启动的Linux系统,它只需要能够运行像BusyBox这样的东西。我不是那些在开机时间内做出重大贡献的人之一,我主要对学术观点感兴趣,并且正在利用它来尝试更多地了解Linux的工作原理。

我已经搜索了这个主题并找到了像Linux From Scratch这样的东西,但据我所知,这些似乎有自己的软件,你可以根据自己的建设。我的印象是你需要启动的只是一个文件系统,Linux内核,一个initrd,然后是userland软件,无论你想运行什么。我已经读过如果你将SATA驱动程序编译到内核中,甚至可能还有其他一些东西,甚至都不需要initrd。事实上,我会说另一个目标是在不使用initrd的情况下启动,我只打算在我的计算机上使用它来获得一些乐趣。

是否有任何网站包含启动Linux所需的最少列表?

linux 

Answers:




1

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

但另一方面它更有趣,只使用内核和initrd,没有其他卷。

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

这很有趣,也很有启发性。


1

你可能想看一下嵌入式linux。 本文 在linuxdevices和后续文章是一个很好的介绍。


0

“... Linux to Boot”(您可能需要澄清一下 - Linux可以“启动”而根本没有用户工具)

基本CLI: 在initramfs中抛出ash / dash / sh in / 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*/
}

注意:/ sys / proc和/ devpts不是绝对必要的,除非你分别需要mdev,top / ps和一个终端。如果您计划使用静态/开发树(包含在链接以及最小的.config和文件系统tarball中),/ dev应该回退到以dev而不是devtmpfs的形式挂载 BUILTIN 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);}})

仅供参考.FYI文件结构基于Rob Landley的原始linux(更多命令行导向的极简主义),但适用于Puppy的静态/ dev和一些自适应的multicall二进制文件和init。类似的发行版(通常是“软盘”)并不能完全解释这个过程,而是缺少关键元素。
technosaurus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.