Lowlevel
Lowlevel => OS-Design => Thema gestartet von: m3t4lukas am 20. October 2012, 15:31
-
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 (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
-
Und vor Allem hoffe ich, dass ich es in das richtige Thema gepostet habe :D
-
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
-
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
-
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.
-
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
-
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 (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
-
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 (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.
-
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
-
Probier es mal wie im Tutorial:
.text : {
*(multiboot)
*(.text)
}
-
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.
-
Habe beides umgesetzt, jetzt funktioniert es :)
Vielen Dank
Lukas