Linux / GParted kann die Partitionstabelle sehen, dd bs = 512 count = 1 jedoch nicht

8

Ich habe eine MBR-formatierte SD-Karte und wenn ich eine Verbindung zu einem Linux-Computer (xubuntu 12.04) herstelle, kann diese eine Partition bereitstellen und das Dateisystem analysieren (wie auch GParted). Wenn ich jedoch versuche, den MBR mit dd vom Gerät zu lesen, erhalte ich eine Reihe von falschen Daten.

Könnte jemand etwas Licht ins Dunkel bringen, wie Linux / GParted den MBR lesen und verstehen kann, wenn dd den MBR nicht lesen kann? Verwenden sie unterschiedliche Methoden, um an die Daten zu gelangen? IE nicht öffnen (), lesen ()

Der DD-Befehl lautet:

dd if=/dev/sdb of=mbr.bin bs=512 count=1

DD-Ausgabe ist:

1+0 records in
1+0 records out
512 bytes transferred in 0.000786 secs (651345 bytes/sec)

mbr.bin dump mit hexdump -C mbr.binist:

00000000  04 16 41 53 4d 49 2d 53  44 03 00 00 00 00 16 f1  |..ASMI-SD.......|
00000010  00 7f 00 32 1f 5b 80 00  36 db bf bf 96 c0 00 01  |...2.[..6.......|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  6f 00 00 10 00 00 02 2e  00 00 00 00 00 00 00 00  |o...............|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
Tom Booth
quelle
Welche Ausgabe gibt ddes?
QDII
Was meinst du mit dd kann die Daten nicht lesen ?
QDII
Die ersten 512 Bytes sollten ein MBR sein, der eine Partitionstabelle enthält, aber das ist eindeutig nicht der Fall
Tom Booth
hmm. Vielleicht, weil du keinen benutzt? Die Magie bei GPT ist die Partitionstabelle, die den MBR ersetzt (aber der MBR kann beibehalten werden, damit Bootloader, die erwarten, dass einer weiterarbeitet).
QDII
1
Was ist der Ausgang fdisk -lu /dev/sdb, gdisk -l /dev/sdbund grep sdb /proc/partitions?
Stéphane Chazelas

Antworten:

2

Die Karte verfügt nicht über einen Master Boot Record (MBR). Wenn es Ihren Hexdump gegeben hätte, hätten Sie mindestens einen Partitionseintrag am Offset 0x1C0und 55aaam Ende erhalten.

Nicht alle Partitionstabellen legen Daten in den ersten 512 Bytes an. Die falschen Daten, die Sie sehen, sind das SID- und CSD-Register der SD-Karte. Aber wie es aussieht, sind es nicht die richtigen Daten für die Karte (es sei denn, es ist ein altes 1 MiB 2001-Modell.)

Die ersten 16 Bytes sind:

CID Register:
----------------------------------------------------------------------------
Manufacturer ID       (MID): 04               => (Transcend)
OEM/Application ID    (OID): 16 41            =  ?A
Product name          (PNM): 53 4d 49 2d 53   =  SMI-S
Product revision      (PRV): 44               =  0100 0100 => 4.4
Product serial number (PSN): 03 00 00 00
reserved               (-) : 00 >> 4          = 0000b
Manufacturing date    (MDT): (00 & 0x0f)|0x16 = 0001b,0110b => 2000+1,6=> Jun 2001
CRC7 checksum         (CRC): 1f >> 1          = 120
always 1               (1) : 1f & 1           = 1

Nächste 16 Bytes (zumindest ein Teil davon):

CSD Register:
----------------------------------------------------------------------------
CSD Structure        (CSD_STRUCTURE): 00 >> 6  = 00b => CSD Version 1.0
reserved                         (-): 00 & 3f  = 00 0000b
Data read access time 1       (TAAC): 7f = 1111b => time val 8.0, 111b => 7=10ms
Data read access time 2       (NSAC): 00
Max. data transfer rate (TRAN_SPEED): 32 = 0110,010 time val 2.5, 2=10Mbit/s 25MHz
Card command classes           (CCC): 1f << 4 | 5b >> 4 = 0x1f5

...
Device size (C_SIZE) : (0x80 & 0x03) << 0xa | 00h | 36 >> 6 : 0

Max. read  current @VDD min (VDD_R_CURR_MIN) : 110 => 60mA
Max. read  current @VDD max (VDD_R_CURR_MAX) : 110 => 80mA
Max. write current @VDD min (VDD_W_CURR_MIN) : 110 => 60mA
Max. write current @VDD max (VDD_W_CURR_MAX) : 110 => 80mA
Device size multiplier         (C_SIZE_MULT) : 111 => 2^(7 + 2) = 512
Erase single block enable     (ERASE_BLK_EN) : 0
Erase sector size              (SECTOR_SIZE) : 1111111 => 127 + 1 = 128
Write protect group size       (WP_GRP_SIZE) : 0111111 =>  63 + 1 = 64

MULT      = 2^(C_SIZE_MULT + 2)  = 2^(7 + 2) = 512
BLOCKNR   = (C_SIZE + 1) * MULT  = 1 * 512   = 512
BLOCK_LEN = 2^READ_BL_LEN        = 2^11      = 2048

memory capacity = 
BLOCKNR * BLOCK_LEN = 512 * 2048 = 1048576 bytes = 1024 KiB = 1 MiB

Außerdem ist die CRC7-Prüfung auf CSD-Register falsch. Es könnten alte Daten sein, die aus einem Zeitvertreib stammen.

Diese Register und mehr können durch verschiedene Befehle direkt von der Karte abgefragt werden. Dies erfolgt durch Modultreiber, Karten-Hubs usw.


Es wäre interessant zu sehen, was Sie durch die Befehle von Stephane Chazelas, slm usw. finden.

Runium
quelle
1

Ich würde versuchen, den sfdiskBefehl im Gegensatz zu zu verwenden dd. Zum Beispiel:

$ sudo sfdisk -d /dev/sda > /tmp/mbr_using_sfdisk.bin
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.

Wenn mbr_using_sfdisk.binSie sich jetzt ansehen , sehen Sie, wonach Sie suchen:

$ more /tmp/mbr_using_sfdisk.bin
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=     2048, size=  2457600, Id= 7, bootable
/dev/sda2 : start=  2459648, size=314765312, Id= 7
/dev/sda3 : start=956291072, size= 20480000, Id= 7
/dev/sda4 : start=317224960, size=639066112, Id= 5
/dev/sda5 : start=317227008, size=  1024000, Id=83
/dev/sda6 : start=318253056, size=638038016, Id=8e

Warum kann ich die Partitionstabelle nicht mit sehen dd?

Ich bin nicht ganz sicher , warum , aber ich habe über diesen Trick gekommen , dass zeigt, wie die Partitionstabellen in Ihrem sehen , mbr.binmit dem fileBefehl.

Zum Beispiel:

$ sudo dd if=/dev/sda bs=512 count=1 of=mbr.bin
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000184924 s, 2.8 MB/s

$ file mbr.bin 
mbr.bin: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, boot drive 0x80, 1st sector stage2 0x12f0c26a, GRUB version 0.94; 
partition 1: ID=0x7, active, starthead 32, startsector 2048, 2457600 sectors; 
partition 2: ID=0x7, starthead 162, startsector 2459648, 314765312 sectors;
partition 3: ID=0x7, starthead 239, startsector 956291072, 20480000 sectors;
partition 4: ID=0x5, starthead 239, startsector 317224960, 639066112 sectors, code offset 0x48

Verweise

slm
quelle
Warum sollte jemand hexdumpfür die (Klartext-) Ausgabe von verwenden sfdisk -d /dev/sda?
Hauke ​​Laging
Das ist ein großartiger Punkt, ich hatte nicht bemerkt, dass es einfacher Text war. Ich werde es in der Antwort 8-) beheben.
slm