Autor Thema: grub auf einem diskimage installieren  (Gelesen 10163 mal)

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« 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
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 04. January 2006, 21:53 »
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.

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. January 2006, 13:00 »
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
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

T0ast3r

  • Gast
Gespeichert
« Antwort #3 am: 05. January 2006, 13:53 »
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

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 05. January 2006, 13:56 »
hi!


OK......

ich hab kein wort verstanden ;-)

mfg bauerb
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 05. January 2006, 15:11 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 05. January 2006, 15:19 »
Du kannst warscheinlich nicht einfach den Bootsektor kopieren, da da evt. auch Daten von ext2 drinnenstehen.

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 05. January 2006, 15:27 »
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
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 05. January 2006, 18:57 »
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?)
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 05. January 2006, 19:04 »
hi!

naja... das glaub ich ganz ehrlich gesagt nicht, weil stage1 512 Byte hat und
stage2 ist viel grösser.

mfg bauerb
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 05. January 2006, 19:07 »
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

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 06. January 2006, 16:20 »
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
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 06. January 2006, 17:01 »
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.

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 06. January 2006, 18:34 »
gibt es keine möglichkeit grub auf diesem image zu installieren?

ehrlich gesagt, will ich nicht auf realer hardware arbeiten.
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 06. January 2006, 20:31 »
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...
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 06. January 2006, 20:44 »
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.

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 06. January 2006, 22:19 »
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)".
Agieren statt Konsumieren!

bauerb

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 07. January 2006, 15:52 »
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
--
Bauer Bernd - Student of Telematik - TU Graz
I love my editor - it's improved and it's free - VIM

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 07. January 2006, 16:12 »
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 ;-).
Agieren statt Konsumieren!

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 07. January 2006, 18:00 »
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 ;-)
Agieren statt Konsumieren!

 

Einloggen