Boot von USB-Festplatte

26/04/2010 - 22:00 von Markus Wichmann | Report spam
Hi all,

nachdem ich jetzt schon mehrere Tage dran sitze und immer noch einfach
nur am Kotzen bin, frage ich mal nach.

Und zwar hab ich Gentoo nach Installation Guide auf eine USB-Festplatte
installiert. Als Bootloader verwende ich LILO.

Der erste Bootversuch mit folgender lilo.conf

boot=/dev/sdb
compact

label=gentoo
kernel=/boot/kernel1
root=/dev/sdb1


schlug fehl, weil der Kernel beim Booten kein /dev/sdb1 finden konnte.
Anscheinend versucht der Kernel zuerst, root zu mounten, und erst danach
werden die USB-Treiber initialisiert. Hrmpf.

Also gut, ich hatte noch etwas rumgespielt, und bin bei folgender Lösung
rausgekommen:

label=gentoo
kernel=/boot/kernel1
initrd=/boot/initrd1
root=/dev/ram0

Dafür musste ich in den Kernel Support für initramfs, ramfs (/dev/ram0
.. ram15) und squashfs einbauen.

Die initrd habe ich selbst gebastelt. Es ist nur ein squashfs mit

- /bin: busybox und symlinks auf alle Funktionen davon
- /dev: enthàlt nur console, wird aber sowieso von einem devtmpfs
automatisch übermountet
- /lib: ld-linux, libc und libm (benötigt von busybox)
- /lib64: symlink auf lib
- /sbin: enthàlt init, einen Symlink auf /bin/sh

Resultat beim Booten: der Kernel bootet zwar in die initrd, aber busybox
startet nicht, sondern gibt die Fehlermeldung

can't open /dev/vc/n: No such file or directory

aus. Dabei ist n durch eine zufàllige Zahl zwischen 0 und 4 zu ersetzen.
Diese Meldung wird allerdings gleich im Dutzend generiert. Idee:
busybox hat aus irgend einem Grund kein stdin, stdout und stderr.
Lösung: Ein Programm selbst schreiben, dass nur /dev/console öffnet, auf
die drei FDs legt und busybox ausführt.

Das funktioniert dann. Puh, erste Hürde genommen. Nun wollte ich die
Boot-Methode mit pivot_root benutzen, in der Hoffnung, möglichst einfach
an init zu kommen, aber irgendwie klappt das nicht so ganz. Richtig fies
finde ich immer noch, dass der Kernel sofort die Zielplatte findet,
sobald busybox làuft. Kann man das irgendwie veràndern? Die USB-Treiber
sind fest einkompiliert.

Jedenfalls brauche ich ein Zielverzeichnis. Da die initrd aber in einem
squashfs steckt, kann ich keins anlegen. War nicht ganz einfach, ich hab
dann einfach /sbin übermountet. Sauber ist aber etwas anderes.

Anschließend hab ich mit pivot_root das echte root mit der initrd
vertauschen können und ein exec spàter hat mich dann in eine richtige
Shell versetzt. Hier dann wieder Ernüchterung: /dev enthàlt viel, aber
nicht das richtige (Aber dafür gibt es ja devtmpfs), und Steuerzeichen
gehen nicht. Wieso, weiß ich nicht. Liegt das ander verwendeten Shell
(zsh)? Jedenfalls erzeugt das drücken von Strg-C nur die Ausgabe "^C".
Sonst nix. Kein Prozess wird abgebrochen. (Ich hatte in dieser Umgebung
xmonad installiert. Wisst ihr, wie nervtötend es ist, wenn man
eigentlich nur mal schnell was anderes machen will, aber man das Bauen
des ghc nicht abbrechen kann?).

Ach ja, das eigentlich größte Problem bleibt nach wie vor init. Gentoo
benutzt hier das gute alte sysv-init, und das wàre ja auch gut, wenn ich
es nicht in lediglich zwei Modi erlebt hàtte: Entweder (wenn einfach nur
als "/sbin/init" oder auch "exec /sbin/init" aufgerufen) zeigt es die
Hilfenachricht an, in der mir erklàrt wird, dass ich init nur mit
runlevel starten kann, oder (wenn mit irgendeinem Argument
aufgerufen, egal ob PID==1 oder nicht) es kommt die Fehlermeldung
"/dev/initctl: No such file or directory." In beiden Fàllen macht init
nichts Initialisierendes, und die Angewohnheit von Linux, Panik zu
haben, sobald init sich beendet (anstatt init einfach neu zu starten!)
macht das Debuggen nicht gerade einfach.

Ich hoffe, dass das folgende Skript die initrd übernehmen kann:

#automount von /dev abwarten
while [ ! -e /dev/sdb1 ]; do :; done

mount -t reiserfs /dev/sdb1 /new-root
pivot_root /new-root /new-root/initrd
cp /dev/null /etc/mtab
mount -t devtmpfs dev /dev
mkdir -p /dev/shm /dev/pts
chown -R :audio /dev/snd
chmod -R g+rwX /dev/snd
#manches Zeug wird nicht von "mount -a" gemountet. Also mach ich es
#manuell. Dabei steht das alles in der fstab!
mount /dev/shm
mount /dev/pts
mount /proc
mount /sys
mount /tmp
exec /bin/zsh </dev/tty1 >/dev/tty1 2>&1

Reicht das aus? Ich hab nicht die Ausdauer, das heute noch zu
überprüfen. (So oft rebootet hab ich nicht mehr, seit ich Win2k von der
Platte entfernt habe)

Ich hab mir mal angeguckt, wie andere Distributionen das machen mit dem
Ausführen von init nach der initrd. Debian làsst da ein Programm namens
run-init laufen. Das macht in etwa das hier:

cd $NEW_ROOT
rm -rf --one-file-system /
mount --move . /
chroot . && cd /
exec /sbin/init </dev/console >/dev/console 2>&1

Die Idee, die initrd zu leeren, ist schon nicht schlecht, bringt nur in
meinem Fall nix, weil die initrd ein squashfs ist. Den Speicher, den die
initrd belegt, kann man nur freigeben, indem man die pivot_root-Methode
anwendet, und nach dem pivot_root alle Referenzen zum initramfs entfernt
und dann die initrd umountet.

Hat einer ein paar Antworten?

Markus

Progress (n.): Process through which USENET evolved from smart people in
front of dumb terminals to dumb people in front of smart
terminals.

news://freenews.netfront.net/ - complaints: news@netfront.net
 

Lesen sie die antworten

#1 Helmut
26/04/2010 - 23:14 | Warnen spam
Hallo, Markus,

Du meintest am 26.04.10:

Und zwar hab ich Gentoo nach Installation Guide auf eine
USB-Festplatte installiert. Als Bootloader verwende ich LILO.

Der erste Bootversuch mit folgender lilo.conf

boot=/dev/sdb
compact

label=gentoo
kernel=/boot/kernel1
root=/dev/sdb1


schlug fehl, weil der Kernel beim Booten kein /dev/sdb1 finden
konnte. Anscheinend versucht der Kernel zuerst, root zu mounten, und
erst danach werden die USB-Treiber initialisiert. Hrmpf.



Könnte sein, dass "udev" da Probleme erzeugt.
Leg mal bei nicht laufendem System die "sdbx"-Devices an
a) unter "/dev"
b) unter "/lib/udev/devices"

Hat bei meinen Systemen geholfen - was auch immer das bedeutet.

Viele Gruesse
Helmut

"Ubuntu" - an African word, meaning "Slackware is too hard for me".

Ähnliche fragen