Bootdiskette mit initrd

Message
Author
bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Bootdiskette mit initrd

#1 Post by bakunin »

Hi!

Ich möchte eine Bootdiskette erstellen, also ein minimales System. Nach längerer Suche und intensiver Überlegung bin ich leider zum Ergebnis gekommen, dass es für mich hier wenig Sinn macht, eine vorhandene Mini-Distribution als Basis zu verwenden, so gerne ich das auch gemacht hätte. Also muss ich mich selbst mit einigen Sachen rumschlagen, z.B. möchte (genauer: muss) ich initrd verwenden, aber dabei soll der Kernel nicht auf dem initrd-Dateisystem liegen, da er dann ja nochmal im RAM liegen würde und in diesem Fall eine solche Verschwendung nicht praktikabel ist.

Ich will also praktisch wissen, wie ich vorgehen muss, um eine bootbare Diskette zu erzeugen, bei der der Kernel außerhalb des Dateisystems auf der Diskette liegt. Wie sieht eine LILO-Konfiguration dafür aus? Ich würde es auf jeden fall vorziehen, Kernel 2.2 zu benutzen, da ich das ganze relativ bald benötige.

Cheers,
GNU/Wolfgang

PS: Falls jemand nicht mit initrd vertraut ist und jetzt nicht /usr/src/linux/Documentation/initrd.txt lesen will: Ein initrd-fähiger Kernel lädt zunächst ein Dateisystem als / in eine RAM-Disk und führt /linuxrc aus. Wenn das beendet ist, wird das Dateisystem nach /initrd verschoben und das echte root-Dateisystem an / gemountet und wie üblich init gestartet. Nur ich weiß nicht so recht, wie ich den kernel und das dateisystem auf einer Diskette so unterbringen kann, dass nicht noch Platz in der RAM-Disk für den Kernel draufgeht. Falls das möglich ist.

Anonymous

Re: Bootdiskette mit initrd

#2 Post by Anonymous »

Ich verstehe dein Problem ...
Ich weiss nicht wie man das mit Lilo machen kann, aber es gibt eine alternative, die funktionniert:
Mit dd den Kernel auf die Diskette dumpen. Das bootet schon mal. Der Kernel muss nun sein rootfs finden. Dazu muss auf der Diskette, GENAU hinter dem Kernel, eine Art Flag gesetzt werden. Je nach Wert dieses Flags wird der Kernel nun eine zweite Diskette verlangen ( das prompt das du sicherlich schon mal gesehen hast ) oder aber das rootfs ( hier initrd ) kann sich auch dann gleich hinter dem Flag befinden.
( das rootfs auch mit dd gleich hinter den Kernel/Flag auf die Diskette dumpen:
|---Kernel---<img src="http://www.pl-forum.de/UltraBoard/Images/TooHappy.gif" border="0" align="middle">-Flag---<img src="http://www.pl-forum.de/UltraBoard/Images/TooHappy.gif" border="0" align="middle">-rootfs---| )

Mit dem 2.0'er Kernel schaffte ich es einmal einen Kernel und ein extrem minimalisiertes rootfs auf eine 1,77 MB formatierte Diskette zu kriegen.
Das Flag setzt du mit rdev. Infos findest du in /usr/src/linux/Documentation/rmdisk.txt
Die Syntax weiss ich nicht mehr, auf jedenfall war es anfangs knifflig. Wenn ich mich recht entsinne muss man ausrechen auf welchem Block sich das rootfs auf der Diskette befindet.

viel glueck

Anonymous

Re: Bootdiskette mit initrd

#3 Post by Anonymous »

ehm ... die smilies sollten da eigentlich nicht sein. Sollte ein Schema sein wie die Daten auf der Diskette liegen ...

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Bootdiskette mit initrd

#4 Post by bakunin »

Hi!

Super! Danke für den Tip. Das ist im Prinzip genau das, was ich gesucht habe. Mal sehen, ob man einen minimalen 2.2-Kernel auch mit einem Minisystem auf eine Diskette kriegt. Ich denke, dass das geht, weil ich in der initrd nur die Sachen brauche, mit denen man eine weitere Ramdisk erstellen und Daten von einer zweiten Diskette darauf kopieren kann, auf der dann der Rest ist. Würde ich diesen Trick nicht anwenden, bräuchte ich wohl 3 Disketten, was mir zu viel ist.

