Autor Thema: Grub error: no such device: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  (Gelesen 4909 mal)

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
Hallo Leute,

nachdem ich nun schon ein paar Jahre meinen Spaß mit Linux und C++-Programmierung hatte, habe ich mir gedacht, dass es nicht schaden kann, auch etwas Wissen über Betriebssysteme zu sammeln. Ich habe nun schon einige Bücher über das OS-Design gelesen und dachte mir, dass es jetzt auch mal Zeit für die Praxis ist.

Heute habe ich GRUB auf meinem USB-Stick installiert (Diese Anleitung wurde benutzt: http://www.lowlevel.eu/wiki/GRUB_Installation_auf_einem_USB-Stick, mit der Änderung: grub-install --force --no-floppy --root-directory=/mnt/usb /dev/sdX). Danach habe ich in /boot/grub noch eine leere Datei 'menu.lst' platziert.

Da drin steht:
title MeinOS
kernel /system/kernel
boot

in dem USB-Stick habe ich im Root-Verzeichnis den Ordner 'system' angelegt, in den ich den 'kernel' (gelinkte ausführbare Datei) gelegt habe.

Also habe ich den Stick meinem Schlepptop gefüttert und da zeigt GRUB die Fehlermeldung: "error: no such device: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.\ngrub rescue>"
error: no such device: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
grub rescue>

Der Befehl 'ls' liefert folgendes Ergebnis:
(hd0) (hd0,msdos1) (hd1) (hd1,msdos5) (hd1,msdos1)

Der Laptop wurde so eingestellt, dass der Stick die primäre Bootquelle ist.

Ich hoffe ich habe genug infos gepostet, dass ihr damit was anfangen könnt, wie gesagt bin ich noch newbie auf diesem Gebiet.

Vielen Dank im Vorraus und liebe Grüße
Lukas

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 20. October 2012, 17:01 »
Und vor Allem hoffe ich, dass ich es in das richtige Thema gepostet habe :D

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. October 2012, 21:21 »
Hallo,

wenn es kein GRUB sein muss, kommst du mit einem SYSLINUX aus meiner Sicht einfacher zum Ziel. ;-)

# cat /usr/lib/syslinux/mbr.bin > /dev/sdX
# syslinux -i /dev/sdX1
wobei /dev/sdX1 eine aktive FAT-Partition auf dem Stick ist.

Dann kopierst du die Dateien /usr/lib/syslinux/menu.c32 und /usr/lib/syslinux/mboot.c32 in das Stammverzeichnis dieser Partition und erstellst eine Datei SYSLINUX.CFG mit folgendem Inhalt:

DEFAULT menu.c32
TIMEOUT 80
LABEL MeinOS
KERNEL /mboot.c32
APPEND /system/kernel

Das sollte ähnlich gut funktionieren.

Gruß,
Svenska

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. October 2012, 22:32 »
Hallo Svenska,

muss es eine FAT partition sein? Es wäre ziemlich cool, wenn es doch bei ext2 bleiben könnte, weil ich mich damit ziemlich gut auskenne. FAT hängt mir zu sehr mit Windoof zusammen :/

Zu GRUB habe ich noch eine Frage. Muss in dem Ordner /boot/grub die Datei grub.cfg vorhanden sein, wenn darin schon eine menu.lst vorhanden ist? Wenn ja, was muss darin stehen?

Liebe Grüße
Lukas

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. October 2012, 22:38 »
Und ich habe durch genaues hingucken (Sarkasmus, hätte ich auch schon viel früher merken können) herausgefunden, Dass die UUID der Festplatte, nach der GRUB beim Booten sucht,  die der Festplatte des PCs ist, auf dem GRUB auf dem Stick installiert wurde. Ich hoffe das hilft weiter.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 21. October 2012, 00:29 »
Hallo,

muss es eine FAT partition sein? Es wäre ziemlich cool, wenn es doch bei ext2 bleiben könnte, weil ich mich damit ziemlich gut auskenne.
Die Syslinux-Suite besteht aus Syslinux (FAT), Extlinux (ext2/3/4, btrfs), PXELinux (Netzwerkboot) und ISOLinux (CDs mit El-Torito). Bei mir läuft seit längerem Extlinux auf ext4.

