Mailinglist Archive: opensuse-programming-de (55 mails)

< Previous Next >
Re: [opensuse-programming-de] Bootsector nach Partitionierung herstellen
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
und nicht gleich wieder auf dem Tisch haben, nur weil das System zu
Clonen ist.
Ich sehe 2 Moeglichkeiten, wobei mir die Variante (2) guenstiger
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=/dev/sdd of=/cf.img bs=32k
Egal auf welche Karte das cf.img nun raufgebuegelt wird, wird es
auch booten!
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=$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ß das so geht (ausserdem fehlt der FS-Typ).

Für 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 ähnlich 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=/dev/sdd1 of=cf-linux-root.img bs=8M

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ür die
Linux-Partition) in den MBR schreibst wäre 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ß die Linux-Partition exakt
200M groß ist:

$ /sbin/sfdisk -n -uS /dev/sdk <<'EOF'
64,409600,83,*
409664,,0C
EOF
$ dd if=cf-linux-root.img of=/dev/sdk1 bs=8M count=25
$ dd if=/usr/lib/boot/master-boot-code of=/dev/sdk bs=1 count=446
$ mkfs.msdos -F32 /dev/sdk2
$ tune2fs -c 64 /dev/sdk1

Evtl. mußt du noch Köpfe/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
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=*/16/0 (instead of 130/255/63).
For this listing I'll assume that geometry.
Units = 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=test.img count=1 | 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 >....Àÿ@....@....<
0001d0 41 90 0c 0f c0 ff 40 40 06 00 c0 bf 19 00 00 00 >A...Àÿ@@..À¿....<
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ª<
000200

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

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

Das mit dem Beginn bei 64 Sektoren, weil ich mal annehmen, daß die
CF-Karte mit Blöcken hantiert, die größer 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 überhaupt).

Achso, die Eingabe für sfdisk:

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

Da ich per -uS Sektoren als Unit gewählt habe:

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

409664,,0C ### Start bei Sektor 409664, soviel noch frei
### ist, Typ FAT32-LBA, inaktiv. Eigentlich müßte man
### auch den ersten Wert weglassen können, das wird
### dann als "ab nächstem 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äre z.B.:

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

Damit würde halt am Anfang einiges mehr verschwendet.

HTH,
-dnh

--
(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]
--
To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@xxxxxxxxxxxx
For additional commands, e-mail: opensuse-programming-de+help@xxxxxxxxxxxx

< Previous Next >