# bootfähigen USB-Stick mit Gentoo erstellen

## Christoph Schnauß

guten Abend,

Ich bin dabei, mir einen bootfähigen USB-Stick einzurichten. Das Ding hat immerhin 64 GB, das reicht. Ich dachte mir, es sollte doch ausreichen, GRUB auf dem Stick zu installieren einschließlich eines Grundsystems, also einschließlich X-Server. Grundsätzlich macht er das auch mit, ich kriege mein gewohntes Auswahlmenü beim Booten von GRUB angezeigt und kann das auf der ersten Platte vorhandene Windows7 booten. Mit Gentoo auf dem Stick gibts aber Probleme. Da startet der Kernel zwar brav und zeigt mir erstmal die Pinguine, bricht dann aber mit einer Panikmeldung ab. Das liegt vermutlich _nicht_ am Kernel, sondern an GRUB, weil es mir nicht gelingt, in der grub.conf das korrekte root-Device anzusprechen. /dev/sdc1 wird nicht gefunden.

Wenn ich mit der miniinstall-CD boote, zeigt mir fdisk -l die vorhandenen Partitionen der ersten Platte (/dev/sda) an, auf der zweiten Platte (/dev/sdb) gibt es derzeit nur eine Partition ohne Dateisystem (vorgesehen ist ext4), und mein Stick wird als /dev/sdc angezeigt, /dev/sdc1 ist eine primäre und mit ext4 formatierte Partition, auf der ein Gentoo-System liegt, /dev/sdc2 ist eine FAT32-Partition. Alles ganz prima, In einer gechrooteten Umgebung kann ich meinem Stick mit emerge bedienen und installieren, was ich zu brauchen glaube. Ich kann auch bei Bedarf den X-server hochfahren.

Nur: wenn ich jetzt _nicht_ über die CD booten, sondern den Stick selbst benutzen möchte, findet er (also GRUB) die Partition auf dem Stick nicht. Das hat offenbar damit zu tun, daß ein Booten vom Stick aus die Reihenfolge der Devices ändert (ich kanns mir nicht anders erklären). Für GRUB sollte hd0 laut device.map eigentlich /dev/sda sein, hd1 dann /dev/sdb und hd2 mein /dev/sdc, also mein Stick. Das stimmt aber nur, wenn ich von der CD boote. Der Stick selber verändert das Startdevice offenbar zu hd0 (statt hd2), was sich daran erkennen läßt, daß ich mit 

```
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
```

den Hintergrund für das Bootmenü dargestellt bekomme und daß ich mein Windows, das ja real auf /dev/sda1 liegt, mit 

```
rootnoverify (hd1,0)
```

 ansprechen muß. Das heißt: Der Bootmanager, der ja auf meinem Stick liegt (und nicht im MBR einer Platte) kann seine Konfiguration auslesen und befolgen und wenn gewünscht auf die Systeminstallation einer Platte umschalten. Nur die Systeminstallation auf dem Stick selber findet er nicht, egal was ich nun anzugeben versuche.

Hat jemand eine Lösung?

----------

## firefly

nein das ist kein grub problem, sondern liegt daran, dass die initialisierung des USB stacks zu lange braucht, bis dieser den USB-Stick erkennt. Und dadurch findet der kernel das root device nicht und panics  :Smile: 

Man kann beim kernel aber einen boot parameter angeben, mit dem man dem kernel eine wartezeit mitgeben kann, bevor dieser versucht das root device zu mounten.

Und zusätzlich solltest du, wenn du vorhast dein "USB Gentoo" auch auf anderen rechnern zu starten, eine initrd/initramfs erstellen, welches das mounten des root device per UUID (des Filesystems) oder per LABEL unterstützt.

----------

## Christoph Schnauß

danke erstmal,

 *firefly wrote:*   

> das ... liegt daran, dass die initialisierung des USB stacks zu lange braucht, bis dieser den USB-Stick erkennt. Und dadurch findet der kernel das root device nicht und panics :)

 

Klingt plausibel

 *firefly wrote:*   

> Man kann beim kernel aber einen boot parameter angeben, mit dem man dem kernel eine wartezeit mitgeben kann, bevor dieser versucht das root device zu mounten.

 

öhm ... und wie mache ich das? In der grub.conf was reinschreiben? 3 Sekunden müßten reichen, aber ich weiß nicht genau, wie.

 *firefly wrote:*   

> Und zusätzlich solltest du, wenn du vorhast dein "USB Gentoo" auch auf anderen rechnern zu starten, eine initrd/initramfs erstellen, welches das mounten des root device per UUID (des Filesystems) oder per LABEL unterstützt.

 

Ohje. Hab ich natürlich nicht, bisher kam ich bei fest installierten Systemen immer ohne initramfs aus. Das Handbuch gibt auch nur an, daß man sowas mit genkernel machen kann, ich habe genkernel aber ignoriert, muß/will ja meinen Kernel selber bauen. Und eine verständliche Anleitung, wie das geht, ist mir nicht bekannt.

Allerdings: wie oben bereits angegeben, zeigt mir bei gebooteter miniinstall-CD ein einfaches 

