Linuxブートプロセス


3

これは、私が最近Slashdotのコメントで尋ねた質問です。あまり返事がなかったので、もともと行っておくべき場所に持って行くことにしました。

BusyBoxのようなものを実行するために最低限必要な最小限で構成された、非常に高速なブートLinuxシステムを構築したいと思います。私は、起動時間を大事にする人の一人ではありません。主に学術的な観点から興味があり、これを使ってLinuxの仕組みについてもう少し学ぼうとしています。

私はこのトピックをグーグルで調べて、Linux From Scratchのようなものを見つけましたが、私が知る限り、これらはあなたが構築しているものに基づいた独自のソフトウェアを持っているようです。起動する必要があるのは、ファイルシステム、Linuxカーネル、initrd、そして実行したいものすべてに対応するユーザーランドソフトウェアだけだという印象を受けました。SATAドライバーをカーネルなどにコンパイルする場合、initrdは必要ないことを読んだことがあります。実際、別の目的はinitrdをまったく使用せずにブートすることであると言えますが、これを使用するのはちょっとした楽しみのためだけです。

Linuxを起動するために必要なものの最小限のリストを含むWebサイトはありますか?

linux 

回答:




1

HDドライバーでコンパイルする場合、initrdは必要ないのは事実です。

しかし、カーネルとinitrdだけを使用し、他のボリュームは使用しない、他の方法の方がより楽しいです。

私はbusyboxでこれを数回行いました。非常に小さいボックスであり、各ノードにストレージ用の4つのドライブがすべてあるストレージクラスター(当時はPATAなので、HDなしで4)以上接続するのは困難でした。カーネルとinitrdを提供するためにPXEサーバーをセットアップしました。

とても楽しくて有益です。



0

「... Linux to Boot」(これを明確にする必要があるかもしれません-Linuxはユーザーランドツールなしで「ブート」できます)

基本的なCLI:initramfsの/ binにash / dash / shをスローし、カーネルコマンドラインで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、および端末が必要でない限り、絶対に必要ではありません。静的な/ devツリー(BUILTIN initramfs を作成するために最小限の.configおよびファイルシステムtarballと共にリンクに含まれる)を使用する場合、/ devはdevtmpfsではなくdevとしてマウントされるようにフォールバックする必要があります。サポートしたいカーネルを削除します。まったく削除しないでください。ターミナルエミュレータをサポートするX環境を起動するには、.configが最低限必要でした。ループの代わりにきれいに終了する方が適切かもしれません-リソースの使用を最小限にしようとしていましたが、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);}})

参考までに、ファイル構造はRob Landleyのaboriginal linux(よりコマンドライン指向のミニマリズム)に基づいていましたが、Puppyの静的/ devおよび一部の自己適応型マルチコールバイナリとinitに適合していました。同様のディストリビューション(通常は「フロッピー」)はプロセスを正確に説明しておらず、重要な要素が欠落しています。
テクノサウルス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.