Re: Bootsector nach Partitionierung herstellen

David Haller <[email protected]> Wed, 6 Apr 2011 18:17:49 +0200
Newsgroups gmane.linux.suse.programming
Organization What?
Message-ID <[email protected]>
Hallo,

Am Wed, 06 Apr 2011, Thomas Moritz schrieb:
>...was aber bedeutet, dass eine Linuxkiste mit 'grub' verfuegbar ist!
>Hier ist das kein Problem, aber die Kiste will ich in Kuerze abgeben=20
>und nicht gleich wieder auf dem Tisch haben, nur weil das System zu=20
>Clonen ist.
>Ich sehe 2 Moeglichkeiten, wobei mir die Variante (2) guenstiger=20
>erscheint:
>
>1) Ich liefere einen USB-Boot-Stick mit einer Mini-Suse dazu
>   (hab ich mit Suse-Studio mal gebaut)
>   Dann kann ich grub per chroot installieren lassen! OhhOhh...
>
>2) Ich mache ein 256MB _bootfaehiges_ Image fertig
>   sdd1 -> 200MB  -> System (200MB, falls spaeter noch was rein muss)
>   sdd2 -> restMB -> vfat
>   dd if=3D/dev/sdd of=3D/cf.img bs=3D32k
>   Egal auf welche Karte das cf.img nun raufgebuegelt wird, wird es
>   auch booten!=20
>   Um den restlichen Platz auf der Karte zugaenglich zu machen,
>   ist lediglich die vfat-Partition (ja nach Kartengroesse) zu
>   vergroessern. Leider kann das 'resize2fs' nicht.
>
>_Idee_ zum Vergroessern (ungetestet!):
>[Ich hoffe, ich habe die fdisk-Tasten soweit im Kopf :-) ]
>
>**************************************************************
>[...]
>mydev=3D$1 		#nur zur Demo
>umount /mnt/$mydev2
>fdisk /dev/$mydev <<EOF >/dev/null 2>&1
>d
>2
>n
>p
>2
>t
>b
>w
>EOF

Ich glaub nicht da=DF das so geht (ausserdem fehlt der FS-Typ).

F=FCr sowas nimm sfdisk oder parted.

>mkfs.msdos -F32 /dev/$mydev2
>tune2fs ...		#fsck Zyclen setzen usw.
>[...]
>mount /dev/$mydev2  	#steht ja bereits in der fstab vom img
>**************************************************************
>
>Gibt es Einwaende oder Verbesserungen? Vielen Dank!

Gegenvorschlag, der =E4hnlich dem ist, was du jetzt hast: Schreib GRUB
in den BR der Linux-Partition, dann kannst du den komplett mit dd mir
ins Image der _Partition_ holen:

    dd if=3D/dev/sdd1 of=3Dcf-linux-root.img bs=3D8M

Dann kannst du den generischen MBR-Code, der einfach die aktive
Partition startet in den MBR schreiben (nur die ersten 446 Bytes).

Und wenn du die Partitionstabelle im MBR (nur die f=FCr die
Linux-Partition) in den MBR schreibst w=E4re es sogar Partitioniert,
sinnvoller ist aber evtl. auch die Linux-Partition per sfdisk/parted
anzulegen.

Die FAT32 Partition legst du dann einfach mit sfdisk/parted an.

Sei /dev/sdk die leere CF-Karte (nur damit es jetzt nicht mit vorigen
Angaben kollidiert) und in der Annahme, da=DF=A0die Linux-Partition exakt
200M gro=DF ist:

$ /sbin/sfdisk -n -uS /dev/sdk <<'EOF'
64,409600,83,*
409664,,0C
EOF
$ dd if=3Dcf-linux-root.img of=3D/dev/sdk1 bs=3D8M count=3D25
$ dd if=3D/usr/lib/boot/master-boot-code of=3D/dev/sdk bs=3D1 count=3D446
$ mkfs.msdos -F32 /dev/sdk2
$ tune2fs -c 64 /dev/sdk1

Evtl. mu=DFt du noch K=F6pfe/Sektore per '-H <HEADS> -S SECTORS' angeben,
zumindest bei nem Image braucht's das. Ich hab das mal getestet:

$ ls -l test.img
-rw-r--r-- 1 dh dh 1073741824 2011-04-06 17:58 test.img
$ /sbin/sfdisk -f -H16 -S 64 -uS test.img <<'EOF'
64,409600,83,*
409664,,0C
EOF

Warning: test.img is not a block device
Disk test.img: cannot get geometry
[..]
BLKRRPART: Inappropriate ioctl for device
$ /sbin/sfdisk -n -uS -l test.img=20
Disk test.img: cannot get geometry

Disk test.img: 130 cylinders, 255 heads, 63 sectors/track
Warning: The partition table looks like it was made
  for C/H/S=3D*/16/0 (instead of 130/255/63).
For this listing I'll assume that geometry.
Units =3D sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
test.img1   *        64    409663     409600  83  Linux
test.img2        409664   2097151    1687488   c  W95 FAT32 (LBA)
test.img3             0         -          0   0  Empty
test.img4             0         -          0   0  Empty
$ dd if=3Dtest.img count=3D1 | od -Ax -tx1z
1+0 records in
1+0 records out
512 bytes (512 B) copied, 3.1751e-05 s, 16.1 MB/s
000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
*
0001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01  >................<
0001c0 01 00 83 0f c0 ff 40 00 00 00 00 40 06 00 00 01  >....=C0=FF@....@..=
=2E.<
0001d0 41 90 0c 0f c0 ff 40 40 06 00 c0 bf 19 00 00 00  >A...=C0=FF@@..=C0=
=BF....<
0001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  >..............U=AA<
000200

Wenn du die Sektoren addierst landest du korrekt bei exakt dem 1G ;)

$ echo 'scale=3D5;(1687488+409600+64)*512' | bc
1073741824

Das mit dem Beginn bei 64 Sektoren, weil ich mal annehmen, da=DF die
CF-Karte mit Bl=F6cken hantiert, die gr=F6=DFer als 512 Bytes sind (4K?
32K?).

Ansonsten kannst du bei sfdisk auch mit anderen "units" arbeiten, guck
dir auch an, was die Karte als "Geometrie" meldet (wenn =FCberhaupt).

Achso, die Eingabe f=FCr sfdisk:

Generell: START,LENGTH,FSTYPE,ACTIVE [C,H,S] [C,H,S]

Da ich per -uS Sektoren als Unit gew=E4hlt habe:

64,409600,83,*  ### Start mit Sektor 64, L=E4nge 409600 Sektoren, also
                ### exakt 200M, Typ 0x83, aktiv

409664,,0C      ### Start bei Sektor 409664, soviel noch frei
                ### ist, Typ FAT32-LBA, inaktiv. Eigentlich m=FC=DFte man
                ### auch den ersten Wert weglassen k=F6nnen, das wird
                ### dann als "ab n=E4chstem unbelegten" interpretiert,
                ### was beim Image hier aber nicht klappt, das macht
                ### dann 1-63 draus, erst die dritte wird dann "der
                ### Rest".

Ne andere Variante w=E4re z.B.:

$ /sbin/sfdisk -n -uM /dev/sdk <<'EOF'
1,200,83,*
,,0C
EOF

Damit w=FCrde halt am Anfang einiges mehr verschwendet.

HTH,
-dnh

--=20
> (void *)'\0'
Didn't you see the sign?  It said
   VOID WHERE PROHIBITED
Don't tell me you can't C.         -- the Internet Oracle [#1307-01]