Re: Bootsector nach Partitionierung herstellen

David Haller <[email protected]> Tue, 5 Apr 2011 21:49:35 +0200
Newsgroups gmane.linux.suse.programming
Organization What?
Message-ID <[email protected]>
Hallo,

Am Tue, 05 Apr 2011, Thomas Moritz schrieb:
>Am Dienstag, 5. April 2011 11:31:21 schrieb David Haller:
>> Am Tue, 05 Apr 2011, Thomas Moritz schrieb:
>> >Am Dienstag, 5. April 2011 07:38:13 schrieb David Haller:
>> >> Das was du angeh=E4ngt hast ist jew. ein generischer BR (der die
>> >> aktive Partition startet, jedenfalls kein Grub), der 2te Sektor
>> >> ist der zweite Teil eines Grubs.
>> >
>> >Ich klemme nun noch einmal 1024 hinten ran. Diese sind von der
>> >jetzt funktionierenden CF-Card. Hier kann ich ausser der
>> >Partitionstabelle keinen Unterschied zu dem gestrigen Versuch
>> >feststellen. Nur eben, dass diese CF jetzt rennt!
>>=20
>> Naja, kommt halt drauf an, was im ersten Sektor der aktiven
>> Partition steckt ;) Ist jetzt ne Linux-Partition:
>
>Ich zitiere mal Deine letzte Mail:
>Ab 0x01be beginnt die Partitionstabelle, hier ab dem 80 20 21 00 83
>wobei das 83 der FS-Typ der ersten Partition ist, die bei Sektor 3F
>(=3D63) beginnt.
>
>OK, also auch eine Linux-Partition. Alles andere haette mich auch=20
>verwundert! Ich hatte ja die zweite CF-Card neu Partitioniert und=20
>Formatiert:
>1.Partition	1GB	Linux/ext4
>2.Partition	Rest	Windows/mkfs.msdos -F32

Jep, das passt. =DCbrigens, das "aktiv"-Flag ist das erste Byte eines
Partitionseintrags, wenn 0x00 ist nix, wenn 0x80 ist die Partition
aktiv.

>> $ od -Ax -tx1z /dev/shm/dh/4gb_sdd.img | less
>> 0001be                                           80 20=20
>> >........=C7f?U=CF=C9. < 0001c0 21 00 83 0d 0a 83 00 08 00 00 00 18 20
>> 00        >!........... ...< ^^ FS-Typ Byte
>>=20
>> und ne FAT32-LBA Partition:
>>=20
>> 0001ce                                           00 0d=20
>> >!........... ...< 0001d0 0b 83 0c fa 54 e6 00 20 20 00 00 40 57
>> 00        >...=FAT=E6.  ..@W...< ^^ FS-Typ Byte
>>=20
>> Der generische/DOS BR interessiert sich genau gar nicht f=FCr den
>> Folgesektor mit dem Grub-Rest, der kn=FCppelt einfach den ersten
>> Sektor der aktiven Partition in den Speicher und startet den darin
>> befindlichen Code. Hat man z.B. GRUB in die Linux-Root-Partition
>> installiert, dann startet eben der.
>
>Da ich von der "lauffaehigen" Karte (grub in Linux-Root-Partition) die=20
>ersten 446B nach /dev/sdd1 (neue CF) kopiert hatte, sollte doch grub=20
>gestartet werden koennen.

Nein! Flasch! GRUB braucht mind. 2 Sektoren (siehe Sektor 2 der
CF-Karte, da steckt auch noch Grub drin, siehe meine vorigen Mails).
Den ersten Sektor von GRUB erkennst du an dem String:

# od -Ax -tx1z /boot/grub/stage1 |less
000180 fe 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64  >=FEGRUB .Geom.Hard<
000190 20 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f  > Disk.Read. Erro<

Bei ner HDD-Installation fehlt da aber dann Stage 1.5:

# od -Ax -tx1z /boot/grub/e2fs_stage1_5 |less
000100 00 eb fe 4c 6f 61 64 69 6e 67 20 73 74 61 67 65  >.=EB=FELoading sta=
ge<
000110 31 2e 35 00 2e 00 0d 0a 00 47 65 6f 6d 00 52 65  >1.5......Geom.Re<
000120 61 64 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd  >ad. Error.=BB..=B4=
=2E=CD<