Cheers,
GNU/Wolfgang

Anonymous

Re: Bootdiskette mit initrd

#5 Post by Anonymous »

Ja, so ein problem hatte ich auch. Die Disketten war einfach zu klein.
Beim 1,77 MB device bekam mein FloppyLaufwerk Schluckauf.
Ich machte mir damals allerdings doch eine 3. Diskette.
Mein Kernel war damals extrem klein. ca. 300 KB wenn ich mich recht erinnere ( bzImage ).
Welche Shell ich benutzte weiss ich nicht mehr, aber es war die kleinste ksh-kompatible die es gibt.

Wenn deine Hardware es nicht unbedingt verlangt empfehle ich den 2.0'er Kernel der auf jedenfall noch kleiner ist als der 2.2'er

Anonymous

Re: Bootdiskette mit initrd

#6 Post by Anonymous »

Hab mir deine Antwort noch mal durchgelesen:
Wenn dein rootfs zu gross ist um zusammen mit dem Kernel auf eine Diskette zu passen, kannst du das 'Flag' entsprechend einstellen dass der Kernel EXPLIZIT nach einer Diskette fragt wo er dann sein rootfs erwartet. Ist sehr liberal <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Eine Sache noch: Das System bootet allerdings bei diesem Verfahren /sbin/init mit der /etc/inittab.
/linuxrc a la initrd wird nicht benoetigt.

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Bootdiskette mit initrd

#7 Post by bakunin »

Hi!

Einen Kernel von 400 kB auf eine Diskette tun und den Rest ungenutzt lassen, das tut in der Seele weh. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> Ich denke, dass ich es lieber mit zwei RAM-Disks mache und initrd verwende. Dadurch habe ich fast zwei Disketten Platz.

Ich werde die ash (eine Portierung der NetBSD-sh) verwenden bzw. die Version davon, die in busybox eingebaut ist. In busybox ist das meiste von dem eingebaut, was ich brauche. Wenn ich nichts Wesentliches übersehen habe, kriege ich auf die erste Diskette locker alles, was ich dort brauche.

Ich möchte den 2.2er-Kernel verwenden, weil ich mit diesem einfach mehr Erfahrung habe und ich nicht so arg viel Zeit für das ganze habe. Auch der 2.2er scheint aber klein genug zu sein, wenn man nichts überflüssiges aktiviert.

Was mich interressieren würde: Hattest du damals busybox benutzt? Wofür ging denn dein ganzer Platz drauf? Mit Busybox hat man alle möglichen Programme von init und sed über mount und vi bis find, ifconfig und gzip in 120 kB. Die glibc ist knapp 900 kB. Wenn man das alles packt reicht der Platz doch aus.

Cheers,
GNU/Wolfgang

Jochen

Re: Bootdiskette mit initrd

#8 Post by Jochen »

Nicht, dass ich Dich von Deinem Plan abbringen will, aber hast Du Dir mal tomsrtbt angesehen? Eine Floppy auf 1,72MB formatiert und unter sich selbst erweiterbar und anpassbar. Die verwendet u.a. den Trick, eine minimal kleine initrd zu verwenden, und auf den Rest der Floppy ein mittels bzip2 komprimiertes Dateisystem zu packen, welches dann in eine RAM-Disk ausgepackt wird. Als Rescue-System ist tomsrtbt ziemlich feature-complete, und wenn man auf einen von den 2 Editoren (!) und ein paar Treiber und andere unbenötigte Dinge verzichten kann, bleibt einem viel Platz für eigene Daten/Skripte usw. Ist allerdings libc5-basiert, so dass man ggf. statische libc6-Binaries verwenden oder sich eine libc5-Entwicklungsumgebung zusammenschrauben muss.

Am schönsten finde ich die beigepackten Skripte, um die Floppy in ein Dateisystem zu entpacken, wo man sie beliebig anpassen kann, um sie hinterher wieder per Skript zu einer bootfähigen Floppy zusammenzufassen.

URL: <a href="http://www.toms.net/rb/" target="_blank"><!--auto-->http://www.toms.net/rb/</a><!--auto-->

Jochen

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Bootdiskette mit initrd

#9 Post by bakunin »

Hi Jochen!

Ich kenne TomsRTBT durchaus und hatte es früher auch mal eingesetzt. Ich habe mich aber dagegen entschieden, darauf aufzubauen, wofür es mehrere Gründe gab:

