“... 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);}})