Lowlevel
Lowlevel => OS-Design => Thema gestartet von: bauerb am 04. January 2006, 21:43
-
hi!
ich möchte auf einem diskimage grub installieren. das diskimage hat ein ext2 filesystem.
weiss jemand wie ich auf diesem image grub installiere, ohne dass ich es auf ein wikliches device (bspw. diskette) kopiere.
hänge schon relativ lange an dem problem und das inet gibt auch nicht sehr viel
darüber her.
mfg bauerb
-
Du scheinst Linux einzusetzen, hier also eine Linux-Methode:
Mit
mkdir mnt
einen neuen Ordner im Verzeichnis vom Image erstellen
Anschließend sollte man mit
mount -o loop diskimage.img mnt
das Image mounten können. Wenn du jetzt in den Ordner mnt Dateien kopierst landen die in Wirklichkeit im Image. Wenn du fertig bist einfach wieder unmounten:
umount diskimage.img
So kannst du alle Grub Dateien problemlos ins Image kopieren. Den Bootsector kann man mit dem Befehl dd von einer Datei in eine andere kopieren (siehe dd --help).
Unter Windows kenn ich keine Methode zum mounten von Images, würde aber bei dir wegen ext2 eh nichts bringen.
-
hi!
ok. soweit bin ich schon, aber....
ich habe mir mit bximage ein image mit 10 MB erstellt und mit mkfs eine ext2 fs
drauf erstellt. anschliessend hab ich das image gemountet und dier verzeichnisse /boot und
/boot/grub erstellt und die grub dateien von meiner linuxkiste auf das image kopiert
das sind:
device.map
e2fs_stage1_5
fat_stage1_5
jfs_stage1_5
menu.lst
minix_stage1_5
reiserfs_stage1_5
stage1
stage2
xfs_stage1_5
anschliessend hab ich die datei stage1 (was ja der bootsektor ist) mit dem befehl
dd if=stage1 of=hdc.img conv=notrunc
auf die ersten 512 bytes des images geschrieben.
dann wollte ich mit bochs das ding mal laufen lassen.
ausgabe:
...
...
00000807985i[CPU ] BOUND_GdMa: fails bounds test
00000807986i[CPU ] BOUND_GdMa: fails bounds test
00000807987i[CPU ] BOUND_GdMa: fails bounds test
00000807988i[CPU ] BOUND_GdMa: fails bounds test
00000807989i[CPU ] BOUND_GdMa: fails bounds test
00000807990i[CPU ] BOUND_GdMa: fails bounds test
00000807991i[CPU ] BOUND_GdMa: fails bounds test
00000807992i[CPU ] BOUND_GdMa: fails bounds test
00000807993i[CPU ] BOUND_GdMa: fails bounds test
00000807994i[CPU ] BOUND_GdMa: fails bounds test
00000807995i[CPU ] BOUND_GdMa: fails bounds test
00000807996i[CPU ] BOUND_GdMa: fails bounds test
00000807997i[CPU ] BOUND_GdMa: fails bounds test
00000807998i[CPU ] BOUND_GdMa: fails bounds test
00000807999i[CPU ] BOUND_GdMa: fails bounds test
00000840780p[CPU ] >>PANIC<< prefetch: RIP > CS.limit
00000840780i[SYS ] Last time is 1136464876
00000840780i[XGUI ] Exit.
00000840780i[CPU ] real mode
00000840780i[CPU ] CS.d_b = 16 bit
00000840780i[CPU ] SS.d_b = 16 bit
00000840780i[CPU ] | EAX=00004f8f EBX=00006100 ECX=00640000 EDX=00000080
00000840780i[CPU ] | ESP=0000005a EBP=00000010 ESI=00003601 EDI=0000ffdd
00000840780i[CPU ] | IOPL=0 NV DW DI NG NZ AC PO NC
00000840780i[CPU ] | SEG selector base limit G D
00000840780i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
00000840780i[CPU ] | CS:1000( 0000| 0| 0) 00010000 0000ffff 0 0
00000840780i[CPU ] | DS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000840780i[CPU ] | SS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000840780i[CPU ] | ES:fbfd( 0000| 0| 0) 000fbfd0 0000ffff 0 0
00000840780i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000840780i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000840780i[CPU ] | EIP=00010000 (0000ffff)
00000840780i[CPU ] | CR0=0x00000010 CR1=0 CR2=0x00000000
00000840780i[CPU ] | CR3=0x00000000 CR4=0x00000000
00000840780i[ ] restoring default signal behavior
========================================================================
Bochs is exiting with the following message:
[CPU ] prefetch: RIP > CS.limit
========================================================================
00000840780i[CTRL ] quit_sim called with exit
weiss jemand weiter?
mfg bauerb
-
huch, ich würd gleich drauf lossagen falsches array, denn der bound test wird mit dem bound befehl durchgeführt
und ich hab gelesen, wenn da das auser dem bereich liegt, gibts einen #GP
mehr weiß ich (ohne nachzudenken) auch nicht
-
hi!
OK......
ich hab kein wort verstanden ;-)
mfg bauerb
-
ich würde sagen die probleme mit dem bound sind auch eher effekte, als eine ursache.
man sieht an
00000840780p[CPU ] >>PANIC<< prefetch: RIP > CS.limit
...
00000840780i[CPU ] | CS:1000( 0000| 0| 0) 00010000 0000ffff 0 0
...
00000840780i[CPU ] | EIP=00010000 (0000ffff)
dass der prozessor irgendwie in einen bereich gesprungen ist, wo kein gültiger code mehr ist. zufällig waren da vermutlich gerade bytes, die als befehle, die irgendwas mit bound zu tun haben, interpretiert werden. am "ende" (0x1000:0xFFFF) ist dann diese PANIC aufgetreten.
die ursache ist also entweder fehlerhafter code (z.b. code der an ein falsches offset geladen wurde) oder code der nicht vollständig geladen wurde.
-
Du kannst warscheinlich nicht einfach den Bootsektor kopieren, da da evt. auch Daten von ext2 drinnenstehen.
-
hi!
nein da steht gar nichts drinnen ausser nuller.
kann das sein, dass die datei stage1 nicht weiss wo sie hinspringen muss?
oder reicht das, dass ich das grub-zeug einfach in den ortner /boot/grub
schmeisse. brauch ich da spezielle zugriffsrechte?
mfg bauerb
-
wenn ich mich nicht irre muss man stage2 und nicht stage1 in den bootsektor verbannen (jedenfalls wird auf http://www.pro-linux.de/news/2005/7752.html stage 2 verwendet - NICHT wie im beispiel machen, oder hast nen cdimage?)
-
hi!
naja... das glaub ich ganz ehrlich gesagt nicht, weil stage1 512 Byte hat und
stage2 ist viel grösser.
mfg bauerb
-
stage1 kommt in den bootsector.
stage1.5 kommt ins fs
stage2 kommt ins fs.
stage1 muss dann so konfiguriert werden, dass es stage 1.5 findet. stage 1.5 ist in der lage ein FS zu lesen, und läd stage2. stage2 läd dann das os.
Guck dir das hier mal an:
http://www.openbg.net/sto/os/xml/grub.html
-
hi!
ok. das höhrt sich schon ganz gut und logisch an, aber wie sag ich stage1 wo im image stage1.5 liegt (und nicht zu vergessen das ist keine normale platte sondern nur eine imagedatei mit 10MB)?
mfg bauerb
-
stage1 oder halt der Bootsector ist so weit ich weiß, nicht "konfigurierbar". Je nach Partition, Laufwerkstyp, Filesystem, usw. wird immer ein anderer Bootsector verwendet.
Unter Linux gibts den Befehl/das Programm grub, mit dem man auf Laufwerke (Images glaube ich funktionieren nicht) Grub installieren kann. Vermutlich wird dabei ein Bootsector ausgewählt/generiert.
-
gibt es keine möglichkeit grub auf diesem image zu installieren?
ehrlich gesagt, will ich nicht auf realer hardware arbeiten.
-
images lassen sich doch mounten, ich denk mal das man auf nen gemountetes image auch grub installieren kann. kann höchstens sein dass du inner /boot/grub/devices.map (oder so ähnlich) was eintragen musst, ich hattes letztens (auf echter hardware) das er ohne entsprechenden eintrag nicht auf die floppy schreiben wollte...
-
Wenn man nen Eintrag in /boot/grub/devices.map hinzufügt, sollte man das wirklich mit dem Grub-Befehl machen können. Einfach als root grub eingeben, und du kommst in ne Art shell. Da kannst du eine Festplatte angeben, usw. und zuletzt Grub installieren.
-
Also: um ein Image mit Grub bootbar zu machen musst du nur die Grub-Dateien auf den Image nach "/boot/grub" kopieren (hast du ja gemacht), aber danach musst du es installieren. Nimm dazu am besten folgenden Skript-Schnipsel (Dateinamen des Images wirst du warscheinlich noch anpassen muessen ^^):
#! /bin/sh
#
/sbin/grub --batch --device-map=/dev/null <<EOF
device (fd0) mein.img
root (fd0)
install /boot/grub/stage1 (fd0) /boot/grub/stage2
quit
EOF
Falls dein Image eher Festplatten-like ist, ersetzt du bei "device" und "root" das (fd0) durch (hd0), und bei "root" gibst du dann noch nach einem Komma die Partitionsnummer an z.B. "(hd0,0)".
-
mein script sieht so aus:
#! /bin/sh
#
/sbin/grub --batch --device-map=/dev/null <<EOF
device (hd0) hdc.img
root (hd0)
install /boot/grub/stage1 (hd0) /boot/grub/stage2
quit
EOF
mein image hat keine partition also nehme ich mal an, dass (hd0) richtig ist.
hab das script mal laufen lassen und erhalte folgenden fehler.
grub> device (hd0) hdc.img
grub> root (hd0)
Filesystem type unknown, using whole disk
grub> install /boot/grub/stage1 (hd0) /boot/grub/stage2
Error 17: Cannot mount selected partition
grub> quit
-
Ok, ich glaub ich weis was das Problem ist: du hast ein HardDisk Image, was nicht wirklich eines ist, weil es keine Partitionstabelle hat und das Dateisystem im ersten Sektor beginnt! Ich schreibe mal ein Skript, womit man das ganze richtig erstellen kann und was auch gleich GRUB drauf installiert ;-).
-
So, es sind 2 Skripte draus geworden:
#! /bin/sh
# Skript zum Erstellen eines HardDisk Images mit einer ext2 Partition
#
# ----------------------------------------------
# Name des Images
image=hdc.img
# Konfiguration der Größe
cylinder=20
heads=16
sectors=63
# ----------------------------------------------
# Skript
size=$((cylinder*heads*(sectors)*512))
sizemb=$((size / (1024*1024)))
echo "Erstelle Hard-Disk Image mit CHS=${cylinder}/${heads}/${sectors}, also ${sizemb} MBytes..."
echo "...erstelle Datei ${image}"
dd if=/dev/zero of=${image} bs=512 count=$((size / 512))
echo "...erstelle Partitionstabelle"
/sbin/parted --script ${image} mklabel msdos
echo "...erstelle Partition"
/sbin/fdisk -C ${cylinder} -H ${heads} -S ${sectors} ${image}<<EOF
n
p
1
w
q
EOF
echo "...formatiere Partition"
/sbin/parted --script ${image} mkfs 1 ext2
echo
echo "Um auf die Partition zugreifen zu können folgendes (als root) eingeben:"
echo "mount -o loop,offset=$((sectors*512)) ${image} [verzeichnis]"
echo
und
#! /bin/sh
# Skript zur Installation von GRUB auf einem HardDisk Image
#
# - alle GRUB Dateien sollten im aktuellen Verzeichnis unter ./boot/grub
# abgelegt sein
# - dieses Skript benötigt root-Rechte
#
# --------------------------------------------
# Konfiguration
# Name des Images
image=hdc.img
# Irgendein nicht-existierendes Verzeichnis
tmpdir=./tmp
# Offset zur Partition (siehe Ausgabe des HardDisk-Erstellers)
offset=32256
# --------------------------------------------
# Skript
mkdir ${tmpdir}
mount -o loop,offset=${offset} ${image} ${tmpdir}
cp -r boot ${tmpdir}
umount ${image}
rmdir ${tmpdir}
/sbin/grub --batch --device-map=/dev/null <<EOF
device (hd0) ${image}
root (hd0,0)
setup (hd0)
quit
EOF
Es sollte alles Selbsterklärend sein, wenn nicht, dann feel-free-to-post ;-)