- Ich müsste dort erst kontrollierten, welche Programme nicht frei sind und diese rauswerfen. Der mitgelieferte Emacs ist z.B. nicht frei.
- Da es libc5-basiert ist wäre es möglicherweise nicht ganz einfach für mich, eigene Programme zu compilieren, die dann dort laufen.
- Ich benötige aber einige Programm, die dort nicht drauf sind, z.B. screen und ein paar selbst geschriebene Sachen.
- Viele Dinge will ich anders machen, z.B. soll ohne /etc gebootet werden können, da dieses später von einer Benutzerdatendiskette gemountet wird. Daher brauche ich ein init, das keine /etc/inittab einliest.
- Meines Wissens verwendet TomsRTBT kein busybox, aber ich möchte das verwenden, weil ich mir Dank busybox nicht alle möglichen Quellen zusammensuchen muss.
- Alles in allem würde mich das anpassen vermutlich mehr Zeit kosten als es alles selbst zu machen.
- Es macht irgendwie auch manchmal mehr Spaß, wenn man das Rad selbst nochmal erfindet.

TomsRTBT ist ja auch als Rettungssystem konzipiert, wärend ich etwas vollkommen anderes will: Ich möchte ein System, das einerseits zum Lernen von GNU/Linux geeignet ist (und an einer Schule einsetzbar ist, bzw. eigentlich mache ich es ja sogar hauptsächlich für meinen Netzwerktechnik-Unterricht), mit dem ich andererseits aber auch vernünftig arbeiten kann.

Cheers,
GNU/Wolfgang (der seinem System den Namen "Pizza GNU/Linux" gegeben hat)

Jochen

Re: Bootdiskette mit initrd

#10 Post by Jochen »

Ok, sollte ja nur ein Tipp sein.

tomsrtbt setzt übrigens auch busybox ein, aber nicht für alle Kommandos, die durch busybox möglich wären. Teilweise gibt es halt wohl bessere/funktionalere Tools, die ebenfalls sehr klein sind. (Hintergrund: Wenn man tomsrtbt einsetzt, ist man typischerweise in einer Notfall-Situation und möchte ein System, dass sich möglichst "normal" verhält. Das ist bei einigen busybox-Kommando wohl nicht der Fall, so muss man z.B. beim rm-Kommando mit den Optionen etwas aufpassen...)

Ansonsten gibt es auf Toms Site auch einen Link zu einem libc5-Entwicklungs-Kit, so dass man nicht so viel zusammenbasteln muss.

Gegen die anderen Punkte (Spass, Freiheit, Aufwand) ist allerdings nichts einzuwenden. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Viel Spass dabei!

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Bootdiskette mit initrd

#11 Post by bakunin »

Hi!

So, nun die nächste Frage. Ich bin jetzt nämlich etwas ratlos: Ich habe mich ziemlich nahe an ramdisk.txt gehalten (sogar gleiches Offset für die Ramdisk und gleiche Zahl für die Parameter, auch wenn prompt_ramdisk=1 eigentlich überflüssig war), aber beim Booten von der Diskette kommt keine Meldung wie "Booting the kernel..." oder sonstiges, er schreibt einfach nur "1000" in eine Zeile, wartet einen Moment (ca. 1/2 Sekunde) und schreibt es nochmal in die nächste Zeile usw. Das Diskettenlaufwerk scheint dabei aktiv zu sein, jedenfalls leuchtet das LED davon, hören kann man es allerdings nicht. Ich habe es an zwei Rechnern getestet mit dem gleichen Resultat.

Zuerst waren es sogar scheinbar Registerdumps (Sorry, ich hatte nicht genau darauf geachtet), die wiederholt (und sehr schnell) ausgegeben wurden, wobei auch das LED am Floppy leuchtete, dann hatte ich mit rdev das Boot-Device des Kernels auf /dev/fd0 eingestellt und es kam zu obigem Effekt.

Ich bin ein klein wenig verwirrt, da ich nicht weiß, was der Kernel (wenn er es denn ist) mir damit sagen will.

Ich denke nicht, dass es am Inhalt der Ramdisk liegt, denn so weit scheint er ja gar nicht zu kommen. Aber ich habe auch noch eine Frage dazu: Auf der Ramdisk ist neben einigen Verzeichnissen (wie /proc) nur ein statisch gelinktes /linuxrc-Binary (das auch gar keine Bibliotheken verwendet). Falls es jemand genauer wissen will:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
/* gcc -nostdlib -static -o linuxrc linuxrc.c */