Mit Grub kenne ich mich nicht besonders aus, aber wenn ich mich recht entsinne, ist die grub.cfg für Grub2 und die menu.lst für Grub Legacy da. Ohne Gewähr (und Pistole).

Um dein Grub-Problem zu beheben, solltest du die UUID durch die des USB-Sticks ersetzen. Ich bin kein Freund von UUIDs und arbeite lieber mit Labels - ob Grub das kann, weiß ich nicht.

Gruß,
Svenska

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 21. October 2012, 16:28 »
Hallo,

ich habe mir eine grub.cfg erstellt :)
Er scheint aber zu Meckern, was die Multibootfähigkeit meines Kernels betrifft.
Müssen alle Variablen des Multiboot-Headers vorhanden sein, oder reichen auch die ersten 3, wie in diesem Beispiel: http://www.lowlevel.eu/wiki/C%2B%2B-Kernel_mit_GRUB?
Und wo wird in diesem Bespiel GRUB der Multiboot Struct mitgeteilt?

Liebe Grüße
Lukas

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 21. October 2012, 17:23 »
Er scheint aber zu Meckern, was die Multibootfähigkeit meines Kernels betrifft.
Müssen alle Variablen des Multiboot-Headers vorhanden sein, oder reichen auch die ersten 3, wie in diesem Beispiel: http://www.lowlevel.eu/wiki/C%2B%2B-Kernel_mit_GRUB?
Ja.

Und wo wird in diesem Bespiel GRUB der Multiboot Struct mitgeteilt?
Gar nicht so richtig. Der Code aus dem Tutorial funktioniert nur, wenn der Multiboot Header "zufällig" an dem Anfang der Datei landet. (Es ist nicht wirklich Zufall, sondern kommt auf den Linkeraufruf an.) Eine zuverlässigere Methode ist es wie in diesem Tutorial zu machen: http://www.lowlevel.eu/wiki/Teil_4_-_Hello_World#Multiboot-Header_in_einer_eigenen_Sektion

Also irgendwie so (ungetestet):

...
section multiboot                      ; <-------- !!!
align 4
MultiBootHeader:
  dd MAGIC        ; Magic number
  dd FLAGS        ; Flags
  dd CHECKSUM    ; Checksum
 
section .text                      ; <-------- !!!
loader:
  mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren

...

Und dann das Linker-Skript (oder zumindest die Zeile *(multiboot)) aus dem Tutorial verwenden. Dann landet der Multiboot-Header in den ersten 8 KB des Kernels und GRUB kann ihn finden.
Dieser Text wird unter jedem Beitrag angezeigt.

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 21. October 2012, 20:19 »
Wenn ich das so compiliere, meckert der trotzdem, dass er kein header finden kann.

Hier mein Linker-Skript:
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS
{
  . = 0x0100000;
 
  multiboot :
  {
    *(multiboot*)
  }
 
  .text :
  {
    *(.text*)
    *(.rodata)
  }

  .data  :
  {
    start_ctors = .;
    *(.ctors)
    end_ctors = .;

    *(.data)
  }

  .bss  :
  {
    *(.bss)
  }

  /DISCARD/ : { *(.dtors) *(.comment) }
}

Liebe Grüße
Lukas

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 22. October 2012, 10:46 »
Probier es mal wie im Tutorial:

    .text : {
        *(multiboot)
        *(.text)
    }
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 22. October 2012, 13:34 »
Arbeitest du auf einem 64-Bit System? Dann ist dein Kernel vermutlich über 1MB groß und '-m elf_i386' bzw. '-z max-page-size=4096' könnten dir beim linken helfen deinen Kernel um 1MiB Nullen kleiner zu machen. Dann landet der Multiboot-Header auch in den erst 8KiB und Grub findet ihn.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

m3t4lukas

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 23. October 2012, 19:31 »
Habe beides umgesetzt, jetzt funktioniert es :)

Vielen Dank
Lukas

 

Einloggen