```
fdisk -l
```

meine zwei Platten als /dev/sda und /dev/sdb sowie meinen Stick als /dev/sdc an. Und auf den Platten gibt es keinen GRUB, wenn ich CD und Stick rausziehe, bootet Windows7 und es gibt keinen Bootmanager. Wenn ich vom Stick aus boote, also noch ehe die beiden Platten initialisiert werden, muß ich in der grub.conf als Ort für mein Windows (hd1,0) angeben, dann funktioniert es. "Richtig" wäre aber eigentlich (hd0,0). Gibts dafür eine Erklärung?

----------

## cryptosteve

 *Christoph Schnauß wrote:*   

>  *firefly wrote:*   Man kann beim kernel aber einen boot parameter angeben, mit dem man dem kernel eine wartezeit mitgeben kann, bevor dieser versucht das root device zu mounten. 
> 
> öhm ... und wie mache ich das? In der grub.conf was reinschreiben? 3 Sekunden müßten reichen, aber ich weiß nicht genau, wie.

 

Moin,

versuche mal, Deine Kernel-Zeile um grub um folgenden Parameter zu erweitern:

```
rootdelay=3
```

Mit den Zeiten musst Du natürlich ein bißchen testen, was sich für Dich als praktikabel erweist.

----------

## bell

Ich baue meine Initramfs und den Kernel immer mit Genkernel. Und trotzdem habe ich die volle "old-style" Kontrolle über die Kernel-Konfiguration. Mit 

```
genkernel --oldconfig  --no-ramdisk-modules --no-keymap all
```

wird make; make modules_install; mounten von /boot; kopieren des Kernels nach /boot; generieren und installieren der minimalistischen initramfs gemacht.

Du kannst natürlich auch 

```
genkernel --oldconfig  --no-ramdisk-modules --no-keymap initramfs
```

ausführen, die nur die initramfs generiert und nach /boot packt.

Wichtig ist die Option "--oldconfig", die Deine ".config" nicht anfasst, auch kein "mrproper" ausführt, sondern sicherheitshalber nur ein "make silentoldconfig" ausführt und direkt anfängt den Kernel zu bauen. no-ramdisk-modules und no-keymap machen die initramfs kleiner und diese "Automatische Hardware-Erkennung" ist nicht mehr da.

Das ist also die "minimale" genkernel-initramfs, die fast so tickt als wäre sie nicht da. Ok. UUID Unterstützung wäre schon drin. Aber Du kannst bei Bedarf zusätzliche Funktionen ganz einfach per Parameter hinzufügen oder in der /etc/genkernel.conf einstellen. Siehe "genkernel --help".

----------

## Christoph Schnauß

 *cryptosteve wrote:*   

> versuche mal, Deine Kernel-Zeile um grub um folgenden Parameter zu erweitern:
> 
> ```
> rootdelay=3
> ```
> ...

 

Besten Dank, damit bin ich erstmal bis zum login gekommen. Damit ist das Hauptproblem vorerst erledigt.

Was ich trotzdem überhaupt nicht verstehe, ist die scheinbare "Umbenennung" der Bootdevices. In der folgenden Form funktioniert meine aktuelle grub.conf jetzt erstmal so weit, daß der Bootmanager das macht, wozu er eben da ist:

```
default 0

timeout 30

splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title PC1 Windows 7

rootnoverify (hd1,0)

makeactive

chainloader +1

title Stick Gentoo

root (hd0,0)

kernel /boot/kernel root=/dev/sdg1 rootdelay=20
```

Warum will der Stick unbedingt als (hd0) angesprochen werden? Und warum wird die physische Platte mit dem vorhandenen Windows zu (hd1)? Wieso wird /dev/sdg1 verlangt, owohl es das eigentlich gar nicht gibt?

 *bell wrote:*   

> Du kannst natürlich auch 
> 
> ```
> genkernel --oldconfig  --no-ramdisk-modules --no-keymap initramfs
> ```
> ...

 

Danke. Ich muß sowieso nochmal an den Kernel ran und noch einiges basteln. Wichtig war erstmal, daß ich mit grub ein befriedigendes Ergebnis bekomme.

----------

## firefly

 *Christoph Schnauß wrote:*   

> 
> 
> Warum will der Stick unbedingt als (hd0) angesprochen werden? Und warum wird die physische Platte mit dem vorhandenen Windows zu (hd1)? Wieso wird /dev/sdg1 verlangt, owohl es das eigentlich gar nicht gibt?

 

Soweit ich weis, ist hd0 in grub die "Platte", von der der Bootloader vom Bios geladen wurde.

Doch sdg gibt es, scheinbar meint der kernel dass sda-sdf schon belegt sind. Und aufgrund dieser "willkür" welches device name der kernel dem USB-Stick beim booten vergibt, ist die verwendung von UUID oder LABEL (beide vom Dateisystem) robuster.

Dafür wird halt ein initramfs benötigt, welche das mounten des root-devices übernimmt.

Ohne initramfs funktioniert es seit einiger zeit auch mit Partition-UUID (root=PARTUUID). Nur hierfür ist eine Partitionstabelle im format GPT notwendig.

----------