int errno;

#define __KERNEL_SYSCALLS__
#include <sys/types.h>
#include <asm/unistd.h>

void
_start (void)
{
char msg[] = "Hello, world!
";

write (1, msg, sizeof (msg));
while (1)
wait ((void *) 0);
}
</font><hr></pre></blockquote>

iIch vermute nun, dass ich dafür keinen ld-linux.so brauche. Liege ich da richtig? Konnte dazu bisher keine Informationen finden. Würde diese Hello-World-Ramdisk funktionieren?

Gelernt habe ich schon eine Menge hierbei, und Spaß macht es noch dazu. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Cheers,
GNU/Wolfgang

Jochen

Re: Bootdiskette mit initrd

#12 Post by Jochen »

Da hat entweder die Floppy oder aber Deine lilo-Installation 'nen Hau weg? Solange Du kein "Loading initial ramdisk" siehst, lädt der lilo sie auch nicht. Also würde ich da den Fehler suchen...

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Bootdiskette mit initrd

#13 Post by bakunin »

Hi!

> Da hat entweder die Floppy oder aber Deine lilo-Installation 'nen Hau weg?

Weder noch. Erstens wird LILO hier nicht benutzt, zweitens passiert mit einer andreen Diskette das gleiche.

> Solange Du kein "Loading initial ramdisk" siehst, lädt der lilo sie auch nicht. Also würde ich da den Fehler suchen...

Wo denn? <img src="http://www.pl-forum.de/UltraBoard/Images/Sad.gif" border="0" align="middle">

Achja, die Registerdumps, von denen ich geschrieben hatte sehen so aus:

0200
AX:020D
BX:0000
CX:0006
DX:0000.

Mit dem Punkt nach DX:0000 und einem 0200 ohne Registername. Das ganze wie gesagt ständig wiederholt, etwa 4-5 mal pro Sekunde.

Um genau zu sein mache ich

cd /usr/src/linux/arch/i386/boot/
dd if=zImage of=/dev/fd0 bs=1k
cd
dd if=pizza.gz of=/dev/fd0 bs=1k seek=400

Was mache ich da falsch? "file zImage" sagt mir "zImage: Linux kernel x86 boot executable zImage" etc., also müsste eine wie oben beschriebene Diskette doch wenigstens _etwas_ weiter kommen, oder?

Cheers,
GNU/Wolfgang

Jochen

Re: Bootdiskette mit initrd

#14 Post by Jochen »

Ich habe zwar mittlerweile das Gefühl, dass ich Dich eher zurückhalte statt weiterzuhelfen, aber egal...

ramdisk.txt ist eine Anleitung, um den Kernel von einer (vorher auf Floppy gepackten und komprimierten) RAM-Disk booten zu lassen. Das ist dann aber keine initrd, sondern halt das normale root-Dateisystem des Kernels!

Wie lautet das rdev-Kommando, mit dem Du den Kernel anweist, die RAM-Disk zu verwenden?

Wieso verwendest Du zImage und nicht bzImage?

Und zu guter Letzt: Ich würde etwas anders vorgehen. Floppy formatieren, Dateisystem drauf anlegen, Kernel, das gepackte initrd-Dateisystem und lilo-Daten (/boot/boot.b) rüberkopieren und "lilo -C floppy.conf" aufrufen, mit folgender floppy.conf:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
boot=/dev/fd0
install=/floppy/boot/boot.b
map=/floppy/boot/map
prompt
timeout=100
image=/floppy/boot/bzImage
label=linux
read-write
initrd=/floppy/boot/initrd.img
root=/dev/fd0
</font><hr></pre></blockquote>

Jochen

Re: Bootdiskette mit initrd

#15 Post by Jochen »

Mist, zu früh auf den Button geklickt...

Wollte noch sagen, dass in dem initrd der Kernel natürlich <i>nicht</i> enthalten sein muss! Und mit append= kannst Du dem Kernel auch noch andere Parameter mitgeben, dass er beispielsweise nach einer anderen Floppy für's echte root-Dateisystem fragen soll usw.

Viel Spass beim Basteln,

Jochen

Post Reply