>Den MBR (446B) hatte ich auch nach /dev/sdd (neue CF) kopiert!

Ok, also den generischen Boot-Code, das war korrekt.

>Was war nun eigentlich an meiner beschriebenen Vorgehensweise falsch?

Dem Grub fehlt stage1.5. Deswegen gibt's:

    grub-install.unsupported /dev/sdd

(aber s.u.)!

>*lauffaehige CF-Card (nicht eingebunden)
>-MBR  		#dd if=3D/dev/sdd of=3D/hier/mbr.img bs=3D446 count=3D1

ok, (generischen) Bootcode ausgelesen

>-Bootsector /	#dd if=3D/dev/sdd1 of=3D/hier/bsl.img bs=3D446 count=3D1

Hiermit liest du max. stage1 vom Grub aus.

>*CF-Card einbinden
>-Daten		#rsync -avxXHAS /media/disk/ /hier/hin/
>
>**neue CF-Card (nicht eingebunden)
>-fdisk (Partitionierung s.oben)
>-mkfs.ext4 /dev/sdd1
>-mkfs.msdos -F32 /dev/sdd2
>-dd if=3D/hier/mbr.img of=3D/dev/sdd bs=3D446 count=3D1

ok, generischen Bootcode in den MBR

>-dd if=3D/hier/bsl.img of=3D/dev/sdd1 bs=3D446 count=3D1

Hier fehlt dem Grub dann stage1.5 und vor allem fehlt dem dann, wo er
seine menu.lst und stage2 findet. Deswegen: grub-install (aber s.u.)!.

>**/dev/sdd1 einbinden
>-rsync -avxXHAS /hier/hin/ /media/disk/
>
>Beide Partitionen liessen sich problemlos mounten!
>Warum wurde grub beim Systemstart im PC104 nicht gefunden?
>DISK BOOT FAILURE...

s.o.

>Ich muss das Szenario noch 2x auf verschieden-grossen CFs durchfuehren=20
>und werde dabei den HexDump beobachten! Bin gespannt, wann genau da=20
>was schief laeuft.

Lies auch mal 'info grub' ;) Da steht genau drin, was wie gebooted
wird. Und -- wenn du nicht per "aktiver Partition" zur FAT umschalten
willst: schreib GRUB einfach in den MBR.

Da du ja nicht das aktuelle System (dessen menu.lst) verwenden willst
mu=DFt du entweder ein chroot in die gemountede CF (sdd1) machen, oder
GRUB ohne 'grub-install' manuell dort installieren (IIRC):

# mount /dev/sdd1 /mnt/sdd1
# mount -o bind /proc /mnt/sdd1/proc
# mount -o bind /dev /mnt/sdd1/sys
# mount -o bind /sys /mnt/sdd1/dev
# chroot /mnt/sdd1
# grub
grub> setup --stage2=3D/boot/grub/stage2 (hd0) (hd0,0)
grub> quit

grub> help setup =20
setup: setup [--prefix=3DDIR] [--stage2=3DSTAGE2_FILE] [--force-lba[=3Doff]=
] INSTALL_
DEVICE [IMAGE_DEVICE]
    Set up the installation of GRUB automatically. This command uses
    the more flexible command "install" in the backend and installs
    GRUB into the device INSTALL_DEVICE. If IMAGE_DEVICE is
    specified, then find the GRUB images in the device IMAGE_DEVICE,
    otherwise use the current "root device", which can be set by the
    command "root".

-> Das "IMAGE_DEVICE" ist, wo GRUB dann stage2 und die menu.lst sucht.

Du kannst nat=FCrlich auch weiter in die /-Partition installieren:

grub> setup --stage2=3D/boot/grub/stage2 (hd0,0) (hd0,0)

Wobei da die /boot/grub/device.map den passenden Eintrag haben mu=DF,
da=DF (hd0) =3D=3D CF-Karte.

Wenn's dann klemmt mu=DFt du gucken, als was das device im Grub von
CF-gebootet auftaucht (da hilft dann z.B. 'find /boot/grub/menu.lst'
am grub-Prompt.

HTH,
-dnh

--=20
It is traditional, when loading wire trolleys, to put the most fragile
items at the bottom.                    -- Terry Pratchett, Reaper Man